肥龍 發表於 2009-6-23 11:34:36

C#无边框窗体移动的三种方法

1.重写wndProc代码:

protected override void WndProc(ref Message m)
{      
      const int WM_NCHITTEST = 0x84;
      const int HTCLIENT = 0x01;
      const int HTCAPTION = 0x02;
         if (m.Msg == WM_NCHITTEST)
      {
                this.DefWndProc(ref m);
                if (m.Result.ToInt32() == HTCLIENT)
                  m.Result = new IntPtr(HTCAPTION);
                else
                  base.WndProc(ref m);
      }
      else
      {
                base.WndProc(ref m);
      }
}
2.创建消息
代码:
private const int WM_NCLBUTTONDOWN = 0x00A1;
private const int WM_NCHITTEST = 0x84;
private const int HT_CAPTION = 0x2;
private const int HT_CLIENT = 0x1;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    //this.Capture = false;
    pictureBox1.Capture = false;
    Message msg = Message.Create(Handle, WM_NCLBUTTONDOWN, (IntPtr)HT_CAPTION, IntPtr.Zero);
    WndProc(ref   msg);   
}
3.调用API代码:
using System.Runtime.InteropServices;

public static extern bool ReleaseCapture();

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;

   //在窗体的_MouseDown中加入如下代码:
如:
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
ReleaseCapture();
SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}

歐陽菲兒852 發表於 2010-3-12 15:00:22

頁: [1]
查看完整版本: C#无边框窗体移动的三种方法