讀了金永濤朋友的“無標題欄窗口中鼠標拖動技巧”一文頗有啟發。但該文的思路是“通過設置時鐘中斷,在Mousemove()事件中根據鼠標的移動距離,實時修改窗體Form的Top及Left值,即可准確無誤地實現窗口的鼠標拖動操作。”正如該文所說,由於每移動一步都需要重畫窗口,因此利用此方法實現鼠標拖動,比常規的標題欄鼠標拖動慢一些。而且對於窗口中如有多種控件,若想使鼠標拖動窗口中的任何位置都可實現窗口移動,必須對窗口中的所有控件進行上述的鼠標位置記錄與移動處理。
這些缺陷都是該法難以克服的。下面根據筆者學習到的方法,提出另外一種“無標題欄窗口中鼠標拖動”的方法,該方法利用了API函數ReleaseCapture和SendMessage,通過ReleaseCapture來獲取鼠標移動的信息並傳到窗口中,再由SendMessage來發送信息實現窗口的移動。這種方法的優點在於:代碼簡單,而且無需對窗口中的控件進行編程。下面以VB為例。
當Form的ControlBox屬性為False且Caption屬性沒有設值時,窗口就變成了如圖1所示的“無標題欄的窗口”了。移動窗體代碼如下:
在Modual1.BAS文件中聲明:
Declare Function ReleaseCapture Lib "user32" () As Long Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, _ ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Const HTCAPTION = 2 Public Const WM_NCLBUTTONDOWN = &HA1 然後,在Form_MouseDown事件中: Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) ReleaseCapture SendMessage hwnd,WM_NCLBUTTONDOWN, HTCAPTION, 0&End Sub這時你再運行程序,就會發現窗體可以移動,且上面的控件自動隨窗體在移動。
上述窗體在中文Visual Basic 6.0、中文Windows 98下運行通過。