FlatLanguage.cs 10.5 KB
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace Asa.Theme
{
    [DefaultProperty("LangDir")]
    [DefaultEvent("LanguageChanged")]
    public partial class FlatLanguage : FlatBase
    {
        private Language _lang = new Language();
        private string _langPath;
        private FlatForm[] _frm;
        private int _index;

        public event Event.StringEvent LanguageChanged;

        private GraphicsPath _borderPath;       //边框路径
        private GraphicsPath _leftPath;         //左边按钮边框路径
        private GraphicsPath _rightPath;        //右边按钮边框路径
        private RectangleF _leftRect;           //左边按钮矩形
        private RectangleF _rightRect;          //右边按钮矩形
        private RectangleF _leftStrRect;        //左边文本矩形
        private RectangleF _rightStrRect;       //右边文本矩形
        private string _leftStr = "LEFT";       //左边文本
        private string _rightStr = "RIGHT";     //右边文本
        private bool _leftOver;                 //左边按钮经过
        private bool _rightOver;                //右边按钮经过
        private bool _leftDown;                 //左边按钮按下
        private bool _rightDown;                //右边按钮按下

        private const int RADIUS = 5;             //半径
        private const int DIAMETER = RADIUS * 2;  //直径
        private const int SPACE = 5;              //间隔

        public FlatLanguage()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 语言文件目录
        /// </summary>
        public string LangDir
        {
            set
            {
                _langPath = value;
                if (_langPath != null)
                {
                    _lang.Load(value);
                    string[] s = _lang.Name;
                    if (s.Length == 2)
                    {
                        _leftStr = s[0];
                        _rightStr = s[1];
                    }
                    CalcSize();
                    Refresh();
                }
            }
            get
            {
                return _langPath;
            }
        }








        /// <summary>
        /// 关联到窗体
        /// </summary>
        /// <param name="frm"></param>
        public void Link(params FlatForm[] frm)
        {
            _frm = frm;
        }

        /// <summary>
        /// 加载语言
        /// </summary>
        /// <param name="s"></param>
        public void LoadLanguage(string s)
        {
            int n = Array.FindIndex(_lang.Name, ss => ss == s);
            if (n == 0)
            {
                _leftDown = true;
                _rightDown = false;
                _index = 0;
                Refresh();
                SetLang(0);
            }
            else if (n == 1)
            {
                _leftDown = false;
                _rightDown = true;
                _index = 1;
                Refresh();
                SetLang(1);
            }
        }

        /// <summary>
        /// 设置语言
        /// </summary>
        /// <param name="frm"></param>
        public void SetLanguage(FlatForm frm)
        {
            _lang.Shift(_index, frm);
        }




        protected override void CalcSize()
        {
            //   1       2
            //     -----
            //    |     |
            //     -----
            //   3       4

            float x1, x2, y1, y2;

            //边框路径
            x1 = Width - DIAMETER - 1;
            y1 = Height - DIAMETER - 1;
            RectangleF rect1 = new RectangleF(0, 0, DIAMETER, DIAMETER);
            RectangleF rect2 = new RectangleF(x1, 0, DIAMETER, DIAMETER);
            RectangleF rect3 = new RectangleF(0, y1, DIAMETER, DIAMETER);
            RectangleF rect4 = new RectangleF(x1, y1, DIAMETER, DIAMETER);
            _borderPath = new GraphicsPath();
            _borderPath.AddArc(rect1, 180, 90);
            _borderPath.AddLine(rect1.X + RADIUS, rect1.Y, rect2.X + RADIUS, rect2.Y);
            _borderPath.AddArc(rect2, 270, 90);
            _borderPath.AddLine(rect2.Right, rect2.Y + RADIUS, rect4.Right, rect4.Y + RADIUS);
            _borderPath.AddArc(rect4, 0, 90);
            _borderPath.AddLine(rect4.X + RADIUS, rect4.Bottom, rect3.X + RADIUS, rect3.Bottom);
            _borderPath.AddArc(rect3, 90, 90);
            _borderPath.AddLine(rect3.X, rect3.Y + RADIUS, rect1.X, rect1.Y + RADIUS);

            //左边按钮路径
            x1 = (Width - SPACE * 3) / 2f + SPACE - DIAMETER - 1;
            rect1 = new RectangleF(SPACE, SPACE, DIAMETER, DIAMETER);
            rect2 = new RectangleF(x1, SPACE, DIAMETER, DIAMETER);
            rect3 = new RectangleF(SPACE, y1 - SPACE, DIAMETER, DIAMETER);
            rect4 = new RectangleF(x1, y1 - SPACE, DIAMETER, DIAMETER);
            _leftRect = new RectangleF(rect1.X, rect1.Y, rect2.Right - rect1.X, rect3.Bottom - rect1.Y);
            _leftPath = new GraphicsPath();
            _leftPath.AddArc(rect1, 180, 90);
            _leftPath.AddLine(rect1.X + RADIUS, rect1.Y, rect2.X + RADIUS, rect2.Y);
            _leftPath.AddArc(rect2, 270, 90);
            _leftPath.AddLine(rect2.Right, rect2.Y + RADIUS, rect4.Right, rect4.Y + RADIUS);
            _leftPath.AddArc(rect4, 0, 90);
            _leftPath.AddLine(rect4.X + RADIUS, rect4.Bottom, rect3.X + RADIUS, rect3.Bottom);
            _leftPath.AddArc(rect3, 90, 90);
            _leftPath.AddLine(rect3.X, rect3.Y + RADIUS, rect1.X, rect1.Y + RADIUS);

            //左边文字区域
            SizeF sf = CreateGraphics().MeasureString(_leftStr, Common.FONT_SONG_9);
            x2 = SPACE + (rect2.Right - rect1.X - sf.Width) / 2f;
            y2 = (Height - sf.Height) / 2f;
            _leftStrRect = new RectangleF(x2, y2, sf.Width, sf.Height);

            //右边按钮路径
            x1 += (DIAMETER + SPACE + 1);
            x2 = Width - SPACE - DIAMETER - 1;
            rect1 = new RectangleF(x1, SPACE, DIAMETER, DIAMETER);
            rect2 = new RectangleF(x2, SPACE, DIAMETER, DIAMETER);
            rect3 = new RectangleF(x1, y1 - SPACE, DIAMETER, DIAMETER);
            rect4 = new RectangleF(x2, y1 - SPACE, DIAMETER, DIAMETER);
            _rightRect = new RectangleF(rect1.X, rect1.Y, rect2.Right - rect1.X, rect3.Bottom - rect1.Y);
            _rightPath = new GraphicsPath();
            _rightPath.AddArc(rect1, 180, 90);
            _rightPath.AddLine(rect1.X + RADIUS, rect1.Y, rect2.X + RADIUS, rect2.Y);
            _rightPath.AddArc(rect2, 270, 90);
            _rightPath.AddLine(rect2.Right, rect2.Y + RADIUS, rect4.Right, rect4.Y + RADIUS);
            _rightPath.AddArc(rect4, 0, 90);
            _rightPath.AddLine(rect4.X + RADIUS, rect4.Bottom, rect3.X + RADIUS, rect3.Bottom);
            _rightPath.AddArc(rect3, 90, 90);
            _rightPath.AddLine(rect3.X, rect3.Y + RADIUS, rect1.X, rect1.Y + RADIUS);

            //右边文字区域
            sf = CreateGraphics().MeasureString(_rightStr, Common.FONT_SONG_9);
            x2 = x1 + (rect2.Right - x1 - sf.Width) / 2f;
            y2 = (Height - sf.Height) / 2f;
            _rightStrRect = new RectangleF(x2, y2, sf.Width, sf.Height);

        }

        private void SetLang(int idx)
        {
            if (_frm == null) return;
            _lang.Shift(idx, _frm);
        }

        private void FlatLanguage_MouseDown(object sender, MouseEventArgs e)
        {
            if (_leftOver)
            {
                if (!_leftDown)
                {
                    _leftDown = true;
                    _rightDown = false;
                    Refresh();
                    SetLang(0);
                    _index = 0;
                    LanguageChanged?.Invoke(this, _lang.Name[0]);
                }
            }
            else if (_rightOver)
            {
                if (!_rightDown)
                {
                    _leftDown = false;
                    _rightDown = true;
                    Refresh();
                    SetLang(1);
                    _index = 1;
                    LanguageChanged?.Invoke(this, _lang.Name[1]);
                }
            }
        }

        private void FlatLanguage_MouseMove(object sender, MouseEventArgs e)
        {
            bool bb = false;

            bool bln = _leftRect.Contains(e.Location);
            if (bln != _leftOver)
            {
                _leftOver = bln;
                bb = true;
            }

            bln = _rightRect.Contains(e.Location);
            if (bln != _rightOver)
            {
                _rightOver = bln;
                bb = true;
            }

            if (bb) Refresh();
        }

        private void FlatLanguage_MouseUp(object sender, MouseEventArgs e)
        {

        }

        private void FlatLanguage_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
            e.Graphics.CompositingQuality = CompositingQuality.HighQuality;
            e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;

            e.Graphics.Clear(Common.BACK_COLOR);  //背景
            if (Inside)
                e.Graphics.DrawPath(Common.BLUE_PEN, _borderPath);    //进入边框
            else
                e.Graphics.DrawPath(Common.BORDER_PEN, _borderPath);  //离开边框

            if (_leftDown)
            {
                e.Graphics.FillPath(Common.BLUE_BRUSH, _leftPath);
            }
            else if (_leftOver)
            {
                e.Graphics.FillPath(Common.OVER_BRUSH, _leftPath);
                e.Graphics.DrawPath(Common.BORDER_PEN, _leftPath);
            }
            else
            {
                e.Graphics.DrawPath(Common.BORDER_PEN, _leftPath);
            }

            if (_rightDown)
            {
                e.Graphics.FillPath(Common.BLUE_BRUSH, _rightPath);
            }
            else if (_rightOver)
            {
                e.Graphics.FillPath(Common.OVER_BRUSH, _rightPath);
                e.Graphics.DrawPath(Common.BORDER_PEN, _rightPath);
            }
            else
            {
                e.Graphics.DrawPath(Common.BORDER_PEN, _rightPath);
            }

            e.Graphics.DrawString(_leftStr, Common.FONT_SONG_9, Common.FORE_BRUSH, _leftStrRect);
            e.Graphics.DrawString(_rightStr, Common.FONT_SONG_9, Common.FORE_BRUSH, _rightStrRect);
        }


    }
}