winform自定义窗体,重绘标题栏,自定义控件学习

c#winform自定义窗体,重绘标题栏

虽然现在都在说winform窗体太丑了,但是我也能尽量让桌面应用程序漂亮那么一点点

话不多说,先上图
winform自定义窗体,重绘标题栏,自定义控件学习_第1张图片

重绘标题栏

先将原生窗体设置成无边框,FormBoderStyle设置成None
然后添加一个panpel控件设置成窗体的的标题栏
winform自定义窗体,重绘标题栏,自定义控件学习_第2张图片
然后添加四个Label控件充当标题和最小化最大化关闭按钮。
此时界面的原型就出来了。

完善窗体

当然原型出来了,肯定会让其它窗体继承这个窗体,难点就在于怎么让子窗体标题实时更新标题,我是这样做的
重写(override)j基类窗体的Text

    public override string Text
        {
            get => base.Text;
            set
            {
                base.Text = value;
                if (Title != null)
                {
                    Title.Text = value;
                }
            }
        }

这样继承的时候就可以动态更新标题了
然后将最大化最小化关闭事件写一下就好了
自己添加了 关闭最小化和最大化按钮的属性
代码如下:

 
        private bool mvalueMin = true;
        [Description("是否关闭最小化窗体"), Category("控制")]
        public bool CloseMinButton
        {
            get { return mvalueMin; }
            set
            {
                mvalueMin = value;
                MinClose.Visible = mvalueMin;
            }
        }
        private bool mvalueMax = true;
        [Description("是否关闭最大化窗体"), Category("控制")]
        public bool CloseMaxButton
        {
            get { return mvalueMax; }
            set
            {
                mvalueMax = value;
                MaxClose.Visible = mvalueMax;
            }
        }

但是无边框的窗体有一个界面无法拖动的老大难问题
这里借鉴的是网友的 就没有自己写了 ,具体是看的那篇博客忘记了,如有冒犯,请联系我删除

        [DllImport("user32.dll")]
        public static extern bool ReleaseCapture();
        [DllImport("user32.dll")]
        public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
        private const int VM_NCLBUTTONDOWN = 0XA1;//定义鼠标左键按下
        private const int HTCAPTION = 2;
        private void BaseForm_MouseDown(object sender, MouseEventArgs e)
        {
            //为当前应用程序释放鼠标捕获
            ReleaseCapture();
            //发送消息 让系统误以为在标题栏上按下鼠标
            SendMessage((IntPtr)this.Handle, VM_NCLBUTTONDOWN, HTCAPTION, 0);
        }
        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            //为当前应用程序释放鼠标捕获
            ReleaseCapture();
            //发送消息 让系统误以为在标题栏上按下鼠标
            SendMessage((IntPtr)this.Handle, VM_NCLBUTTONDOWN, HTCAPTION, 0);
        }
        #endregion

测试效果如下
winform自定义窗体,重绘标题栏,自定义控件学习_第3张图片
下一篇博客将讲自定义控件的制作。

希望winform死的慢一点,才喜欢上。

你可能感兴趣的:(winform重绘)