Sie können die Ereignisse MouseDown, MouseUp und MouseMove verwenden, um Ihren Anwendungen eine Reaktion auf die Position und den Zustand der Maus zu ermöglichen. Die folgenden Mausereignisse werden von den meisten Steuerelementen erkannt.
Ereignis |
Beschreibung |
MouseDown |
Wird ausgelöst, wenn der Benutzer eine Maustaste drückt. |
MouseUp |
Wird ausgelöst, wenn der Benutzer eine Maustaste loslässt. |
MouseMove |
Wird immer dann ausgelöst, wenn der Mauszeiger an eine andere Bildschirmposition bewegt wird. |
Ein Formular kann ein Mausereignis erkennen, wenn sich der Mauszeiger über einer Stelle im Formular befindet, an der keine Steuerelemente vorhanden sind. Ein Steuerelement kann ein Mausereignis erkennen, wenn sich der Mauszeiger über dem Steuerelement befindet.
Wenn der Benutzer eine Maustaste drückt und diese gedrückt hält, erkennt dasselbe Objekt solange alle Mausereignisse, bis der Benutzer die Maustaste loslässt. Dies ist auch dann der Fall, wenn der Mauszeiger vom Objekt fortbewegt wird.
Die drei Mausereignisse verwenden folgende Argumente.
Argument |
Beschreibung |
button |
Ein Bitfeldargument, in dem die drei niederstwertigen Bits den Zustand der Maustasten angeben. |
Shift |
Ein Bitfeldargument, in dem die drei niederstwertigen Bits den Zustand der UMSCHALT-, der STRG- und der ALT-TASTE angeben. |
x, y |
Die Position des Mauszeigers, wobei das Koordinatensystem des Objekts verwendet wird, das dieses Mausereignis erhält. |
Ein Bitfeldargument gibt Informationen in einzelnen Bits zurück. Jedes Bit zeigt an, ob eine bestimmte Bedingung zutrifft oder nicht.
Das MouseDown-Ereignis wird von den drei Mausereignissen am häufigsten verwendet. Es kann z.B. zur Laufzeit zum Neupositionieren von Steuerelementen in einem Formular oder zum Erzeugen von grafischen Effekten verwendet werden. Das MouseDown-Ereignis wird ausgelöst, wenn eine Maustaste gedrückt wird.
Anmerkung Die Mausereignisse werden verwendet, um die verschiedenen Mauszustände zu erkennen und auf sie zu reagieren. Sie sind jedoch separate Ereignisse, die nicht mit dem Click- und dem DblClick-Ereignis verwechselt werden dürfen. Das Click-Ereignis erkennt, wenn eine Maustaste gedrückt und losgelassen wurde, es erkennt dies jedoch als eine einzige Aktion - das Klicken auf eine Maustaste. Das DblClick-Ereignis erkennt entsprechend das zweimalige Drücken und Loslassen einer Maustaste - das Doppelklicken. Ein weiterer Unterschied zwischen den Mausereignissen und dem Click- und dem DblClick-Ereignis besteht darin, daß die Mausereignisse es ermöglichen, zwischen der linken, rechten und mittleren Maustaste sowie der UMSCHALT-, STRG- und ALT-TASTE zu unterscheiden.
Sie können das MouseDown-Ereignis zusammen mit der Move-Methode verwenden, um ein Befehlsschaltfläche-Steuerelement (CommandButton) in einem Formular an eine andere Position zu verschieben. Die neue Position wird durch die Position des Mauszeigers bestimmt: Wenn der Benutzer auf irgendeine Stelle im Formular (außer auf das Steuerelement) klickt, wird das Steuerelement an die neue Position verschoben.
Eine einzige Prozedur, die Form_MouseDown-Prozedur, führt diese Operation durch:
Private Sub Form_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single)
Command1.Move X, Y
End Sub
Die Move-Methode setzt die linke obere Ecke des Befehlsschaltfläche-Steuerelements (CommandButton) auf die Mauszeigerposition, die durch die Argumente x und y angegeben wird.
Die Beispielanwendung "Linien klicken" reagiert auf das Drücken einer Maustaste, indem sie eine Linie von der letzten Zeichenposition zur neuen Position des Mauszeigers zieht. Diese Anwendung verwendet sowohl das MouseDown-Ereignis als auch die Line-Methode. Mit der folgenden Syntax zeichnet die Line-Methode eine Linie vom letzten gezeichneten Punkt bis zum Punkt (x2, y2):
Line - (x2, y2)
Die Anwendung "Linien klicken" verwendet ein leeres Formular mit einer Prozedur (Form_MouseDown):
Private Sub Form_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single)
Line -(X, Y)
End Sub
Abbildung 53: Bei jedem Auslösen des MouseDown-Ereignisses wird eine verbundene Linie gezeichnet |
Die erste Linie beginnt an der festgelegten Startposition zum Zeichnen (linke obere Ecke ist die Voreinstellung). Anschließend zeichnet die Anwendung bei jedem Drücken der Maustaste eine gerade Linie von der letzten Zeichenposition bis zur aktuellen Position des Mauszeigers. Das Ergebnis ist eine Reihe von verbundenen Linien.
Das MouseMove-Ereignis tritt ein, wenn der Mauszeiger über den Bildschirm bewegt wird. Sowohl Formulare als auch Steuerelemente erkennen das MouseMove-Ereignis, solange sich der Mauszeiger in ihrem Innenbereich befindet.
Mit Grafikmethoden können ganz andere Effekte erzielt werden, wenn sie nicht in einer MouseDown-Prozedur, sondern in einer MouseMove-Prozedur verwendet werden. Im Abschnitt "Das MouseDown-Ereignis" weiter oben in diesem Kapitel hat die Line-Methode z.B. verbundene Liniensegmente gezeichnet. In der weiter unten beschriebenen Anwendung "Kritzeln" wird die gleiche Methode in einer Form_MouseMove-Prozedur verwendet, um anstelle verbundener Segmente eine fortlaufende Kurvenlinie zu zeichnen.
In der Anwendung "Kritzeln" wird das MouseMove-Ereignis immer dann erkannt, wenn sich die Mauszeigerposition ändert. Der folgende Code zeichnet eine Linie von der vorhergehenden zur aktuellen Position.
Private Sub Form_MouseMove (Button As Integer, Shift As Integer, X As Single, Y As Single)
Line -(X, Y)
End Sub
Wie in der MouseDown-Prozedur beginnt die von der MouseMove-Prozedur erzeugte Linie in der oberen linken Ecke, wie in Abbildung 54 dargestellt.
Abbildung
54:
Das MouseMove-Ereignis und |
Wie oft wird das MouseMove-Ereignis ausgelöst, während der Benutzer den Mauszeiger über den Bildschirm bewegt?
Visual Basic löst nicht unbedingt für jedes Pixel, über das sich der Mauszeiger bewegt, ein MouseMove-Ereignis aus. Die Betriebsumgebung erzeugt eine begrenzte Anzahl von Maus-Meldungen pro Sekunde.
Das MouseUp-Ereignis tritt ein, wenn der Benutzer die Maustaste losläßt. Es läßt sich in Verbindung mit dem MouseDown- und dem MouseMove-Ereignis nutzbringend einsetzen. Das folgende Beispiel zeigt, wie alle drei Ereignisse miteinander kombiniert werden können.
Die Anwendung "Kritzeln" ist nützlicher, wenn sie das Zeichnen nur bei gedrückter Maustaste ermöglicht und es unterbricht, sobald der Benutzer die Maustaste loslässt. Dazu muss die Anwendung auf die folgenden drei Operationen reagieren:
· Der Benutzer drückt die Maustaste (MouseDown).
· Der Benutzer läßt die Maustaste los (MouseUp).
· Der Benutzer bewegt den Mauszeiger (MouseMove).
Die Ereignisse MouseDown und MouseUp weisen die Anwendung an, den Zeichenvorgang zu beginnen oder abzubrechen. Sie können dies festlegen, indem Sie eine Variable auf Formularebene erstellen, die den Zustand des Zeichenvorgangs speichert. Geben Sie folgende Anweisung im Deklarationsabschnitt des Formular-Code-Moduls ein:
Dim DrawNow As Boolean
DrawNow kann zwei Werte darstellen: True bedeutet "eine Linie zeichnen", und False bedeutet "keine Linie zeichnen".
Da Variablen standardmäßig mit dem Wert 0 (False) initialisiert werden, wird die Anwendung zu Beginn auf "keine Linie zeichnen" gesetzt. In der ersten Zeile der Ereignisprozeduren MouseDown und MouseUp wird der Zeichenmodus dann aktiviert und wieder deaktiviert, indem der Wert der Variablen DrawNow auf Formularebene gesetzt wird.
Private Sub Form_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single)
DrawNow = True
CurrentX = X
CurrentY = Y
End Sub
Private Sub Form_MouseUp (Button As Integer, Shift As Integer, X As Single, Y As Single)
DrawNow = False
End Sub
Die MouseMove-Prozedur zeichnet nur dann eine Linie, wenn DrawNow auf True gesetzt ist. Andernfalls führt die Prozedur keine Operation aus:
Private Sub Form_MouseMove (Button As Integer, Shift As Integer, X As Single, Y As Single)
If DrawNow Then Line -(X, Y)
End Sub
Sobald der Benutzer eine Maustaste drückt, wird die MouseDown-Ereignisprozedur, die den Zeichenmodus aktiviert, ausgeführt. Anschließend wird die MouseMove-Ereignisprozedur wiederholt aufgerufen, solange der Benutzer die Maustaste gedrückt hält und den Mauszeiger über den Bildschirm zieht.
Die Line-Methode gibt den ersten Endpunkt nicht aus. Aus diesem Grund beginnt Visual Basic mit dem Zeichnen an den aktuellen Koordinaten des Mauszeigers. Standardmäßig entsprechen die Zeichenkoordinaten dem letzten gezeichneten Punkt. Die Eigenschaften CurrentX und CurrentY des Formulars wurden in der Form_MouseDown-Prozedur zurückgesetzt.
Die Ereignisse MouseDown, MouseUp und MouseMove verwenden das button-Argument, um zu ermitteln, welche Maustaste(n) oder Taste(n) gedrückt wurde(n). Das button-Argument ist ein Bitfeldargument - ein Wert, in dem jedes Bit einen Zustand darstellt. Diese Werte werden als Ganzzahlen ausgedrückt. Die drei niederstwertigen Bits geben den Zustand der linken, der rechten und der mittleren Maustaste an, wie in Abbildung 55 dargestellt.
Abbildung 55: Bits, die den Zustand der Maustasten anzeigen
Der Standardwert jedes Bits ist 0 (False). Wenn keine Tasten gedrückt werden, ist der Binärwert der drei Bits 000. Wenn Sie die linke Maustaste drücken, ändert sich der Binärwert bzw. das Binärmuster in 001. Der Wert des Bits für die linke Maustaste ändert sich von 0 (False) zu 1 (True).
Das button-Argument verwendet entweder einen Dezimalwert oder eine Konstante, um diese Binärwerte darzustellen. In der folgenden Tabelle sind der Binärwert der Bits, der entsprechende Dezimalwert und die Visual Basic-Konstante aufgeführt:
Binärwert |
Dezimalwert |
Konstante |
Bedeutung |
000 |
0 |
|
Es werden keine Maustasten gedrückt. |
001 |
1 |
vbLeftButton |
Die linke Maustaste wird gedrückt. |
010 |
2 |
vbRightButton |
Die rechte Maustaste wird gedrückt. |
011 |
3 |
vbLeftButton + vbRightButton |
Die linke und die rechte Maustaste werden gedrückt. |
100 |
4 |
vbMiddleButton |
Die mittlere Maustaste wird gedrückt. |
101 |
5 |
vbLeftButton + vbMiddleButton |
Die linke und die mittlere Maustaste werden gedrückt. |
110 |
6 |
vbRightButton + vbMiddleButton |
Die rechte und die mittlere Maustaste werden gedrückt. |
111 |
7 |
vbRightButton + vbMiddleButton + vbLeftButton |
Alle drei Maustasten werden gedrückt. |
Anmerkung In Visual Basic stehen Konstanten zur Verfügung, die die Binärwerte der Argumente button und shift darstellen. Diese Konstanten können anstelle ihrer äquivalenten Dezimalwerte verwendet werden.
Sie können das button-Argument mit dem MouseDown-Ereignis verwenden, um zu prüfen, welche Taste gedrückt wurde, und mit MouseUp, um zu prüfen, welche Taste losgelassen wurde. Da jeweils nur ein Bit für jedes Ereignis gesetzt wird, können Sie nicht feststellen, ob mehrere Maustasten gleichzeitig gedrückt wurden. Mit anderen Worten: MouseDown und MouseUp können jeweils nur einen Tastendruck erkennen.
Anmerkung Mit dem MouseMove-Ereignis können Sie dagegen überprüfen, ob mehrere Maustasten gleichzeitig gedrückt werden.
Sie können mit wenig Code feststellen, welche Taste ein MouseDown- oder ein MouseUp-Ereignis ausgelöst hat. Die folgende Prozedur überprüft, ob button gleich 1, 2 oder 4 ist:
Private Sub Form_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then Print "Linke Maustaste gedrückt."
If Button = 2 Then Print "Rechte Maustaste gedrückt."
If Button = 4 Then Print "Mittlere Maustaste gedrückt."
End Sub
Wenn der Benutzer mehrere Maustasten drückt, interpretiert Visual Basic dies als separate MouseDown-Ereignisse.
Mit dem gleichen Code im MouseUp-Ereignis gibt man eine Meldung aus, wenn gedrückte Taste losgelassen wird.
Beim MouseMove-Ereignis gibt button den vollständigen Zustand der Maustasten an, und nicht nur, welche Maustaste das Ereignis verursacht hat, wie es bei den Ereignissen MouseDown und MouseUp der Fall ist. Die zusätzlichen Informationen stehen zur Verfügung, da im Gegensatz zu den Ereignissen MouseDown und MouseUp, bei denen nur ein Bit pro Ereignis gesetzt wird, alle, mehrere oder keine der Bits gesetzt sein können.
Wenn Sie testen, ob MouseMove gleich 001 (dezimal 1) ist, überprüfen Sie damit, ob ausschließlich die linke Maustaste gedrückt ist, während die Maus bewegt wird. Wenn eine andere Maustaste zusammen mit der linken Maustaste gedrückt gehalten wird, gibt der folgende Code nichts aus:
Private Sub Form_MouseMove (Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then Print "Nur linke Maustaste gedrückt."
End Sub
Verwenden Sie den And-Operator, wenn Sie überprüfen wollen, ob eine bestimmte Maustaste gedrückt wird, und es keine Rolle spielt, ob gleichzeitig andere Maustasten gedrückt werden:
If Button And 1 Then Print "Linke Maustaste gedrückt."
Sie können auch ermitteln, ob mehrere Maustasten gleichzeitig gedrückt werden. Im folgenden Beispiel wird überprüft, ob die linke Taste und die rechte Taste gedrückt sind:
If Button = 3 Then Print "Beide Maustasten gedrückt."
Sie können das button-Argument verwenden, um die weiter oben in diesem Kapitel beschriebene Anwendung "Kritzeln" zu erweitern. Die Anwendung zeichnet dann nicht nur eine durchgezogene Linie, wenn die linke Maustaste gedrückt wird, und unterbricht das Zeichnen, wenn die Taste losgelassen wird, sondern kann auch eine gerade Linie vom zuletzt gezeichneten Punkt zeichnen, wenn der Benutzer die rechte Maustaste drückt.
Beim Schreiben von Code ist es oft hilfreich, jedes maßgebliche Ereignis und die gewünschte Reaktion der Anwendung festzuhalten. In diesem Fall sind die Mausereignisse die drei maßgebenden Ereignisse:
· Form_MouseDown: Dieses Ereignis reagiert je nach Zustand der Maustasten mit unterschiedlichen Aktionen: Wird die linke Maustaste gedrückt, so wird DrawNow auf True gesetzt, und die Zeichenkoordinaten werden zurückgesetzt. Wird die rechte Maustaste gedrückt, so wird eine Linie gezeichnet.
· Form_MouseUp: Wird die linke Maustaste nicht gedrückt, so wird DrawNow auf False gesetzt.
· Form_MouseMove: Wenn DrawNow auf True gesetzt ist, so wird eine Linie gezeichnet.
Die Variable DrawNow muß im Deklarationsabschnitt des Formulars deklariert werden:
Dim DrawNow As Boolean
Die MouseDown-Prozedur muß unterschiedliche Operationen durchführen, je nachdem, ob die linke oder die rechte Maustaste das Ereignis ausgelöst hat:
Private Sub Form_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then
DrawNow = True
CurrentX = X
CurrentY = Y
ElseIf Button = vbRightButton Then
Line -(X, Y)
End If
End Sub
Die folgende MouseUp-Prozedur beendet das Zeichnen nur, wenn die linke Maustaste losgelassen wird:
Private Sub Form_MouseUp (Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then DrawNow = False
End Sub
Wenn innerhalb der MouseUp-Prozedur ein Bit auf 1 (vbLeftButton) gesetzt ist, zeigt dies an, dass die entsprechende Maustaste losgelassen wurde und dass nicht gezeichnet werden kann.
Die folgende MouseMove-Prozedur ist identisch mit der in der Anwendung "Kritzeln" implementierten Version.
Private Sub Form_MouseMove (Button As Integer, Shift As Integer, X As Single, Y As Single)
If DrawNow Then Line -(X, Y)
End Sub