此時如果遇上使用者使用的電腦解析度,低於設計時,會造成畫面被切掉,此時因為 FormBorderStyle 設為 none,所以 Form 也拉不動,所以需要再對於拖曳功能加工(
對於 Form 內的控制項可以單純的在 MouseDown(按下滑鼠)、DragEnter(拖曳開始)、DragDrop(拖曳結束) 事件中寫下相對應的語法,可參考 在 Windows Form 中執行拖放作業
但現在是在 Windows Form 外執行拖放作業,可以用win32 的角度來撰寫語法
// win32 的角度來撰寫語法
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[System.Runtime.InteropServices.DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[System.Runtime.InteropServices.DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();
// 再在 tableLayoutPanel1 的 MouseDown 事件寫下
private void tableLayoutPanel1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
或是在 tableLayoutPanel1 的 MouseDown、MouseMove 事件撰寫語法
// 在 tableLayoutPanel1 的 MouseDown、MouseMove 事件撰寫語法
private Point startPoint; // 紀錄目前視窗的位置
private void tableLayoutPanel1_MouseDown(object sender, MouseEventArgs e)
{
//當滑鼠擊以左點擊控制項的範圍內時,透過計算紀錄目前視窗的位置
if (e.Button == MouseButtons.Left)
{
startPoint = new Point(-e.X + SystemInformation.FrameBorderSize.Width, -e.Y - SystemInformation.FrameBorderSize.Height);
}
}
private void tableLayoutPanel1_MouseMove(object sender, MouseEventArgs e)
{
// 當滑鼠擊按著左鍵移動時,記錄下移動的位置
if (e.Button == MouseButtons.Left)
{
// 滑鼠指標的位置
Point mousePos = Control.MousePosition;
// 新視窗的位置(等於滑鼠指標目前的位置與先前視窗位置的位移)
mousePos.Offset(startPoint.X, startPoint.Y);
// 改變視窗位置
Location = mousePos;
}
}

沒有留言:
張貼留言