MouseOver simulieren
Beispieldatei (MouseOver.zip 17 kB)
Verschiedene Steuerelemente bieten das Ereignis MouseMove an, mit dem man beispielsweise ein Steuerelement farblich hervorheben kann, wenn die Maus darüber bewegt wird.
Leider gibt es kein Ereignis, das ausgelöst wird,
wenn die Maus von dem Steuerelement wegbewegt wird. Als Nothilfe kann man die
Position des Mauszeigers über dem Steuerelement überwachen und die
Farbe zurückändern, wenn sich der Zeiger nahe dem Rand des Elementes
befindet. Der Nachteil dabei ist:
Es funzt nur zuverlässig, wenn man gaaanz langsam die Maus bewegt.
Bei schnellen Bewegungen werden nicht alle Ereignisse abgearbeitet und die Ereignisse
mit den Relevanten X- bzw. Y-Positionen können ausbleiben.
Das gleiche gilt prinzipiell auch für meinen Ansatz
Dabei wird ein unsichtbares Bild-Steuerelement so groß gemacht, dass beim
Verlassen des Buttons ein MouseMove des Bild-Steuerelements ausgelöst wird.
Wenn sich beispielsweise der Button ganz links befindet, kann ein MouseMove
des Bild-Steuerelements nicht ausgelöst werden, wenn man die Maus nach
links bewegt.
Anstatt sich aber auf ein paar Pixel am Rand zu verlassen, wird bei mir der
Rest des ActiveWindow überwacht. Dieses Ereignis ist wahrscheinlicher,
als sich auf das MouseMove-Ereignis des Buttonrandes zu verlassen. Sobald man
sich wieder irgendwo auf dem ActiveWindow befindet, ist das Ereignis da, und
ändert die Farbe. Bei nahe beieinanderstehenden Buttons könnte man
noch in jedem MouseMove-Ereignis der Steuerelemente zusätzlich die Farbe
aller anderen zurücksetzen.
Im folgenden Beispiel muss man wegen der Reihenfolge auf dem Tabellenblatt
erst ein Bild-Steuerelement (hier mit dem Namen imgMouseOver) einfügen,
bevor die Command-Buttons hinzugefügt werden. In den Eigenschaften stellt
man den BackStyle auf Transparent und den BorderStyle auf None.
Nun benötigt man noch drei MouseMove-Prozeduren, einmal von den anschließend
hinzugefügten CommandButtons und zum Anderen von dem Bild-Steuerelement:
Option Explicit
Private Sub cmdMouse1_MouseMove( _
ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, _
ByVal Y As Single)
If cmdMouse1.BackColor <> vbRed Then
With imgMouseOver
.Left = 0
.Top = 0
.Width = ActiveWindow.Width
.Height = ActiveWindow.Height
End With
cmdMouse1.BackColor = vbRed
End If
End Sub
Private Sub cmdMouse2_MouseMove( _
ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, _
ByVal Y As Single)
If cmdMouse2.BackColor <> vbRed Then
With imgMouseOver
.Left = 0
.Top = 0
.Width = ActiveWindow.Width
.Height = ActiveWindow.Height
End With
cmdMouse2.BackColor = vbRed
End If
End Sub
Private Sub imgMouseOver_MouseMove( _
ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, _
ByVal Y As Single)
Dim i As Long
With imgMouseOver
.Left = -100
.Top = -100
.Width = 10
.Height = 10
End With
For i = 1 To Me.OLEObjects.Count
If InStr(1, Me.OLEObjects(i).Name, "cmdMouse") Then
Me.OLEObjects(i).Object.BackColor = vbBlue
End If
Next
End Sub
Als Alternative kann man auch nur das vorher geänderte Steuerelement zurücksetzen, statt alle in einer Schleife anzusprechen. Das ist aber nur sinnvoll, wenn sich wenige, weit auseinanderstehende Steuerelemente auf dem Blatt befinden.
Option Explicit
Private mstrActiveObject As String
Private Sub cmdMouse1_MouseMove( _
ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, _
ByVal Y As Single)
If cmdMouse1.BackColor <> vbRed Then
mstrActiveObject = "cmdMouse1"
With imgMouseOver
.Left = 0
.Top = 0
.Width = ActiveWindow.Width
.Height = ActiveWindow.Height
End With
cmdMouse1.BackColor = vbRed
End If
End Sub
Private Sub cmdMouse2_MouseMove( _
ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, _
ByVal Y As Single)
If cmdMouse2.BackColor <> vbRed Then
mstrActiveObject = "cmdMouse2"
With imgMouseOver
.Left = 0
.Top = 0
.Width = ActiveWindow.Width
.Height = ActiveWindow.Height
End With
cmdMouse2.BackColor = vbRed
End If
End Sub
Private Sub imgMouseOver_MouseMove( _
ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, _
ByVal Y As Single)
Dim i As Long
With imgMouseOver
.Left = -100
.Top = -100
.Width = 10
.Height = 10
End With
Me.OLEObjects(mstrActiveObject).Object.BackColor = vbBlue
End Sub