MouseHoverLeave

今天学习MFC编程一书中的鼠标一节。

用vb学它的做了一个。
Private Type tagTRACKMOUSEEVENT
    cbSize As Long
    dwFlags As Long
    hwndTrack As Long
    dwHoverTime As Long
End Type
Private Declare Function TrackMouseEvent Lib "User32.dll" ( _
     ByRef lpEventTrack As tagTRACKMOUSEEVENT) As Long
    
Private Const WM_MOUSELEAVE As Long = &H2A3
Private Const WM_MOUSEHOVER As Long = &H2A1
Private Const WM_MOUSEMOVE As Long = &H200

Private Const TME_LEAVE As Long = &H2
Private Const TME_HOVER As Long = &H1
Private Const HOVER_DEFAULT As Long = &HFFFFFFFF

Private m_bMouseOver As Boolean
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _
     ByRef Destination As Any, _
     ByRef Source As Any, _
     ByVal Length As Long)


Implements ISubclass

Private Sub Form_Load()
    AttachMessage Me, hwnd, WM_MOUSEMOVE
    AttachMessage Me, hwnd, WM_MOUSELEAVE
    AttachMessage Me, hwnd, WM_MOUSEHOVER
End Sub

Private Property Let ISubclass_MsgResponse(ByVal RHS As SSubTimer6.EMsgResponse)
    '
End Property

Private Property Get ISubclass_MsgResponse() As SSubTimer6.EMsgResponse
    ISubclass_MsgResponse = emrConsume
End Property

Private Function ISubclass_WindowProc(ByVal hwnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    '
    Select Case iMsg
   
    Case WM_MOUSEMOVE
        If m_bMouseOver = False Then
            m_bMouseOver = True
            Debug.Print "Enter"
            Dim tm As tagTRACKMOUSEEVENT
            tm.cbSize = Len(tm)
            tm.dwFlags = TME_HOVER Or TME_LEAVE
            tm.dwHoverTime = HOVER_DEFAULT
            tm.hwndTrack = Me.hwnd
           
            TrackMouseEvent tm
           
           
        End If
   
    Case WM_MOUSEHOVER
        Debug.Print "Hover"
        'wParam MK_ 等
        Debug.Print "X=" & LoWord(lParam), "Y=" & HiWord(lParam)
         '由于dwHoverTime时间问题,这个消息有可能不产生,但WM_MOUSELEAVE肯定会。
         '也可以用 TrackMouseEvent tm 方法连续产生WM_MOUSEHOVER

    
    
    Case WM_MOUSELEAVE
        m_bMouseOver = False
        Debug.Print "Leave"
   
   
    End Select
   
   
End Function

Private Function LoWord(x As Long) As Integer
    CopyMemory LoWord, x, 2
End Function

Private Function HiWord(x As Long) As Integer
    CopyMemory HiWord, ByVal VarPtr(x) + 2, 2
End Function

posted on 2009-12-28 22:06  杨志农  阅读(123)  评论(0)    收藏  举报

导航