如果光标在光标上,则显示矩形,如果光标在光标上,则显示矩形;如果光标离开子窗口,则显示矩形

问题描述:

当我的光标位于窗口上时,我需要在我的标题减少子窗口上显示一些图形(准确的说是5个矩形)并在光标离开窗口时清除它们;即进入父窗口区域。如果光标在光标上,则显示矩形,如果光标在光标上,则显示矩形;如果光标离开子窗口,则显示矩形

我正在通过NCHITTEST跟踪鼠标移动到子窗口,矩形弹出完美。但是当我的光标离开子窗口时,我不能让它们消失,它们只是留在客户区域,直到WM_PAINT被调用到窗口。

任何人都可以告诉我如何实现此功能?我需要使用NCHITTEST案例,因为我的其他功能依赖于它。我试着跟踪mouse_move和lbuttondown事件,但这些事件并没有与nchittest一起被捕获。

+0

如果你没有收到WM_MOUSEMOVE消息,那么你有一个更大的问题。你需要找出哪个窗口捕获了鼠标。如果你不知道,请使用Spy ++。 – 2012-04-25 11:11:04

+0

感谢您指向我间谍++。我看到我在我的子窗口上获取鼠标事件,除了WM_MOUSEMOVE之外,我获得了WM_NCMOUSEMOVE。然后将光标移到子窗口上,我得到了WM_NCMOUSELEAVE事件。有人能告诉我这里发生了什么吗? – 2012-05-07 07:55:30

看看TrackMouseEvent()函数。

当鼠标进入窗口时(WM_MOUSEMOVE,如果它尚未被跟踪),需要调用它,并在鼠标离开时通知窗口(WM_MOUSELEAVE)。

下面是一些示例VB6代码,但应该很容易转换为任何其他语言。

Select Case Msg 
    Case WM_MOUSEMOVE 
     If Not MouseInWindow Then 
     Dim ET As TRACKMOUSEEVENTTYPE 
     'Set up the mouse leave notification 
     ET.cbSize = Len(ET) 
     ET.hwndTrack = Me.hWnd 
     ET.dwFlags = TME_HOVER Or TME_LEAVE 
     ET.dwHoverTime = 0 
     TrackMouseEvent ET 

     MouseInWindow = True 
     'The mouse has just entered 
     Redraw 
     End If 

    Case WM_MOUSELEAVE 
     If MouseInWindow Then 
     MouseInWindow = False 
     'The mouse has just left 
     Redraw 
     End If 
End Select 
+0

有没有其他办法?我已经看过TrackMouseEvent(),并没有得到我应该如何使用它,我没有得到正确的鼠标事件。 我想到的一个解决方案是在调整大小/移动之后明确重新绘制整个子窗口。但是当NCHITTEST被调用时它仍然会显示我调整点的大小。我真的被困在这里。 – 2012-05-07 07:57:33

+0

这并不难,但我只能提供VB6代码。你可以在第一个'WM_MOUSEMOVE'消息中调用TrackMouseEvent,然后处理'WM_MOUSELEAVE'。 – Deanna 2012-05-08 09:41:45

+0

但即时通讯使用NCHITTEST跟踪鼠标拖/移动。不是通过LButtonDown/LButtonUp和Move事件单独处理鼠标拖/移动事件。我也尝试了这个方案。 – 2012-05-10 04:39:35