Winform 沒有標題欄也可以拖拽

2021-04-06 15:15:57 字數 1380 閱讀 6986

第一種,手工移動。

該方法根據滑鼠位置實現窗體的移動。網上有很多相關的例子,這裡不再多講。

第二種,呼叫系統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...