在我們自定義窗體的時候,實現鼠標點擊拖動標題欄移動窗體是必要的,而用Windows API來實現這一功能相對來說最簡單,需要用到的API函數有兩個:
1:BOOL WINAPI ReleaseCapture(void);
2:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam)
第二個方法是向窗體發送移動的命令,主要解釋一下第一個方法。
ReleaseCapture官方的解釋是釋放窗體的鼠標捕獲,並且恢復鼠標接收指令,這一步是為了接下來根據鼠標來移動窗體做准備,關鍵的是下一步,ReleaseCapture讓窗體捕獲所有的鼠標輸入(無論鼠標在哪里),只有這樣我們移動鼠標的時候窗體才會跟着一直移動,直到再次對鼠標進行操作。
最后,已C#語言為例,實現窗體移動:
//**************************************************** //創建人:xxx //創建時間:2016-09-23 //功能說明:該類是一個重新繪制的窗體 //**************************************************** public partial class MyForm : Form { /// <summary> /// 釋放鼠標捕獲 /// </summary> /// <returns>成功返回true,失敗返回false</returns> [DllImport("user32.dll")] public static extern Boolean ReleaseCapture(); /// <summary> /// 向窗體發送消息 /// </summary> /// <param name="hwnd">窗體的句柄</param> /// <param name="wMsg">消息號</param> /// <param name="wParam">消息的附加信息</param> /// <param name="lParam">消息的附加信息</param> /// <returns>成功返回true,失敗返回false</returns> [DllImport("user32.dll")] public static extern Boolean SendMessage(IntPtr hwnd, Int32 wMsg, Int32 wParam, Int32 lParam); public const Int32 WM_SYSCOMMAND = 0x0112; public const Int32 SC_MOVE = 0xF010; public const Int32 HTCAPTION = 0x0002; /// <summary> /// 窗體的鼠標點擊事件委托 /// </summary> private void panelTitle_MouseDown(object sender, MouseEventArgs e) { ReleaseCapture(); SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); } }