之前写过一篇文章叫做: WinForm自定义标题栏 的文章,这篇文章主要说了如果自定义窗体的标题栏,后来发现,按文章实现以后还有好多后续的工作要做,在这里再补充一下
上篇文章实现的效果如图:
这个是WinForm的窗体么,边框呢,即便设置了Panel的BorderStyle后,还需要做一些工作去使窗体在Normal状态是可以自动的调节窗体的大小,接下来说一下我的方法
如何作这样的一个窗体在上一篇文章已经说过了,不同的是不要将窗体的FormBorderStyle设置为None
1. 一开始只将窗体的ControlBox设置为False,这样窗体的标题栏就会消失了(注:如果Text属性不为空的话标题栏是不会消失的,因此也叫将窗体的Text清空)
2. 接下来可以使用Panel控件和Dock、Anchor属性进行界面的布局,具体不在这里说了,都很简单
接下来就写代码了,代码如下:
public frmMain() | |
{ | |
InitializeComponent(); //这一句是设定窗体最大化后的大小,如果不设置,窗体最大化以后会挡住任务栏 | |
this.MaximumSize = new Size(SystemInformation.WorkingArea.Width, SystemInformation.WorkingArea.Height); | |
} | |
private static Point downPosition; //记录鼠标按下时的坐标 | |
bool down = false; //判断鼠标是状态 True:按下 False:抬起 | |
private void pnlCaption_MouseDown(object sender, MouseEventArgs e) | |
{ | |
downPosition = new Point(e.X, e.Y); | |
down = true; | |
} | |
private void pnlCaption_MouseMove(object sender, MouseEventArgs e) | |
{ | |
if (down && e.Button == System.Windows.Forms.MouseButtons.Left) | |
{ | |
if (this.WindowState == FormWindowState.Maximized) | |
Normal(); | |
//此处还需要更多的考虑,这一句是为了当窗体最大化时拖拽标题栏可以切换到Normal状态,但是效果不是很理想 | |
Point currentPosition = Control.MousePosition; | |
currentPosition.Offset(-downPosition.X, -downPosition.Y); | |
this.Location = currentPosition; | |
} | |
} | |
private void pnlCaption_DoubleClick(object sender, EventArgs e) | |
{ | |
if (this.WindowState == FormWindowState.Maximized) | |
{ | |
Normal(); | |
} else { | |
Maximized(); | |
} | |
} | |
private void btnClose_Click(object sender, EventArgs e) | |
{ | |
this.Close(); | |
} | |
private void btnMax_Click(object sender, EventArgs e) | |
{ | |
if (FormWindowState.Maximized == WindowState) | |
{ | |
Normal(); | |
} | |
else if (FormWindowState.Normal == WindowState) | |
{ | |
Maximized(); | |
} | |
} | |
private void btnMin_Click(object sender, EventArgs e) | |
{ | |
this.WindowState = FormWindowState.Minimized; | |
} | |
private void Maximized() | |
{ | |
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; | |
this.WindowState = FormWindowState.Maximized; | |
} | |
private void Normal() | |
{ | |
this.WindowState = FormWindowState.Normal; | |
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable; | |
} |
代码很简单,这里就不写注释了
这样自定义的标题栏就算是完成了,效果如下:
Normal
最大化的效果
当最大化是就将窗体的FormBorderStyle切换为None状态,Normal是切换为Sizable状态,这样整个效果还能勉强接受
不足的是在Nromal状态时标题栏上面的边框比较恶心,哎……
如果哪位路过的朋友有更好的做法,请不吝赐教,谢谢