Winform FormBorderStyle设置为None后移动窗体

Winform FormBorderStyle设置为None后移动窗体

在C# Winform中,系统只带的窗体样式,不太好看,往往需要把FormBorderStyle设置为None,然后自己根据需求定制窗体的样式。

FormBorderStyle设置为NoneWinform后移动窗体主要有两种方法。

第一种:通过鼠标事件来模拟

先在窗体中激活三个事件:MouseDown,MouseUp,MouseMove. 然后利用 this.Location,,Control.MousePosition,进行模拟。 flag2 = false;//标记鼠标光标是否进入目的区域private Point FM, FL;(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;}}}(object sender, MouseEventArgs e){// 鼠标左键弹起时,重置判断状态。flag1 = false;flag2 = false;}(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); // 绘制最新位置}}

第二种:重写WndProc函数

WM_NCHITTEST = 0x84;HTCLIENT = 0x1;HTCAPTION = 0x2;(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);}

总结:

使用第一种方法可以随意的设置,鼠标光标在那个区域才可以实现窗体的移动,不过当窗体的控件比较多的时候,窗体移动起来会有明显的缓慢感觉。

使用第二种方法,不能设置目的区域,鼠标光标在窗体的任意位置都可以移动,并且改变了整个鼠标事件的机制。

孝敬父母、疼爱孩子、体贴爱人、善待朋友。

Winform FormBorderStyle设置为None后移动窗体

相关文章:

你感兴趣的文章:

标签云: