• C#之设置无边框后如何移动窗体(转)


    转载:http://www.cnblogs.com/techmango/archive/2012/03/31/2427523.html

    第一种,利用windows的消息机制来实现:

    首先﹐.定义鼠標左鍵按下時的Message标识﹔其次﹐在Form1_MouseDown方法﹐讓操作系統誤以為是按下标题栏。

    1.定义鼠標左鍵按下時的Message标识

    1    private const int WM_NCLBUTTONDOWN = 0XA1;   //.定义鼠標左鍵按下
    2    private const int HTCAPTION     = 2;

    2.讓操作系統誤以為是按下标题栏

    1 private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    2    {   
    3     //為當前的應用程序釋放鼠標鋪獲
    4     ReleaseCapture();
    5     //發送消息﹐讓系統誤以為在标题栏上按下鼠標
    6     SendMessage((int)this.Handle,WM_NCLBUTTONDOWN,HTCAPTION,0);
    7    }

    3.申明程序中所Windows的API函數

    1    [DllImport("user32.dll",EntryPoint="SendMessageA")]
    2    private static extern int SendMessage(int hwnd,int wMsg,int wParam,int lParam);
    3 
    4    [DllImport("user32.dll")]
    5    private static extern int ReleaseCapture();

     

    第二种,通过自定鼠标左键按下时产生的事件:

     * 首先将窗体的边框样式修改为None,让窗体没有标题栏
     * 实现这个效果使用了三个事件:鼠标按下、鼠标弹起、鼠标移动
     * 鼠标按下时更改变量isMouseDown标记窗体可以随鼠标的移动而移动
     * 鼠标移动时根据鼠标的移动量更改窗体的location属性,实现窗体移动
     * 鼠标弹起时更改变量isMouseDown标记窗体不可以随鼠标的移动而移动
     */

    1 private bool isMouseDown = false;
    2 private Point FormLocation;     //form的location
    3 private Point mouseOffset;      //鼠标的按下位置
    1 private void Form1_MouseDown(object sender, MouseEventArgs e)
    2 {
    3     if (e.Button == MouseButtons.Left)
    4     {
    5         isMouseDown = true;
    6         FormLocation = this.Location;
    7         mouseOffset = Control.MousePosition;
    8     }
    9 }
    1 private void Form1_MouseUp(object sender, MouseEventArgs e)
    2 {
    3     isMouseDown = false;
    4 }
     1 private void Form1_MouseMove(object sender, MouseEventArgs e)
     2 {
     3     int _x = 0;
     4     int _y = 0;
     5     if (isMouseDown)
     6     {
     7         Point pt = Control.MousePosition;
     8         _x = mouseOffset.X - pt.X;
     9         _y = mouseOffset.Y - pt.Y;
    10 
    11         this.Location = new Point(FormLocation.X - _x, FormLocation.Y - _y);
    12     }
    13 }
  • 相关阅读:
    Ubuntu 装JDK
    U盘文件夹被病毒隐藏,且不能取消解决办法
    wireshark: there are no interfaces on which a capture can be done
    [转]Ubuntu 常用快捷键10个
    恢复被win7覆盖的Ubuntu Grub
    U盘安装Win7 64位
    荣耀3X畅玩版狙击红米note!
    Secret and Whisper
    360 chrome不能登录Google账户
    周鸿祎仍想做手机
  • 原文地址:https://www.cnblogs.com/imstrive/p/5652922.html
Copyright © 2020-2023  润新知