本文為原創文章、源代碼為原創代碼,如轉載/複制,請在網頁/代碼處明顯位置标明原文名稱、作者及網址,謝謝!
開發工具: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)則用來關閉窗體,如下圖所示:

我們在label1的MouseDown事件寫下如下代碼:
其中,WM_NCLBUTTONDOWN(0x00A1),用來給非用戶端發送左鍵按下消息,
HT_CAPTION(0x0002),為所需要作用的區域,此次為窗體标題。
我們在label2的MouseEnter、MouserLeave、Click事件寫下如下代碼:
其中,需要為關閉按鈕填寫顯示“關閉”按鈕的提示,是以需要使用ToolTip控件。
三、窗體顔色變換
這裡主要用到了一個變換彩虹顔色的算法,參考如下:
可以借用一個while循環,内部再嵌套一個for循環,達到不斷變換顔色的目的,如下代碼所示:
四、建構完的程式界面如下:
五、源代碼及EXE如下:
源代碼:
EXE: