Reagieren auf Mausklicks
Wenn der Benutzer auf eine Maustaste klickt, während sich der Cursor über dem Clientbereich eines Fensters befindet, empfängt das Fenster eine der folgenden Meldungen.
| Nachricht | Bedeutung |
|---|---|
| WM _ LBUTTONDOWN | Linke Schaltfläche nach unten |
| WM _ LBUTTONUP | Linke Schaltfläche nach oben |
| WM _ MBUTTONDOWN | Mittlere Schaltfläche nach unten |
| WM _ MBUTTONUP | Mittlere Schaltfläche nach oben |
| WM _ RBUTTONDOWN | Nach unten mit der rechten Schaltfläche |
| WM _ RBUTTONUP | Rechtsschaltfläche nach oben |
| WM _ XBUTTONDOWN | XBUTTON1 oder XBUTTON2 nach unten |
| WM _ XBUTTONUP | XBUTTON1 oder XBUTTON2 nach oben |
Denken Sie daran, dass der Clientbereich der Teil des Fensters ist, der den Rahmen ausschließt. Weitere Informationen zu Clientbereichen finden Sie unter Was ist ein Fenster?
Mauskoordinaten
In all diesen Meldungen enthält der lParam-Parameter die x- und y-Koordinaten des Mauszeigers. Die niedrigsten 16 Bits von lParam enthalten die x-Koordinate, und die nächsten 16 Bits enthalten die y-Koordinate. Verwenden Sie die Get _ X _ LPARAM- und GET _ _ Y-LPARAM-Makros, um die Koordinaten aus lParam zu entpacken.
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
Diese Makros werden in der Headerdatei WindowsX.h definiert.
Auf 64-Bit-Windows ist lParam ein 64-Bit-Wert. Die oberen 32 Bits von lParam werden nicht verwendet. In der MSDN-Dokumentation werden das "Wort in niedriger Ordnung" und das "hochgeordnete Wort" von lParam erwähnt. Im 64-Bit-Fall bedeutet dies die niedrigen und hohen Wörter der unteren 32 Bits. Die Makros extrahieren die richtigen Werte. Wenn Sie sie also verwenden, sind Sie sicher.
Mauskoordinaten werden in Pixeln und nicht in geräteunabhängigen Pixeln (DIPs) angegeben und relativ zum Clientbereich des Fensters gemessen. Koordinaten sind Werte mit Vorsigniert. Positionen über und links vom Clientbereich haben negative Koordinaten, was wichtig ist, wenn Sie die Mausposition außerhalb des Fensters nachverfolgen. Dies wird in einem späteren Thema unter Erfassen von Mausbewegungen außerhalb des Fensters beschrieben.
Zusätzliche Flags
Der wParam-Parameter enthält ein bitweises OR von Flags, das den Zustand der anderen Maustasten sowie die TASTEN UMSCHALT UND STRG angibt.
| Flag | Bedeutung |
|---|---|
| _MK-STEUERELEMENT | Die STRG-TASTE ist gedrückt. |
| MK _ LBUTTON | Die linke Maustaste ist nach unten. |
| MK _ MBUTTON | Die mittlere Maustaste ist nach unten. |
| MK _ RBUTTON | Die rechte Maustaste ist nach unten. |
| MK _ SHIFT | Die UMSCHALTTASTE ist heruntergefahren. |
| MK _ XBUTTON1 | Die Schaltfläche XBUTTON1 ist nicht mehr gedrückt. |
| MK _ XBUTTON2 | Die Schaltfläche XBUTTON2 ist heruntergefahren. |
Das Fehlen eines Flags bedeutet, dass die entsprechende Schaltfläche oder Taste nicht gedrückt wurde. So testen Sie beispielsweise, ob die STRG-Taste nicht mehr gedrückt ist:
if (wParam & MK_CONTROL) { ...
Wenn Sie den Zustand anderer Tasten neben STRG und UMSCHALT suchen müssen, verwenden Sie die GetKeyState-Funktion, die unter Tastatureingabe beschrieben wird.
Die _ Fenstermeldungen WM XBUTTONDOWN und WM _ XBUTTONUP gelten sowohl für XBUTTON1 als auch für XBUTTON2. Der wParam-Parameter gibt an, auf welche Schaltfläche geklickt wurde.
UINT button = GET_XBUTTON_WPARAM(wParam);
if (button == XBUTTON1)
{
// XBUTTON1 was clicked.
}
else if (button == XBUTTON2)
{
// XBUTTON2 was clicked.
}
Doppelklicken
Ein Fenster erhält standardmäßig keine Doppelklickbenachrichtigungen. Um Doppelklicks zu erhalten, legen Sie das CS _ DBLCLKS-Flag in der WNDCLASS-Struktur fest, wenn Sie die Fensterklasse registrieren.
WNDCLASS wc = { };
wc.style = CS_DBLCLKS;
/* Set other structure members. */
RegisterClass(&wc);
Wenn Sie das CS _ DBLCLKS-Flag wie gezeigt festlegen, erhält das Fenster Doppelklickbenachrichtigungen. Ein Doppelklick wird durch eine Fenstermeldung mit "DBLCLK" im Namen angezeigt. Ein Doppelklick auf die linke Maustaste erzeugt beispielsweise die folgende Sequenz von Meldungen:
Tatsächlich wird die zweite _ WM-LBUTTONDOWN-Nachricht, die normalerweise generiert wird, zu einer _ WM-LBUTTONDBLCLK-Nachricht. Entsprechende Meldungen werden für die Schaltflächen rechts, mittel und XBUTTON definiert.
Bis die Doppelklickmeldung angezeigt wird, gibt es keine Möglichkeit, zu erkennen, dass der erste Mausklick der Anfang eines Doppelklicks ist. Daher sollte eine Doppelklickaktion eine Aktion fortsetzen, die mit dem ersten Mausklick beginnt. Beispielsweise wird in der Windows Shell mit nur einem Klick ein Ordner ausgewählt, während der Ordner durch doppelklicken geöffnet wird.
Nicht-Client-Mausnachrichten
Für Mausereignisse, die im Nicht-Clientbereich des Fensters auftreten, wird ein separater Satz von Meldungen definiert. Diese Nachrichten enthalten die Buchstaben "NC" im Namen. BEISPIELSWEISE ist WM _ NCLBUTTONDOWN das Nicht-Client-Äquivalent von WM _ LBUTTONDOWN. Eine typische Anwendung fängt diese Nachrichten nicht ab, da die DefWindowProc-Funktion diese Nachrichten ordnungsgemäß verarbeitet. Sie können jedoch für bestimmte erweiterte Funktionen nützlich sein. Sie können diese Meldungen beispielsweise verwenden, um benutzerdefiniertes Verhalten in der Titelleiste zu implementieren. Wenn Sie diese Nachrichten verarbeiten, sollten Sie sie im Allgemeinen anschließend an DefWindowProc übergeben. Andernfalls unterbricht Ihre Anwendung die Standardfunktionen, z. B. ziehen oder minimieren das Fenster.