好记性不如烂笔头,生活、学习、工作、感悟,记于“笔下”,留于心间。任时光荏苒、世易时移,唯文字不改、记忆不散。

by:蚂蹄儿

winform移动无边框窗体

分类:学无止境 - Winform

关键词: winform  无边框窗体 

来源:蚂蹄儿(www.motyer.cn)

阅读:663发布时间:

  在开发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 = 161; 
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,与我们一起交流讨论,一起学习,一起成长。


  桌面软件定制、中小型网站建设、移动APP开发请添加QQ/微信:773347113。

上一篇:

下一篇: