Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Workshops / SubClassing / Beispiel

Beispiel: Bei Bewegung Beep

So, nach der ganzen Theorie soll nun ein kleines, aber voll funktionstüchtiges Beispiel folgen. Bitte beachten Sie, daß das SubClassen eine äußerst kritische Angelegenheit ist, d.h. Sie sollten so oft wie möglich ihr Projekt speichern und vor allem niemals das VB-Programm über den Ende-Button im Menü oder in der VB-Symbolleiste abbrechen, sondern immer das saubere Programmende (z.B. über den Close-Button des Formulars) wählen.

Legen Sie in VB ein neues Projekt an. Fügen Sie ein neues BAS-Modul hinzu und nennen sie es z.B. "WinProcModule". Geben Sie im Modul folgenden Code ein:
'----- Deklarationsteil -----
Option Explicit

Private Const GWL_WNDPROC = -4

'Messagetypen:
Private Const WM_ACTIVATEAPP = &H1C
Private Const WM_ENTERSIZEMOVE = &H231
Private Const WM_EXITSIZEMOVE = &H232
Private Const WM_MOVING = &H216
Private Const WM_SIZING = &H214

Private Declare Function CallWindowProcA Lib "user32" ( _
    ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, _
    ByVal Msg As Long, ByVal wParam As Long, _
    ByVal lParam As Long) As Long
Private Declare Function SetWindowLongA Lib "user32" ( _
    ByVal hWnd As Long, ByVal nIndex As Long, _
    ByVal dwNewLong As Long) As Long

Private VorigeAddr As Long 'Ursprünglicher Empfänger
Private WinHandle As Long  'Windows-Objekt-Handle

'----- Prozeduren -----
Public Sub DoSubClass(ByVal hWnd As Long)
  WinHandle = hWnd
  VorigeAddr = SetWindowLongA(hWnd, GWL_WNDPROC, _
      AddressOf TestWndProc)
End Sub

Public Sub UndoSubClass()
  SetWindowLongA WinHandle, GWL_WNDPROC, VorigeAddr
End Sub

Public Function TestWndProc( _
    ByVal hWnd As Long, ByVal uMsg As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long

  'Nachricht "analysieren":
  If uMsg = WM_MOVING Then Beep

  'Nachricht weiterleiten:
  TestWndProc = CallWindowProcA(VorigeAddr, hWnd, _
      uMsg, wParam, lParam)
End Function
Geben Sie im Code-Bereich des Formulars folgendes ein:
Private Sub Form_Load()
  DoSubClass Me.hWnd
End Sub

Private Sub Form_Unload(Cancel As Integer)
  UndoSubClass
End Sub
Speichern Sie das ganze Projekt ab und starten Sie erst dann das Programm. Wenn das Formular nun auf dem Bildschirm verschoben wird, ertönt eine Folge von Beep-Lauten... Jeder Beep entspricht einer WM_MOVING-Nachricht!

Experimentieren Sie ruhig mit den anderen Messagetypen. Man beachte, wie oft es piept... Es sollte klar sein, daß man bei der Analyse und Verarbeitung der Nachrichten in unserer VB-Funktion nicht zuviel Zeit verschwenden sollte. Besonders mutige können ja mal statt
If uMsg = WM_MOVING Then Beep
einfach nur Beep schreiben, so daß es bei jeder Windows-Nachricht an das Formular piept... Viel Vergnügen!
...>>

© Jost Schwider, 29.04.2000-30.04.2000 - http://vb-tec.de/subclas3.htm