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:

WM _ LBUTTONDOWN
WM _ LBUTTONUP
WM _ LBUTTONDBLCLK
WM _ LBUTTONUP

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.

Nächste

Mausbewegung