FlatForm.cs 11.0 KB
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace Asa.Theme
{
    public partial class FlatForm : Form
    {
        private bool _center;
        private bool _lost = false;
        private int _titleHeight;
        private Font _font = new Font("宋体", 9f);
        private List<FlatBase> _enter = new List<FlatBase>();
        private FlatBase _show;
        private Rectangle _borderRect;  //边框
        private Rectangle _titleRect;   //标题栏
        private Rectangle _closeRect;   //关闭按钮
        private Rectangle _minRect;     //最小化
        private RectangleF _textRect;   //标题文本
        private bool _closeDown;        //关闭按钮按下
        private bool _minDown;          //最小化按下
        private bool _closeOver;        //关闭按钮经过
        private bool _minOver;          //最小化经过
        private bool _minimized;
        private Point[] _closeIcon;
        private Point[] _minIcon;

        private const int BORDER_W = 2;                 //边框宽度
        private readonly Pen BORDER_LOST = new Pen(Common.BORDER_COLOR, BORDER_W);
        private readonly SolidBrush TITLE_LOST = new SolidBrush(Common.BORDER_COLOR);
        
        public FlatForm()
        {
            InitializeComponent();

            TitleHeight = 36;
            Padding = new Padding(6, 6 + TitleHeight, 6, 6);
            TitleHeight = 36;
            MoveForm = true;
            Minimized = true;
            CalcSize();
        }



        [Browsable(true), Category(""), Description("标题文本"), DefaultValue("")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public override string Text
        {
            set
            {
                base.Text = value;
                CalcSize();
                Refresh();
            }
            get
            {
                return base.Text;
            }
        }

        [Browsable(true), Category(""), Description("标题文本是否居中显示"), DefaultValue(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public bool TextCenter
        {
            set
            {
                _center = value;
                CalcSize();
                Refresh();
            }
            get
            {
                return _center;
            }
        }

        [Browsable(true), Category(""), Description("窗口是否最大化"), DefaultValue(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public bool Maximized { set; get; }

        [Browsable(true), Category(""), Description("是否可以移动窗口"), DefaultValue(true)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public bool MoveForm { set; get; }

        [Browsable(true), Category(""), Description("是否显示最小化按钮"), DefaultValue(true)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public bool Minimized
        {
            set
            {
                _minimized = value;
                CalcSize();
                Refresh();
            }
            get
            {
                return _minimized;
            }
        }

        [Browsable(true), Category(""), Description("标题栏高度"), DefaultValue(36)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public int TitleHeight
        {
            set
            {
                _titleHeight = value;
                Padding = new Padding(6, 6 + TitleHeight, 6, 6);
                CalcSize();
                Refresh();
            }
            get
            {
                return _titleHeight;
            }
        }

        [Browsable(true), Category(""), Description("标题栏文本字体")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public Font TitleFont
        {
            get { return _font; }
            set
            {
                _font = value;
                CalcSize();
                Refresh();
            }
        }

        /// <summary>
        /// 对话框的语言
        /// </summary>
        [Browsable(false)]
        public Dictionary<string, string> DialogLang { set; get; }








        [Browsable(false)]
        public override Font Font { get => base.Font; set => base.Font = value; }

        [Browsable(false)]
        public new FormWindowState WindowState { set => base.WindowState = value; get => base.WindowState; }

        [Browsable(false)]
        public new bool MaximizeBox { set => base.MaximizeBox = value; get => base.MaximizeBox; }

        [Browsable(false)]
        public new bool MinimizeBox { set => base.MinimizeBox = value; get => base.MinimizeBox; }

        [Browsable(false)]
        public override Size MaximumSize { get => base.MaximumSize; set => base.MaximumSize = value; }

        [Browsable(false)]
        public override Size MinimumSize { get => base.MinimumSize; set => base.MinimumSize = value; }
        [Browsable(false)]
        public new Padding Padding { set => base.Padding = value; get => base.Padding; }





        /// <summary>
        /// 焦点进入的控件
        /// </summary>
        /// <param name="flat"></param>
        public void FocusEnter(FlatBase flat)
        {
            _enter.Add(flat);
        }

        /// <summary>
        /// 焦点离开的控件
        /// </summary>
        /// <param name="flat"></param>
        public void FocusLeave(FlatBase flat)
        {
            _enter.Remove(flat);
        }

        public void SetVisible(FlatBase flat)
        {
            _show = flat;
        }


        private void CalcSize()
        {
            _borderRect = new Rectangle(BORDER_W / 2, BORDER_W / 2, Width - BORDER_W, Height - BORDER_W);
            _titleRect = new Rectangle(BORDER_W, BORDER_W, Width - BORDER_W * 2, TitleHeight);
            _closeRect = new Rectangle(Width - BORDER_W - 48, BORDER_W, 48, 32);
            _minRect = new Rectangle(_closeRect.X - 48, BORDER_W, 48, 32);
            _closeIcon = Shape.Multiply(_closeRect, 11);
            _minIcon = Shape.Underline(_minRect, 11);

            SizeF sf = CreateGraphics().MeasureString(Text, _font);
            if (_center)
                _textRect = new RectangleF((Width - sf.Width) / 2f, BORDER_W + (TitleHeight - sf.Height) / 2f, sf.Width, sf.Height);
            else
                _textRect = new RectangleF(6, BORDER_W + (TitleHeight - sf.Height) / 2f, sf.Width, sf.Height);
        }

        private void FlatForm_Load(object sender, EventArgs e)
        {
            BackColor = Common.BACK_COLOR;
            if (Maximized)
            {
                Top = Left = 0;
                Width = Screen.PrimaryScreen.WorkingArea.Width;
                Height = Screen.PrimaryScreen.WorkingArea.Height;
            }
        }

        private void FlatForm_Activated(object sender, EventArgs e)
        {
            _lost = false;
            Refresh();
        }

        private void FlatForm_Deactivate(object sender, EventArgs e)
        {
            _lost = true;
            Refresh();
        }

        private void FlatForm_Paint(object sender, PaintEventArgs e)
        {
            BufferedGraphicsContext current = BufferedGraphicsManager.Current;
            BufferedGraphics bg = current.Allocate(e.Graphics, e.ClipRectangle);
            Graphics g = bg.Graphics;
            g.Clear(Common.BACK_COLOR);  //背景

            if (_lost)
            {
                g.DrawRectangle(BORDER_LOST, _borderRect);   //边框
                g.FillRectangle(Common.BACK_BRUSH, _titleRect);  //标题栏
                g.DrawString(Text, _font, TITLE_LOST, _textRect);  //标题文本
            }
            else
            {
                g.DrawRectangle(Common.BLUE_PEN, _borderRect);   //边框
                g.FillRectangle(Common.BACK_BRUSH, _titleRect);  //标题栏
                g.DrawString(Text, _font, Common.FORE_BRUSH, _textRect);  //标题文本
            }

            if (_closeDown)
                g.FillRectangle(Common.BLUE_BRUSH, _closeRect);
            else if (_closeOver)
                g.FillRectangle(Common.OVER_BRUSH, _closeRect);
            for (int i = 0; i < _closeIcon.Length; i += 2)
                g.DrawLine(Common.FORE_PEN, _closeIcon[i], _closeIcon[i + 1]);

            if (_minimized)
            {
                if (_minDown)
                    g.FillRectangle(Common.BLUE_BRUSH, _minRect);
                else if (_minOver)
                    g.FillRectangle(Common.OVER_BRUSH, _minRect);
                g.DrawLine(Common.FORE_PEN, _minIcon[0], _minIcon[1]);
            }

            bg.Render();
            bg.Dispose();
        }

        private void FlatForm_MouseDown(object sender, MouseEventArgs e)
        {
            if (_show != null)
            {
                _show.SetVisible();
                _show = null;
            }

            if (e.Button == MouseButtons.Left)
            {
                if (_closeOver)
                {
                    _closeDown = true;
                    Refresh();
                }
                else if (_minOver && _minimized)
                {
                    _minDown = true;
                    Refresh();
                }
                else if (Maximized)
                {
                    return;
                }
                else if (MoveForm && e.Y < TitleHeight)
                {
                    Control.Move(Handle);
                }
                
            }

        }

        private void FlatForm_Resize(object sender, EventArgs e)
        {
            CalcSize();
            Refresh();
        }

        private void FlatForm_MouseMove(object sender, MouseEventArgs e)
        {
            if (_enter.Count > 0)
            {
                for (int i = 0; i < _enter.Count; i++)
                    _enter[i].MouseFocusLeave();
                _enter.Clear();
            }

            bool bln1 = _closeRect.Contains(e.Location);
            bool bln2 = _minRect.Contains(e.Location);
            if (bln1 != _closeOver || bln2 != _minOver)
            {
                _closeOver = bln1;
                _minOver = bln2;
                if (!_closeOver) _closeDown = false;
                if (!_minOver) _minDown = false;
                Refresh();
            }
        }

        private void FlatForm_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left) return;
            if (_closeDown)
            {
                _closeDown = false;
                Refresh();
                Close();
            }
            else if (_minDown && _minimized)
            {
                _minDown = false;
                Refresh();
                WindowState = FormWindowState.Minimized;
            }
        }
    }
}