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