vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2022
 
zurück
Rubrik: Oberfläche · Fenster   |   VB-Versionen: VB5, VB604.04.02
Extra-Button in der TitelBar

Dieser Tipp verrät Ihnen, wie sich ein zusätzlicher Button in der Titelzeile Ihrer Anwendung plazieren lässt.

Autor:   Dieter OtterBewertung:     [ Jetzt bewerten ]Views:  24.833 
www.tools4vb.deSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 Beispielprojekt auf CD 

Vielleicht haben Sie es schon in anderen Anwendungen gesehen? Die Anzeige eines zusätzlichen Buttons in der Titelleiste eines Fensters.

Für was soll das gut sein? Es gibt mehrere Beispiele, für die es wirklich sinnvoll ist, einen zusätzlichen Button anzuzeigen. Zum Beispiel dann, wenn man über den Button die aktuelle Form immer im Vordergrund halten will.

Und so geht's:
Erstellen Sie ein neues Projekt und plazieren Sie auf die Form einen Button. Dieser Button soll dann zur Laufzeit in der TitelBar des Fensters angezeigt werden. Nennen Sie den Button cmdTBar (Wichtig! Aber dazu später mehr).

Um den Button in der TitelBar darstellen zu können, müssen wir das Window "subclassen", d.h. wir müssen die Fensternachrichten abfangen, um:

  1. den Button korrekt plazieren zu können (wenn das Fenster neu gezeichnet wird)
  2. auf den Mausklick reagieren zu können

Erstellen Sie also zunächst noch ein neues Modul und fügen den nachfolgenden Code in das Modul:

Option Explicit
 
' alle benötigten API-Deklarationen
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 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 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 As Long, _
  ByVal lpfn As Long, _
  ByVal hmod As Long, _
  ByVal dwThreadId As Long) As Long
 
Private Declare Function UnhookWindowsHookEx Lib "user32" ( _
  ByVal hHook As Long) As Long
 
Private Declare Function GetVersionEx Lib "kernel32" _
  Alias "GetVersionExA" ( _
  lpVersionInformation As OSVERSIONINFO) As Long
 
Private Type OSVERSIONINFO
  dwOSVersionInfoSize As Long
  dwMajorVersion As Long
  dwMinorVersion As Long
  dwBuildNumber As Long
  dwPlatformId As Long
  szCSDVersion As String * 128
End Type
 
Const VER_PLATFORM_WIN32_WINDOWS = 1
Const VER_PLATFORM_WIN32_NT = 2
 
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
 
' Konstanten
Private Const WM_COMMAND = &H111
Private Const WM_NCPAINT = &H85
Private Const WM_MOVE = &H3
Private Const BM_SETSTATE As Long = &HF3
Private Const SWP_FRAMECHANGED = &H20
Private Const GWL_EXSTYLE = -20
 
Private winHook As Long
Private IsWinNT As Boolean
 
' Form, auf der der Button plaziert wird
' Wichtig! Der Button muss "cmdTBar" heißen!
Private oForm As Form
' Fensternachrichten abfangen und auswerten
Private Function Hook(ByVal nCode As Long, _
  ByVal wParam As Long, cSTRUCT As CWPSTRUCT) As Long
 
  Dim R As RECT
  Dim lngPos As Long
  Static bClicked As Boolean
 
  On Error Resume Next
  With oForm
    ' Klick auf Button?
    ' Win9x/ME
    If cSTRUCT.hwnd = GetParent(.cmdTBar.hwnd) And Not IsWinNT Then
      If cSTRUCT.Message = WM_COMMAND Then
        bClicked = Not bClicked
        If bClicked Then Call oForm.cmdTBar_Click
      End If
 
    ' WinNT/2K/XP
    ElseIf cSTRUCT.hwnd = .cmdTBar.hwnd Then
      If cSTRUCT.Message = BM_SETSTATE And cSTRUCT.wParam = 0 Then
        bClicked = Not bClicked
        If bClicked Then
          Call oForm.cmdTBar_Click
        End If
      End If
 
    ElseIf cSTRUCT.hwnd = .hwnd Then
      ' Button entsprechend Fensterstil plazieren
      If .BorderStyle > 0 And .BorderStyle < 4 Then
        lngPos = IIf(.MinButton Or .MaxButton, 3 * 16, 16)
      End If
 
      If cSTRUCT.Message = WM_NCPAINT Or _
        cSTRUCT.Message = WM_MOVE Then
        GetWindowRect .hwnd, R
        SetWindowPos .cmdTBar.hwnd, 0, _
          R.Right - lngPos - 10 - _
          (.cmdTBar.Width / Screen.TwipsPerPixelX), _
          R.Top + 6, .cmdTBar.Width / Screen.TwipsPerPixelX, _
          14, SWP_FRAMECHANGED
      End If
    End If
  End With
  On Error GoTo 0
End Function
' Button in der Titelbar anzeigen
Public Sub ShowTBarButton(F As Form)
  ' Falls Fenster kein Rahmen hat, Prozedur verlassen
  If F.BorderStyle = 0 Then Exit Sub
 
  ' Windows-Version ermitteln
  Dim OSVersion As OSVERSIONINFO
 
  With OSVersion
    .dwOSVersionInfoSize = Len(OSVersion)
    GetVersionEx OSVersion
 
    IsWinNT = (.dwPlatformId = VER_PLATFORM_WIN32_NT) And _
      (.dwMajorVersion >= 4)
  End With
 
  Set oForm = F
 
  winHook = SetWindowsHookEx(4, AddressOf Hook, _
    0, App.ThreadID)
  SetWindowLong oForm.cmdTBar.hwnd, GWL_EXSTYLE, &H80
  SetParent oForm.cmdTBar.hwnd, GetParent(oForm.hwnd)
End Sub
' Button wieder ausblenden
' Muss immer aufgerufen werden, bevor das Fenster
' entladen wird!
Public Sub HideTBarButton()
  If winHook <> 0 Then
    UnhookWindowsHookEx winHook
    SetParent oForm.cmdTBar.hwnd, oForm.hwnd
  End If
End Sub

In Form1, in der der zusätzliche Button angezeigt werden soll, fügen Sie nun noch folgenden Code ein:

Private Sub Form_Load()
  ' Button in die Titelzeile "verschieben"
  ShowTBarButton Me
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  ' Wichtig!
  ' Sonst stürzt Ihnen das Proggi samt IDE ab ;-(
  HideTBarButton
End Sub
Public Sub cmdTBar_Click()
  MsgBox "Klick auf zusätzlichen Button!"
End Sub

Dieser Tipp wurde bereits 24.833 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Aktuelle Diskussion anzeigen (1 Beitrag)

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2022 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel