C#Winform自定义窗体、重绘标题栏、自定义控件学习
|
admin
2021年1月29日 18:37
本文热度 3282
|
虽然现在都在说winform窗体太丑了,但是我也能尽量让桌面应用程序漂亮那么一点点。
话不多说,先上图:
重绘标题栏
先将原生窗体设置成无边框,FormBoderStyle设置成None,然后添加一个panpel控件设置成窗体的的标题栏:
然后添加四个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
该文章在 2021/1/29 18:37:54 编辑过