Reaktion auf Mausklicks

Wenn der Benutzer eine Maustaste betätigt, während sich der Cursor über dem Clientbereich eines Fensters befindet, empfängt das Fenster eine der folgenden Meldungen.

`Message` Bedeutung
WM_LBUTTONDOWN Linke Taste unten
WM_LBUTTONUP Linke Taste oben
WM_MBUTTONDOWN Mittlere Taste unten
WM_MBUTTONUP Mittlere Taste oben
WM_RBUTTONDOWN Rechte Taste unten
WM_RBUTTONUP Rechte Taste oben
WM_XBUTTONDOWN XBUTTON1 oder XBUTTON2 unten
WM_XBUTTONUP XBUTTON1 oder XBUTTON2 oben

 

Denken Sie daran, dass der Clientbereich der Teil des Fensters ist, der den Frame ausschließt. Weitere Informationen zu Clientbereichen finden Sie unter Was ist ein Fenster?

Mauskoordinaten

In allen diesen Nachrichten 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 Bit enthalten die y-Koordinate. Verwenden Sie die Makros GET_X_LPARAM und GET_Y_LPARAM, um die Koordinaten aus lParam zu extrahieren.

int xPos = GET_X_LPARAM(lParam); 
int yPos = GET_Y_LPARAM(lParam);

Diese Makros sind in der Headerdatei „WindowsX.h“ definiert.

Unter 64-Bit-Windows ist lParam ein 64-Bit-Wert. Die oberen 32 Bits von lParam werden nicht verwendet. Wenn in der Windows-Dokumentation „low-order word“ und „high-order word“ bei lParam erwähnt wird, bedeutet dies bei 64-Bit die Worte des oberen und des unteren Rangs der unteren 32 Bits. Die Makros extrahieren die korrekten Werte, wenn Sie diese verwenden, ist dies daher sicher.

Mauskoordinaten werden in Pixeln und nicht geräteunabhängigen Pixeln (DIPs) angegeben sowie relativ zum Clientbereich des Fensters gemessen. Koordinaten sind signierte Werte. Positionen über und links neben dem Clientbereich haben negative Koordinaten, was wichtig ist, wenn Sie die Mausposition außerhalb des Fensters verfolgen. Mehr dazu in einem späteren Thema, Erfassen von Mausbewegungen außerhalb des Fensters.

Zusätzliche Flags

Der Parameter wParam enthält ein bitweises Flag-OR zur Anzeige des Zustands der anderen Maustasten sowie der UMSCHALT- und der STRG-Taste.

Flag Bedeutung
MK_CONTROL Die STRG-TASTE ist gedrückt.
MK_LBUTTON Die linke Maustaste ist gedrückt.
MK_MBUTTON Die mittlere Maustaste ist gedrückt.
MK_RBUTTON Die rechte Maustaste ist gedrückt.
MK_SHIFT Die UMSCHALT-Taste ist gedrückt.
MK_XBUTTON1 Die Taste XBUTTON1 ist unten.
MK_XBUTTON2 Die Taste XBUTTON2 ist unten.

 

Das Fehlen eines Flags bedeutet, dass die entsprechende Taste nicht betätigt wurde. So testen Sie beispielsweise, ob die STRG-Taste gedrückt ist:

if (wParam & MK_CONTROL) { ...

Wenn Sie den Status anderer Tasten neben STRG und UMSCHALT ermitteln müssen, verwenden Sie die GetKeyState-Funktion, beschrieben unter Tastatureingabe.

Die Fenstermeldungen WM_XBUTTONDOWN und WM_XBUTTONUP gelten für XBUTTON1 und XBUTTON2. Der Parameter wParam gibt an, welche Taste betätigt wurde.

UINT button = GET_XBUTTON_WPARAM(wParam);  
if (button == XBUTTON1)
{
    // XBUTTON1 was clicked.
}
else if (button == XBUTTON2)
{
    // XBUTTON2 was clicked.
}

Doppelklicks

Ein Fenster empfängt standardmäßig keine Doppelklickbenachrichtigungen. Um Doppelklicks zu erhalten, legen Sie das Flag CS_DBLCLKS 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 Flag CS_DBLCLKS wie gezeigt festlegen, erhält das Fenster Doppelklickbenachrichtigungen. Ein Doppelklick wird durch eine Fenstermeldung mit „DBLCLK“ im Namen angegeben. Beispielsweise erzeugt ein Doppelklick mit der linken Maustaste die folgende Abfolge von Nachrichten:

WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP

Tatsächlich wird die zweite WM_LBUTTONDOWN-Nachricht, die normalerweise generiert würde, zu einer WM_LBUTTONDBLCLK-Nachricht. Entsprechende Nachrichten sind für rechte, mittlere und XBUTTON-Tasten definiert.

Bis Sie die Doppelklicknachricht erhalten, gibt es keine Möglichkeit zu erkennen, dass der erste Mausklick der Beginn eines Doppelklicks ist. Daher sollte eine Doppelklickaktion eine Aktion fortsetzen, die mit dem ersten Mausklick beginnt. In der Windows-Shell wählt beispielsweise ein einzelner Klick einen Ordner aus, während ein Doppelklick den Ordner öffnet.

Nicht-Client-Mausnachrichten

Ein separater Satz von Nachrichten wird für Mausereignisse definiert, die im Nicht-Clientbereich des Fensters auftreten. 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 Meldungen ordnungsgemäß verarbeitet. Sie können jedoch für bestimmte erweiterte Funktionen nützlich sein. Beispielsweise können Sie diese Meldungen verwenden, um benutzerdefiniertes Verhalten in der Titelleiste zu implementieren. Wenn Sie mit diesen Nachrichten umgehen, sollten Sie sie generell an DefWindowProc übergeben. Andernfalls unterbricht Ihre Anwendung Standardfunktionen, z. B. das Ziehen oder Minimieren des Fensters.

Nächste

Mausbewegung