首先加载一个模块,在模块中声明以下两个 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 < 0) Or (Y < 0) Or _
(X > .Width) Or (Y > .Height)) Then
'鼠标指针在按钮外时,让其他控件也收到标事件
ReleaseCapture
'为了不让 MouseMove 事件反复触发
If .Caption <> "outside" Then
.Caption = "outside"
End If
'鼠标指针在按钮上,捕获他但鼠标移出是我们将收到鼠标事件
SetCapture .hwnd
Else
.Caption = "inside"
End If
End With
End Sub
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/