2012-04-25 128 views
3

當我的光標位於窗口上時,我需要在我的標題減少子窗口上顯示一些圖形(準確的說是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

回答

1

看看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