MouseLeave

Bisher hat Ihre Anwendung nur dann Mausnachrichten erhalten, wenn eine der Maustasten gedrückt bzw. losgelassen wurde oder die Maus innerhalb des Fensters bewegt wurde. In manchen Fällen kann es jedoch sehr hilfreich sein zu erfahren, wann die Maus ein Fensters verlässt. Dazu bietet WINDOWS eine neue API-Funktion an, die API-Funktion _TrackMouseEvent(...). Als Parameter erhält die Funktion einen Zeiger auf eine Struktur vom Typ TRACKMOUSEEVENT, die die Arbeitsweise von _TrackMouseEvent(...) steuert.

Es gibt eine ähnlich lautenden Funktion TrackMouseEvent(...) (ohne Underscore am Anfang). Der Unterschied zwischen beiden Funktionen ist, dass _TrackMouseEvent(...) eventuell vorhandene Hardware-Unterstützung ausnutzt um die gewünschte Funktionalität zu erreichen.

Die für die Arbeitsweise von _TrackMouseEvent(...) verantwortliche Struktur TRACKMOUSEEVENT besitzt folgenden Aufbau:

typedef struct tagTRACKMOUSEEVENT
{
    DWORD cbSize;
    DWORD dwFlags;
    HWND hwndTrack;
    DWORD dwHoverTime;
} TRACKMOUSEEVENT;

cbSize spezifiziert die Größe der Struktur in Bytes. Das Element dwFlags bestimmt die Arbeitsweise von _TrackMouseEvent(...) und kann eine Kombination aus folgenden Konstanten sein:

Konstante

Bedeutung

TME_CANCEL Bricht eine Ereignisaufzeichnung ab. Zusätzlich muss noch das abzubrechende Ereignis mit angegeben werden.
TME_HOVER Das Hover-Ereignis (mehr dazu gleich) soll aufgezeichnet werden.
TME_LEAVE Das Verlassen der Client-Area soll aufgezeichnet werden.
TME_QUERY Abfragen der gesetzten Ereignisaufzeichnungen.
TME_NONCLIENT Hover-Ereignis für den Nicht-Clientbereich des Fensters (nur WINDOWS98 und WINDOWS2000).

hwndTrack ist das Fenster-Handle des Fensters, für das die Ereignisaufzeichnung gelten soll und dwHoverTime definiert die Zeit in Millisekunden, die zu einem Hover-Ereignis führt. Ein Hover-Ereignis wird immer dann ausgelöst, wenn die Maus eine bestimmte Zeit nicht mehr bewegt wird. Sie kennen dieses Verhalten von den Tooltips (das sind die kleinen gelben Hinweise); diese erscheinen z.B. immer dann, wenn Sie mit der Maus in der Toolleiste über einen Button fahren.

Die gesetzten Ereignisaufzeichnungen sind einmalig. Wurde z.B. das Hover-Ereignis einmal ausgelöst so müssen Sie die Funktion _TrackMouseEvent(...) erneut aufrufen wenn Sie weitere Hover-Ereignisse erhalten wollen!

Der nachfolgende Auszug aus dem Beispiel zu diesem Thema zeigt das Initialisieren der Ereignisaufzeichnung:

void CMouseLeaveView::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen
    // MouseTracking aufsetzen
    TRACKMOUSEEVENT strMEvent;
    strMEvent.cbSize = sizeof(strMEvent);
    strMEvent.dwFlags = TME_HOVER|TME_LEAVE;
    strMEvent.hwndTrack = *this;
    strMEvent.dwHoverTime = 1000;
    ::_TrackMouseEvent(&strMEvent);
}

Immer wenn im Beispiel innerhalb der Client-Area des Fensters die linke Maustaste gedrückt wird, wird die Aufzeichnung neu gestartet. Wird die Maus danach 1 Sekunden nicht bewegt oder sie verlässt das Fenster, so wird ein Ereignis ausgelöst.

Doch wie erfährt nun die Anwendung vom eingetretenen Ereignis? WINDOWS ist, wie schon mehrfach erwähnt, ein nachrichtenbasierendes System und somit erhält die Anwendung über eine Nachricht Kenntnis vom eingetroffenen Ereignis. Zwei Nachrichten können hierbei auftreten: die Nachrichten WM_MOUSEHOVER und die Nachricht WM_MOUSELEAVE. Sie brauchen also innerhalb Ihrer Anwendung 'nur' die entsprechenden Nachrichtenbearbeiter einfügen. Zum Einfügen der Nachrichten innerhalb der MESSAGE_MAP müssen Sie das Makro ON_MESSAGE(...) verwenden da der Assistent diese Nachrichten nicht kennt.

BEGIN_MESSAGE_MAP(CMouseLeaveView, CView)
    //{{AFX_MSG_MAP(CMouseLeaveView)
    ON_WM_MOUSEMOVE()
    ON_WM_LBUTTONDOWN()
    //}}AFX_MSG_MAP
    ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover)
    ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
END_MESSAGE_MAP()

Das fertige Programm zu diesem Thema finden Sie unter 06Eingaben\MouseLeave.



Copyright © 2004

Senden Sie Emails mit Fragen oder Kommentaren zu dieser Website an: mailto:info@cpp-tutor.de
 Wolfgang Schröder, Lerchenweg 23, D-72805 Lichtenstein. Tel: +49 7129 6470