Winform. FormBorderStyle设置为None后移动窗体
在C# Winform中,系统只带的窗体样式,不太好看,往往需要把FormBorderStyle设置为None,然后自己根据需求定制窗体的样式,
Winform FormBorderStyle设置为None后移动窗体
。FormBorderStyle设置为NoneWinform后移动窗体主要有两种方法。
第一种:通过鼠标事件来模拟先在窗体中激活三个事件:MouseDown,MouseUp,MouseMove. 然后利用 this.Location,Control.MousePosition,进行模拟。
<code class="hljs" cs="">private bool flag1 = false; //标记鼠标是否按下左键private bool flag2 = false; //标记鼠标光标是否进入目的区域private Point FM, FL;private void Form1_MouseDown(object sender, MouseEventArgs e){ if (e.Button == MouseButtons.Left) //按下鼠标左键 { FM = Control.MousePosition; //取鼠标光标相对于屏幕左上角的坐标。 FL = this.Location; //窗体左上角相对于屏幕的左上角的坐标。 flag1 = true; /* 限制鼠标光标在目的区域(30,300)里才能让窗体移动。 去掉if可实现,鼠标光标在窗体的任何位置点击都可移动窗体。 */ if ((FM.X - FL.X) <= 300 && (FM.Y - FL.Y) <= 30) { flag2 = true; } }}private void Form1_MouseUp(object sender, MouseEventArgs e){ // 鼠标左键弹起时,重置判断状态。 flag1 = false; flag2 = false;}private void Form1_MouseMove(object sender, MouseEventArgs e){ if (flag1 && flag2) { Point pt = Control.MousePosition; int x = FM.X - pt.X; int y = FM.Y - pt.Y; Location = new Point(FL.X - x, FL.Y - y); // 绘制最新位置 }}</code>第二种:重写WndProc函数当重载窗体的 WndProc 方法时,可以截获 WM_NCHITTEST 消息并改些该消息,
电脑资料
《Winform FormBorderStyle设置为None后移动窗体》(https://www.unjs.com)。 当判断鼠标事件发生在客户区时,改写改消息,发送 HTCAPTION 给窗体。 这样,窗体收到的消息就时 HTCAPTION ,在客户区通过鼠标来拖动窗体就如同通过标题栏来拖动一样。 注意:当你重载 WndProc 并改写鼠标事件后,整个窗体的鼠标事件也就随之改变了。<code class="hljs" cs="">private const int WM_NCHITTEST = 0x84;private const int HTCLIENT = 0x1;private const int HTCAPTION = 0x2;protected override void WndProc(ref Message id){ // 引用消息ID(ref Message ID) switch (id.Msg) { case WM_NCHITTEST: base.WndProc(ref id); if ((int)id.Result == HTCLIENT) id.Result = (IntPtr)HTCAPTION; return; } base.WndProc(ref id);}</code>总结:
使用第一种方法可以随意的设置,鼠标光标在那个区域才可以实现窗体的移动,不过当窗体的控件比较多的时候,窗体移动起来会有明显的缓慢感觉。
使用第二种方法,不能设置目的区域,鼠标光标在窗体的任意位置都可以移动,并且改变了整个鼠标事件的机制。