第一種,手工移動。
該方法根據滑鼠位置實現窗體的移動。網上有很多相關的例子,這裡不再多講。
第二種,呼叫系統api
原理:是當滑鼠左鍵按下時,讓系統認為是在標題欄按下的。這裡我們用到了winapi裡的wm_lbuttondown(客戶區滑鼠左鍵按下,值:0x0201)和wm_nclbuttondown(非客戶區滑鼠左鍵按下,值:0x00a1)及htcaption(滑鼠位置在標題欄,值:2)這三個常量。
這裡是採用 sendmessage這個函式,當滑鼠左鍵在客戶區按下的時候,我們用這個函式發出乙個滑鼠左鍵在標題欄按下的訊息來代替。該函式的原型為:
lresult sendmessage(
hwnd hwnd, uint msg, wparam wparam, lparam lparam );
hwnd hwnd, uint msg, wparam wparam, lparam lparam );
我這們在c#中匯入這個api:
[dllimport("user32.dll")]
public static extern intptr sendmessage(intptr hwnd,int msg,int wparam,int lparam);
public static extern intptr sendmessage(intptr hwnd,int msg,int wparam,int lparam);
然後重寫滑鼠事件:
protected override void onmousedown(mouseeventargs e)
}說明:sendmessage(handle, 0x00a1, 2, 0);
handle為窗體的屬性,表示當前視窗控制代碼。0x00a1表示訊息id,這個為非客戶區域滑鼠左鍵按下時的訊息。2表示
滑鼠在標題欄的空白位置。注意,在呼叫sendmessage之前,我們用capture釋放滑鼠。只要設定成false就可以了。這樣就可以實現在客戶區窗體的拖動了。
第三種,重寫 wndproc
這個方法是用來處理訊息的,包括滑鼠的各種訊息。前一種方法中講到了非客戶區的滑鼠訊息,但我在msdn裡找了半天,沒找到相關的非客戶區的滑鼠事件。但wndproc裡可以處理。
原理:將滑鼠在客戶區按下的訊息更改為在非客戶區的標題欄按下。
protected override void wndproc(ref message m)
base.wndproc(ref m);
} 小結
除了第一種方法外,後兩種都是用了模擬滑鼠在標題的動作。這裡我是實現了在非標題欄位置移動窗體。
由此我們可以引申開來,我們還可以模擬標題欄圖示、關閉、最大化、最小化等操作。這樣在一些無標題欄窗體中使用是很方便的。大家不仿嘗試一下。
WinForm拖動沒有標題欄窗體的方法
point hovertreeposition public form hovertree 記錄滑鼠起始位置 hovertree.com private void form hovertree mousedown object sender,mouseeventargs e 按住左鍵,滑鼠移動窗體跟...
WinForm自定義標題欄
這裡只是乙個功能的演示,也很簡單,大體思路是把乙個窗體的formborderstyle設為none,這是就沒有標題欄了,然後自己新增兩個panel,乙個為panelcaption,乙個為panelcontent,panelcaption作為這個窗體的標題欄,如下 上面藍色部分為標題欄,下面很色部分為...
移動沒有標題欄的視窗
我們一般是用滑鼠按住視窗的標題欄,然後移動視窗,當視窗沒有標題欄時,我們可以用下面的方法來移動視窗 在 bas 檔案中宣告 declare function releasecapture lib user32 as long declare function sendmessage lib user...