自己編程模擬MouseEnter,MouseExit事件
發(fā)表時(shí)間:2024-02-10 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]很多第三方的控件都提供的 MouseEnter 和 MouseExit 事件來補(bǔ)充 MouseMove 事件的不足(MouseMove 事件不能有效的捕獲鼠標(biāo)是否已在控件外),但是這些控件或要注冊,或集合了其他實(shí)際沒有什么作用控件,另外在程序中加入太多的控件也會影響程序的性能,利用 Windows...
很多第三方的控件都提供的 MouseEnter 和 MouseExit 事件來補(bǔ)充 MouseMove 事件的不足(MouseMove 事件不能有效的捕獲鼠標(biāo)是否已在控件外),但是這些控件或要注冊,或集合了其他實(shí)際沒有什么作用控件,另外在程序中加入太多的控件也會影響程序的性能,利用 Windows 的 API 函數(shù),我們可以在 MouseMove 中模擬 MouseEnter 和 MouseExit,雖然我提供的源代碼中沒有真正的這兩個(gè)事件,但的確提供了這兩個(gè)事件所具備的功能。好了!讓我們實(shí)現(xiàn)吧。
首先加載一個(gè)模塊,在模塊中聲明以下兩個(gè) API 函數(shù):
Public Declare Function SetCapture Lib "user32" _
(ByVal hwnd As Long) As Long
Public Declare Function ReleaseCapture Lib "user32" () As Long
SetCapture 的功能是:設(shè)置鼠標(biāo)捕獲指定的窗口(Windows 每個(gè)控件都是一個(gè)窗口。比如桌面上顯示的圖標(biāo)就是一個(gè)窗口,其實(shí)是兩個(gè),另一個(gè)顯示描述這個(gè)圖標(biāo)的文本),系統(tǒng)將收到這個(gè)窗口所有的鼠標(biāo)移動或擊按的所有信息。
ReleaseCapture 的功能是:取消捕獲鼠標(biāo)信息。
Windows 系統(tǒng)就是一個(gè)消息系統(tǒng),系統(tǒng)一直在等待用戶的消息,并加一相應(yīng),但處理完一個(gè)消息后,系統(tǒng)有處以下一輪的等待。消息傳遞是 Windows 的核心。
讓我們在 Form1 中放置一個(gè)按鈕或其他控件,但此控件必須具有窗口句柄(hWnd),比如 VB 提供的 Image 控件是一個(gè)次圖形控件,沒有窗口句柄,而 Picture,Command Button 等控件就有窗口句柄,我們就拿 Command Button 來作示范,在 Form1 上放置一個(gè) Command Button,在 Command1_MouseMove()事件內(nèi)加入以下代碼:
Private Sub Command1_MouseMove(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
With Command1
'當(dāng)鼠標(biāo)在越出控件外
If Not ((X < 0) Or (Y < 0) Or _
(X > .Width) Or (Y > .Height)) Then
'鼠標(biāo)指針在按鈕外時(shí),讓其他控件也收到標(biāo)事件
ReleaseCapture
'為了不讓 MouseMove 事件反復(fù)觸發(fā)
If .Caption <> "outside" Then
.Caption = "outside"
End If
'鼠標(biāo)指針在按鈕上,捕獲他但鼠標(biāo)移出是我們將收到鼠標(biāo)事件
SetCapture .hwnd
Else
.Caption = "inside"
End If
End With
End Sub