top
Loading...
再談“無標題欄窗口的移動技巧”

讀了金永濤朋友的“無標題欄窗口中鼠標拖動技巧”一文頗有啟發。但該文的思路是“通過設置時鐘中斷,在Mousemove()事件中根據鼠標的移動距離,實時修改窗體Form的Top及Left值,即可準確無誤地實現窗口的鼠標拖動操作。”正如該文所說,由于每移動一步都需要重畫窗口,因此利用此方法實現鼠標拖動,比常規的標題欄鼠標拖動慢一些。而且對于窗口中如有多種控件,若想使鼠標拖動窗口中的任何位置都可實現窗口移動,必須對窗口中的所有控件進行上述的鼠標位置記錄與移動處理。

這些缺陷都是該法難以克服的。下面根據筆者學習到的方法,提出另外一種“無標題欄窗口中鼠標拖動”的方法,該方法利用了API函數ReleaseCapture和SendMessage,通過ReleaseCapture來獲取鼠標移動的信息并傳到窗口中,再由SendMessage來發送信息實現窗口的移動。這種方法的優點在于:代碼簡單,而且無需對窗口中的控件進行編程。下面以VB為例。

當Form的ControlBox屬性為False且Caption屬性沒有設值時,窗口就變成了如圖1所示的“無標題欄的窗口”了。移動窗體代碼如下:

在Modual1.BAS文件中聲明:

Declare Function ReleaseCapture Lib "user32" () As LongDeclare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, _ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPublic Const HTCAPTION = 2Public 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
這時你再運行程序,就會發現窗體可以移動,且上面的控件自動隨窗體在移動。
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗