3

カーソルがウィンドウ上にあるときはいつでもキャプションのない子ウィンドウにいくつかの形状 (正確には 5 つの長方形) を表示し、カーソルがウィンドウを離れるときにそれらを消去する必要があります。つまり、親ウィンドウ領域に入ります。

NCHITTEST を介して子ウィンドウへのマウスの動きを追跡しており、四角形が完全にポップアップします。しかし、カーソルが子ウィンドウを離れたときにそれらを消すことはできません.WM_PAINTがウィンドウに呼び出されるまで、それらはクライアント領域に残ります。

この機能を実現する方法を教えてもらえますか? 残りの機能は NCHITTEST ケースに依存しているため、NCHITTEST ケースを使用する必要があります。mouse_move および lbuttondown イベントの追跡を試みましたが、これらのイベントは nchittest と共にキャプチャされません。

4

1 に答える 1

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
于 2012-04-25T08:25:59.980 に答える