Wie man einen Button auf einer Form erstellt, ist klar: Man wählt den Button in der Steuerelement-Liste aus und "zieht" ihn auf die Form. Wenn wir aber nun eine Inputbox mit zusätzlichem Button bestücken wollen, haben wir ein Problem: Wir haben einfache keine Form oder ähnliches, welche die Inputbox darstellt. Das ist auch klar: Die Inputbox wird direkt aus einer DLL erstellt. Das bedeutet, wir müssen mit anderen Mitteln unseren Button auf die Inputbox platzieren.
Dazu bedienen wir uns erst einmal des Subclassings: Windows besitzt ein internes "Post-System", mit dem Nachrichten an die verschiedenen Objekte geschickt werden. Unser Button erfährt so, ob der Mauscursor sich über ihm befindet, ob die Maustaste gedrückt ist oder losgelassen wird, damit er entsprechend reagieren kann, teilweise natürlich auch optisch.
Man kann sich das wie ein Röhrensystem vorstellen: An einer Seite wirft man die Nachricht hinein, über Weichen wird sie dann zu ihrem Bestimmungsort befördert.
Als VB-Programmier bekommt davon erst mal nichts mit. Deswegen muss man die Röhren zu sich "umleiten".
Das geschieht mit folgendem Grundgerüst:
Option Explicit
Private Declare Function SetWindowLong Lib "user32.dll" _
Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32.dll" _
Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
Private Const GWL_WNDPROC As Long = -4
Dim lngWndProc As Long
Public Sub InitSC(lnghWnd As Long)
lngWndProc = SetWindowLong(lnghWnd, GWL_WNDPROC, AddressOf SubclassWndProc)
End Sub
Public Function SubclassWndProc(ByVal lnghWnd As Long, ByVal lngMsg As Long, _
ByVal lngWParam As Long, ByVal lngLParam As Long) As Long
SubclassWndProc = CallWindowProc(lngWndProc, lnghWnd, lngMsg, lngWParam, lngLParam)
End Function
Public Sub TerminateSC(lnghWnd As Long)
SetWindowLong lnghWnd, GWL_WNDPROC, lngWndProc
End Sub |
|
| |