BaseCtl.cs 4.7 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;

namespace Asa.Face
{
    public partial class BaseCtl : UserControl
    {
        private bool _inside = false;
        private int _borderW = 2;

        public BaseCtl()
        {
            InitializeComponent();
            AutoScaleMode = AutoScaleMode.None;
        }

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

        /// <summary>
        /// 鼠标焦点在控件里面
        /// </summary>
        [Browsable(false)]
        public bool Inside
        {
            set
            {
                if (_inside != value)
                {
                    if (Enabled)
                    {
                        _inside = value;
                        Refresh();
                    }
                }
            }
            get
            {
                return _inside;
            }
        }

        [Browsable(false)]
        public Rectangle BorderRect { set; get; }

        [Browsable(false)]
        public Pen BorderInsidePen { set; get; }

        [Browsable(false)]
        public Pen BorderOutsidePen { set; get; }

        [Browsable(true), DefaultValue(2)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public int BorderWidth
        {
            set
            {
                if (value < 0)
                    _borderW = 0;
                else
                    _borderW = value;
                CalcSize();
                Refresh();
            }
            get
            {
                return _borderW;
            }
        }

        [Browsable(true)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public override string Text
        {
            get => base.Text;
            set
            {
                base.Text = value;
                CalcSize();
                Refresh();
            }
        }

        [Browsable(true)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public override Font Font
        {
            get => base.Font;
            set
            {
                base.Font = value;
                CalcSize();
                Refresh();
            }
        }

        [Browsable(true), DefaultValue(true)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public new bool Enabled
        {
            set
            {
                base.Enabled = value;
                Refresh();
            }
            get
            {
                return base.Enabled;
            }
        }

        [Browsable(false)]
        public Bitmap ToImage()
        {
            IntPtr hSrce = API.GetWindowDC(Handle);
            IntPtr hDest = API.CreateCompatibleDC(hSrce);
            IntPtr hBmp = API.CreateCompatibleBitmap(hSrce, Width, Height);
            IntPtr hOldBmp = API.SelectObject(hDest, hBmp);
            if (API.BitBlt(hDest, 0, 0, Width, Height, hSrce, 0, 0, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt))
            {
                Bitmap bmp = Image.FromHbitmap(hBmp);
                API.SelectObject(hDest, hOldBmp);
                API.DeleteObject(hBmp);
                API.DeleteDC(hDest);
                API.ReleaseDC(Handle, hSrce);
                return bmp;
            }
            return null;
        }






        /// <summary>
        /// 计算大小
        /// </summary>
        protected virtual void CalcSize() {
            BorderRect = new Rectangle(_borderW / 2, _borderW / 2, Width - _borderW, Height - _borderW);
            BorderInsidePen = new Pen(Common.BLUE_COLOR, _borderW);
            BorderOutsidePen = new Pen(Common.BORDER_COLOR, _borderW);
        }

        private void BaseCtl_Load(object sender, EventArgs e)
        {
            AutoScaleMode = AutoScaleMode.None;
            CalcSize();
            Refresh();
        }

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



        protected override void WndProc(ref Message m)
        {
            //if (DesignMode)
            //{
            //    base.WndProc(ref m);
            //}
            //else
            //{
            //    if (m.Msg == 0x0014) // 禁掉清除背景消息
            //        return;
            //    base.WndProc(ref m);
            //}

            if (m.Msg == 0x0014) // 禁掉清除背景消息
                return;
            base.WndProc(ref m);
        }


    }
}