Zurück zur Homepage

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 As Single, _
   
ByVal 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 As Single, _
   
ByVal 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 As Single, _
   
ByVal As Single)
   
Dim 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 As Single, _
   
ByVal 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 As Single, _
   
ByVal 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 As Single, _
   
ByVal As Single)
   
Dim As Long
   
With imgMouseOver
      .Left = -100
      .Top = -100
      .Width = 10
      .Height = 10
   
End With
   Me.OLEObjects(mstrActiveObject).Object.BackColor = vbBlue
End Sub