在應用程式表單內點選設定區塊拖曳Form

應用程式在拖曳時只能點選視窗狀態列的地方才可以拖曳,表單內部特定區塊要可以拖曳必須透過OnMouseClick 事件,但是卻有一個特別的情況會發生,就是快速拖曳時會跟不上滑鼠的速度,不知道是不是因為使用NET的事件的關係,改成WIN32 API此現象就可以改善
使用滑鼠事件
protected Point MousePt; // 紀錄移動前和移動後的滑鼠座標
protected bool canMove = false; // 紀錄表單可否被拖曳
protected int LeftVar = 0, TopVar = 0; // 紀錄form的移動量

private void toolStrip1_MouseDown(object sender, MouseEventArgs e)
{
  // 設定滑鼠移動前的座標
  MousePt = new Point(e.X, e.Y);
  canMove = true; // 如果按下滑鼠左鍵時 可以移動表單
}

private void toolStrip1_MouseMove(object sender, MouseEventArgs e)
{
  // 拖曳form
  if (canMove)
  {
    this.Left += e.X - MousePt.X;
    this.Top += e.Y - MousePt.Y;
  }
}

private void toolStrip1_MouseUp(object sender, MouseEventArgs e)
{
  canMove = false; // 如果放開滑鼠左鍵時 暫停移動表單
}

使用API達成
using System.Runtime.InteropServices;//滑鼠API

const int WM_SYSCOMMAND = 0x112;
const int SC_MOVE = 0xF012;
[DllImport("user32", EntryPoint = "ReleaseCapture", CharSet = CharSet.Ansi)]
private extern static int ReleaseCapture();
[DllImport("user32", EntryPoint = "SendMessageA", CharSet = CharSet.Ansi)]
private extern static int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

private void toolStrip1_MouseDown(object sender, MouseEventArgs e)
{
  int i;
  i = ReleaseCapture();
  i = SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE, 0);
}

留言