0

我创建了一个用户控件,并使用 Paul Catons 子类对其进行子类化。

  • WM_MOUSEMOVE 正在被解雇。

  • WM_MOUSELEAVE 不是。

为什么 WM_MOUSELEAVE 没有被解雇?

我已经看到人们在这样的 WM_MOUSEMOVE 事件中调用 TrackMouseEvent 以使 WM_MOUSELEAVE 触发的方法,但我不明白为什么需要强制执行它:

代码:

if uMsg = WM_MOUSEMOVE then
  
    If Not m_bEntered Then

          m_bEntered = True

          Dim tme As TRACKMOUSEEVENT_STRUCT
          With tme
                    .cbSize = Len(tme)
                    .dwFlags = TME_LEAVE
                    .hwndTrack = lng_hWnd
          End With
    
          Call TrackMouseEvent(tme)

但我不明白为什么应该这样做,为什么只在 WM_MOUSEMOVE 而不是在用户控件初始化时。

谢谢!

用户控件的代码是这样的:

代码:

Option Explicit

Private oSub        As cSubclass                                            'cSubclass instance
Implements iSubclass

Private Sub UserControl_Initialize()

    Set oSub = New cSubclass
    
    oSub.Subclass UserControl.hwnd, Me
    oSub.AddMsg UserControl.hwnd, WM_MOUSEMOVE, MSG_AFTER
    oSub.AddMsg UserControl.hwnd, WM_MOUSELEAVE, MSG_AFTER

End Sub

Private Sub iSubclass_WndProc(ByVal bBefore As Boolean, bHandled As Boolean, lReturn As Long, ByVal lng_hWnd As Long, ByVal uMsg As WinSubHook2.eMsg, ByVal wParam As Long, ByVal lParam As Long, lParamUser As Long)

    If uMsg = WM_MOUSELEAVE Then
        Debug.Print Now & " wm_mouseleave" 'is not being fired
    ElseIf uMsg = WM_MOUSEMOVE Then
        Debug.Print Now & " wm_mousemove" 'is being fired
    End If

End Sub
4

0 回答 0