zoukankan      html  css  js  c++  java
  • 【Winfrom-无边框窗体】Winform如何拖动无边框窗体?

    去掉边框

          this.FormBorderStyle = FormBorderStyle.None;
    

    方法一:

         Point mouseOff;//鼠标移动位置变量
            bool leftFlag;//标签是否为左键
    
            private void Form1_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    mouseOff = new Point(-e.X, -e.Y);
                    leftFlag = true;
                }
            }
    
            private void Form1_MouseMove(object sender, MouseEventArgs e)
            {
                if (leftFlag)
                {
                    Point mouseSet = Control.MousePosition;
                    mouseSet.Offset(mouseOff.X, mouseOff.Y);//设置移动后的位置
                    Location = mouseSet;
                }
            }
    
            private void Form1_MouseUp(object sender, MouseEventArgs e)
            {
                if (leftFlag)
                {
                    leftFlag = false;//释放鼠标后标注为False
                }
    
            }
    

     

    方法二:调用非托管的动态链接库,通过控件的鼠标按下事件(MouseDown)发送一个拖动的消息,可以给控件添加MouseDown事件后,拖动这个控件来移动窗体

         [DllImport("user32.dll")]
            public static extern bool ReleaseCapture();
            [DllImport("user32.dll")]
            public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
            public const int WM_SYSCOMMAND = 0x0112;
            public const int SC_MOVE = 0xF010;
            public const int HTCAPTION = 0x0002;
    
            private void Form1_MouseDown(object sender, MouseEventArgs e)
            {
                ReleaseCapture();
                SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
            }
    

      

    方法三:通过重载消息处理实现。重写窗口过程(WndProc),处理一些非客户区消息(WM_NCxxxx),C#中重写窗口过程不用再调用SetWindowLong API,直接override一个WndProc就可以了,不用声明api函数。

    鼠标的拖动只对窗体本身有效,不能在窗口的控件区域电机拖动

         protected override void WndProc(ref Message m)
            {
                base.WndProc(ref m);
                if (m.Msg == 0x84)
                {
                    switch (m.Result.ToInt32())
                    {
                        case 1:
                            m.Result = new IntPtr(2);
                            break;
                    }
                }
            }
    

      

    方法四:直接在控件上写事件,主窗体设置无边框,让一个panel或PictureBox停靠在主窗体

    请看   http://www.cnblogs.com/Sukie-s-home/p/5216980.html

  • 相关阅读:
    Microsoft.Jet.Oledb.4.0 提供者並未登錄於本機電腦上
    asp.net将本地Excel上传到服务器并把数据导入到数据库
    报错:Cannot insert explicit value for identity column in table 't' when identity_insert is set to OFF
    select * from table where 1=1让您茅塞顿开(转)
    cessss
    从“黑掉Github”学Web安全开发
    聊聊JVM的年轻代
    Deployment options
    Put your application in production
    Manage application.conf in several environments
  • 原文地址:https://www.cnblogs.com/Sukie-s-home/p/5220627.html
Copyright © 2011-2022 走看看