FormBorderStyle设为None,移动Winform窗口的两种方法

来源:互联网 发布:ape转mp3软件 编辑:程序博客网 时间:2024/06/06 09:10


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

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

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

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

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

整理为:

 //FormBorderStyle设为了None,设置移动Winform窗口
        [DllImport("user32.dll")]
        public static extern bool ReleaseCapture();
        [DllImport("user32.dll")]
        public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParan);
        public const int HTCAPTION = 2;
        public const int WM_SYSCOMMAND = 0x112;
        public const int SC_MOVE = 0xf010;
     //   ////////////////////////////////////   
        public MainFrm()
        {
            InitializeComponent();   
        }
        ////左键按下时,设置可移动 
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            ReleaseCapture();
            SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
        }

3.申明程序中所Windows的API函數
   [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();

 

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

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

private bool flagMove = false;   
        public MainFrm()
        {
            InitializeComponent();
            this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseUp);
            this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseMove);
            this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
   
        }

private void Form1_MouseDown(object sender, MouseEventArgs e)//鼠标按下
        {
            formPoint = new Point();
            int xOffset;
            int yOffset;
            if (e.Button == MouseButtons.Left)
            {
                xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
                yOffset = -e.Y - SystemInformation.CaptionHeight - SystemInformation.FrameBorderSize.Height;
                formPoint = new Point(xOffset, yOffset);
                formMove = true;//开始移动
            }
        }

private void Form1_MouseMove(object sender, MouseEventArgs e)//鼠标移动
        {
            if (formMove == true)
            {
                Point mousePos = Control.MousePosition;
                mousePos.Offset(formPoint.X, formPoint.Y);
                Location = mousePos;
            }
        }

private void Form1_MouseUp(object sender, MouseEventArgs e)//鼠标松开
        {
            if (e.Button == MouseButtons.Left)//按下的是鼠标左键
            {
                formMove = false;//停止移动
            }
        }


0 0
原创粉丝点击