首先加載一個模塊,在模塊中聲明以下兩個 API 函數:
Public Declare Function SetCapture Lib "user32" _
(ByVal hwnd As Long) As Long
Public Declare Function ReleaseCapture Lib "user32" () As Long
SetCapture 的功能是:設置鼠標捕獲指定的窗口(Windows 每個控件都是一個窗口。比如桌面上顯示的圖標就是一個窗口,其實是兩個,另一個顯示描述這個圖標的文本),系統將收到這個窗口所有的鼠標移動或擊按的所有信息。
ReleaseCapture 的功能是:取消捕獲鼠標信息。
Windows 系統就是一個消息系統,系統一直在等待用戶的消息,并加一相應,但處理完一個消息后,系統有處以下一輪的等待。消息傳遞是 Windows 的核心。
讓我們在 Form1 中放置一個按鈕或其他控件,但此控件必須具有窗口句柄(hWnd),比如 VB 提供的 Image 控件是一個次圖形控件,沒有窗口句柄,而 Picture,Command Button 等控件就有窗口句柄,我們就拿 Command Button 來作示范,在 Form1 上放置一個 Command Button,在 Command1_MouseMove()事件內加入以下代碼:
Private Sub Command1_MouseMove(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
With Command1
當鼠標在越出控件外
If Not ((X $#@60; 0) Or (Y $#@60; 0) Or _
(X $#@62; .Width) Or (Y $#@62; .Height)) Then
鼠標指針在按鈕外時,讓其他控件也收到標事件
ReleaseCapture
為了不讓 MouseMove 事件反復觸發
If .Caption $#@60;$#@62; "outside" Then
.Caption = "outside"
E If
| 鼠標指針在按鈕上,捕獲他但鼠標移出是我們將收到鼠標事件
SetCapture .hwnd
Else
.Caption = "inside"
End If
End With
End Sub