Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / System / Maus u. Kbd. / Wheel

Mausrad-Ereignisse in VB abfangen

Einleitung

Motivation

VB bietet leider keine eingebaute Möglichkeit, das Mausrad ("Mousewheel") zu nutzen. Gerade für das schnelle und komfortable Blättern ("Scrollen") durch größere Datenmengen wäre eine Nutzung das Mausrads auch in VB wünschenswert.

Voraussetzung

Für die folgende Lösung wird die in "Was ist SubClassing - und wie nutzt man es?" vorgestellte "Komponente" benötigt.

Das vollständige Beispiel ist übrigens in folgendem Zip-Archiv zu finden: mwheel.zip (5 KB).

Realisierung

Idee

Bei jedem Dreh am Mausrad wird von Windows (bei korrekt installiertem Maus-Treiber) die WM_MOUSEWHEEL-Nachricht abgeschickt. Dabei wird im höherwertigen Wort von wParam ein Wert für die Drehrichtung mitgeliefert.

Formular

Benötigt wird ein VB-Formular (z.B. Name="frmTest") mit einem Label (Name="lblValue", Caption="50", große Schrift) und einem VScrollBar (z.B. Name="VScroll", Min=0, Max=100, Value=50, LargeChange=10) darauf.

Quelltext / Code

Im Deklarationsteil des Formulars muss die SubClassing-Komponente bekanntgemacht werden:

Private WithEvents Msg As MsgHook

In Form_Load wird der SubClassing-Komponente mitgeteilt, auf welche Nachricht sie überhaupt reagieren soll:

Private Sub Form_Load()
  Set Msg = New MsgHook
  Msg.Hook Me.hWnd, WM_MOUSEWHEEL
End Sub

Die eigentliche Arbeit geschieht im SubClassing-Ereignis Before: Der jeweils ankommende wParam-Wert wird auf seine Dreh-Richtung analysiert und entsprechend die ScrollBar vor oder zurück "gedreht":

Private Sub Msg_Before(uMsg As Long, wParam As Long, lParam As Long, retVal As Long)
  Dim Delta As Integer
  Dim Value As Long
  
  With VScroll
  
    'Mausrad-Drehung bestimmen:
    Delta = (wParam And &HFFFF0000) \ &H10000
    
    'Zielwert bestimmen:
    If Delta < 0 Then
      'nach unten:
      Value = .Value + .LargeChange
    Else
      'nach oben:
      Value = .Value - .LargeChange
    End If
    
    'Min/Max beachten: (wg. Überlauf)
    Select Case Value
    Case Is < .Min: Value = .Min
    Case Is > .Max: Value = .Max
    End Select
    
    'ScrollBar-Anzeige aktualisieren:
    .Value = Value
  
  End With
End Sub

Damit das Label auch immer den aktuellen Wert der ScrollBar wiedergibt, sind noch folgende Ereignis-Prozeduren zu füllen:

Private Sub VScroll_Change()
  VScroll_Scroll
End Sub

Private Sub VScroll_Scroll()
  lblValue.Caption = VScroll.Value
End Sub

So, das war es auch schon! Smile!

Nach dem Speichern kann das Programm getestet werden: Synchron zum Mausrad ändert sich die ScrollBar und damit der angezeigte Wert. Statt einer ScrollBar könnte man analog auch eine TextBox oder ein Grid verwenden...

© Jost Schwider, 27.06.2002-27.06.2002 - http://vb-tec.de/mausrad.htm