Zum vorherigen AbschnittZum nächsten Abschnitt Eigene Buttons in der Titelleiste anbringen
Oft mangelt es an Platz in der Form oder man will den Anwender nicht mit Unübersichtlichkeit in Form von etlichen Schaltflächen verwirren. Oder Sie wollen in Ihr Programm beispielsweise einen Button einbauen, der auf Wunsch des Benutzers dafür sorgt, dass die Form immer im Vordergrund bleibt. Dann sollte dieser Button auch an passender Stelle liegen. Hier bietet es sich an, einen eigenen, kleinen Button in der Titelleiste der Form anzubringen...
Ihre Bewertung:
 12345
    

Bewertung dieses Tipps:  (bewertet von insgesamt 31 Besuchern)

 Zum vorherigen AbschnittZum nächsten Abschnitt Deklarationen und Funktionen
Kopieren Sie die folgenden Zeilen einfach in ein Modul, die Erklärung des Aufrufs erfolgt im nächsten Abschnitt.

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function
GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As Rect) As Long
Private Declare Function
GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function
SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Function
SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function
SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook&, ByVal lpfn&, ByVal hmod&, ByVal dwThreadId&) As Long
Private Declare Function
UnhookWindowsHookEx Lib "user32" (ByVal hHook&) As Long
 
Private Type Rect
   Left As Long
   Top As Long
   Right As Long
   Bottom As Long
End Type
 
Private Type CWPSTRUCT
   lParam As Long
   wParam As Long
   Message As Long
   hwnd As Long
End Type
 
Private Const WM_COMMAND = &H111
Private Const WM_NCPAINT = &H85
Private Const WM_MOVE = &H3
Private Const SWP_FRAMECHANGED = &H20
Private Const GWL_EXSTYLE = -20
 
Private WHook As Long
Private varForm As Form, varButton As CommandButton
 
Private Function HookProc&(ByVal nCode&, ByVal wParam&, Inf As CWPSTRUCT)
   Dim WinRect As Rect, ButtonLeft As Byte
   
   If Inf.hwnd = GetParent(varButton.hwnd) Then
      'Bei Klick auf den Button
      On Error Resume Next
      If Inf.Message = WM_COMMAND Then Call varForm.TitleBarButton_Click
      On Error GoTo 0
   ElseIf Inf.hwnd = varForm.hwnd Then
      If
varForm.BorderStyle < 4 Then
         If Int(varForm.MaxButton) + Int(varForm.MinButton) < 0 Then
            ButtonLeft = 3 * 16
         Else
            ButtonLeft = 1 * 16
         End If
     
End If
 
      If Inf.Message = WM_NCPAINT Or Inf.Message = WM_MOVE Then
         Call
GetWindowRect(varForm.hwnd, WinRect)
         Call SetWindowPos(varButton.hwnd, 0, _
              WinRect.Right - ButtonLeft - 10 - (varButton.Width / Screen.TwipsPerPixelX), _
              WinRect.Top + 6, varButton.Width / Screen.TwipsPerPixelX, 14, _
              SWP_FRAMECHANGED)
      End If
   End If
End Function
 
Public Sub SetTitleBarButton(Frm As Form, Button As CommandButton)
   Set varForm = Frm
   Set varButton = Button
  
   WHook = SetWindowsHookEx(4, AddressOf HookProc, 0, App.ThreadID)
   Call SetWindowLong(Button.hwnd, GWL_EXSTYLE, &H80)
   Call SetParent(Button.hwnd, GetParent(Frm.hwnd))
End Sub
 
Public Sub Terminate()
   Call UnhookWindowsHookEx(WHook)
   Call SetParent(varButton.hwnd, varForm.hwnd)
End Sub

 Zum vorherigen AbschnittZum nächsten Abschnitt Umgang mit den Funktionen
Um nun einen auf der Form liegenden CommandButton rechts in die Titelleiste zu bekommen, rufen Sie die Funktion "SetTitleBarButton" wie folgt auf:

SetTitleBarButton Me, Command1

Dieser Aufruf (am besten im Form_Load-Ereignis plaziert) würde der Form also als neuen Button in der Titelleiste die Schaltfläche Command1 zuweisen. Beachten Sie, das alle Eigenschaften des CommandButtons mit übernommen werden. Der Button wird eventuell in der Höhe der Titelleiste angepasst, die Breite bleibt bestehen. Außerdem lässt Windows keine Buttons mit der Eigenschaft Style = 1 zu.

Achtung: Denken Sie unbedingt daran, den Button wieder zu entfernen, bevor die Form entladen wird, denn sonst endet das Programm in einem Crash. Fügen Sie Ihrer Form also folgende Zeilen hinzu:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
   Call Terminate
End Sub

Außerdem sollten Sie Ihr Programm in der Entwicklungsumgebung nie mit einem Klick auf den Stop-Button beenden, da so das Form_QueryUnload-Ereignis nicht ausgelöst wird und VB seine Arbeit mit einem ungültigen Vorgang abbricht.

 Zum vorherigen AbschnittZum nächsten Abschnitt Eventhandling
Um auch auf einen Klick auf den Button reagieren zu können, erstellen Sie eine Subroutine namens "TitleBarButton_Click" im Codeteil Ihrer Form. Diese wird beim Betätigen des Buttons aufgerufen. Beachten Sie dabei, das die Subroutine entwerder öffentlich(Public Sub) oder "normal"(Sub) sein muss, also nicht privat(Private Sub). Die Routine sollte so aussehen:

Sub TitleBarButton_Click()
   'Hier gehört der auszuführende Code hin
End Sub

 Zum vorherigen AbschnittZum nächsten Abschnitt Projektdownload
Sie können sich hier ein Beispiel als Projektdatei herunterladen, das alles nochmal etwas anschaulicher demonstriert.
 Projekt herunterladen



Quellen: SHADOWare.de
Letzte Änderung: 22.09.00
©2000 by SHADOWare, Thomas Bachem