Winform FormBorderStyle设置为None后移动窗体 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【meiwen.anslib.com - 电脑资料】

   

    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后移动窗体》(http://meiwen.anslib.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>

总结

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

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

最新文章