Windows API實現移動窗體


在我們自定義窗體的時候,實現鼠標點擊拖動標題欄移動窗體是必要的,而用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);
        }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM