Reagieren auf Mausereignisse

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 Maus­ereignisse, 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

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 zwei­malige 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.

Verwenden des MouseDown-Ereignisses mit der Move-Methode

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.

Verwenden des MouseDown-Ereignisses mit der Line-Methode

Die Beispielanwendung "Linien klicken" reagiert auf das Drücken einer Maustaste, indem sie eine Linie von der letzten Zeichenposition zur neuen Position des Maus­zeigers 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

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.

Verwenden des MouseMove-Ereignisses mit der Line-Methode

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 Mauszeiger­position ä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
die Line-Methode erzeugen ein einfaches Skizzierprogramm

Funktionsweise des MouseMove-Ereignisses

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

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 abzu­brechen. 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.

Erkennen von Maustasten

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.

Verwenden des button-Arguments mit MouseDown und MouseUp

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.

Verwenden des button-Arguments mit MouseMove

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.

Testen, ob eine einzelne Taste gedrückt wird

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."

Testen, ob mehrere Maustasten gedrückt wurden

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."

Verwenden des button-Arguments zur Erweiterung grafischer Mausanwendungen

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