在开发Winform窗体程序的时候,有时希望去掉窗体的边框,然后进行一系列自定义的操作。但是往往在去掉边框之后会遇到一个问题:如何使用鼠标拖动该窗体?
在此推荐一种我经常使用的方法:
[DllImport("user32.dll", EntryPoint = "SendMessageA")]
private static extern int SendMessage(int hwnd, int wMsg, int wParam, int lParam);
[DllImport("user32.dll")]
private static extern int ReleaseCapture();
private const int WM_NCLBUTTONDOWN = 0XA1; //定义鼠标左键按下
private const int HTCAPTION = 2;
// 重写为了移动无边框窗体
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
MoveForm();
}
private void MoveForm()
{
ReleaseCapture();
SendMessage((int)this.Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}
在上述代码中,SendMessage与ReleaseCapture是两个Win32的API,WM_NCLBUTTONDOWN与HTCAPTION是两个常量,前者代表的是在窗体非客户区鼠标左键按下,后者代表的是鼠标当前左边在窗体标题栏上。(想了解更多关于win32常量的含义及数值请加QQ群:207043655)
实现的原理是在非客户区鼠标左键按下,就向系统发送一个鼠标当前在标题栏的假消息,于是系统便按标题栏的特性进行处理,也就可以移动窗体了。
举一反三:如果我在窗体上放了一个Label控件(或者其他控件),鼠标在该控件范围内还能移动窗体吗?如果不能,那么要怎么做才能移动呢?
如果你对上面的问题有自己的想法,欢迎加QQ群:207043655,与我们一起交流讨论,一起学习,一起成长。
本文转载自:http://www.motyer.cn/Files/BlogDetails/how-to-move-borderless-form.html