天天看點

[C#]使用Label标簽控件模拟窗體标題的移動及窗體顔色不斷變換

本文為原創文章、源代碼為原創代碼,如轉載/複制,請在網頁/代碼處明顯位置标明原文名稱、作者及網址,謝謝!

開發工具:VS2017

語言:C#

DotNet版本:.Net FrameWork 4.0及以上

一、使用的WIN32 API有兩個,一個為ReleaseCapture,另外一個為SendMessage,這兩個函數說明如下:

ReleaseCapture函數:為了說明ReleaseCapture的用法,需要先知道SetCapture的用法,MSDN是這樣描述SetCapture函數:

而ReleaseCapture悄悄相反,函數的功能就是釋放對滑鼠的捕捉。

為什麼要使用這個ReleaseCapture函數,原因在于移動窗體标題時,需要釋放對滑鼠的捕捉,否則,就不能移動窗體标題。

SendMessage函數:該函數是用來給窗體發送Windows消息,

在本文中,該函數是模拟給非窗體客戶區域(如窗體标題、最大化、最小化及關閉按鈕區域)發送Windows消息,使特定區域能收到拖動窗體标題的消息。

兩者在C#的定義如下:

關于hwnd、msg、wParam,lParam的具體說明,可以自行百度。

二、構模組化拟移動窗體标題的應用程式,在這裡我們使用了一個label(左邊,label1),用來将滑鼠移到該控件并拖動時,可以移動窗體,

另外一個label(右邊,label2)則用來關閉窗體,如下圖所示:

[C#]使用Label标簽控件模拟窗體标題的移動及窗體顔色不斷變換

我們在label1的MouseDown事件寫下如下代碼:

其中,WM_NCLBUTTONDOWN(0x00A1),用來給非用戶端發送左鍵按下消息,

HT_CAPTION(0x0002),為所需要作用的區域,此次為窗體标題。

我們在label2的MouseEnter、MouserLeave、Click事件寫下如下代碼:

其中,需要為關閉按鈕填寫顯示“關閉”按鈕的提示,是以需要使用ToolTip控件。

三、窗體顔色變換

這裡主要用到了一個變換彩虹顔色的算法,參考如下:

可以借用一個while循環,内部再嵌套一個for循環,達到不斷變換顔色的目的,如下代碼所示:

四、建構完的程式界面如下:

[C#]使用Label标簽控件模拟窗體标題的移動及窗體顔色不斷變換

五、源代碼及EXE如下:

源代碼:

EXE: