自己程式設計模擬 MouseEnter,MouseExit 事件 (轉)

worldblog發表於2007-12-07
自己程式設計模擬 MouseEnter,MouseExit 事件 (轉)[@more@] 

自己模擬 MouseEnter,MouseExit 事件

 

很多第三方的都提供的 MouseEnter 和 MouseExit 事件來補充 MouseMove 事件的不足(MouseMove 事件不能有效的捕獲滑鼠是否已在控制元件外),但是這些控制元件或要註冊,或集合了其他實際沒有什麼作用控制元件,另外在中加入太多的控制元件也會影響程式的,利用 的 ,我們可以在 MouseMove 中模擬 MouseEnter 和 MouseExit,雖然我提供的中沒有真正的這兩個事件,但的確提供了這兩個事件所具備的功能。好了!讓我們實現吧。

首先載入一個模組,在模組中宣告以下兩個 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),比如 提供的 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 <> "outs" Then
  .Caption = "outside"
  End If

  '滑鼠指標在按鈕上,捕獲他但滑鼠移出是我們將收到滑鼠事件
  SetCapture .hwnd

  Else
  .Caption = "inside"
  End If
  End With
End Sub


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989317/,如需轉載,請註明出處,否則將追究法律責任。

相關文章