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