RSS
StartseiteKnowledge LibraryTop 10Impressum

Titellos

Die Titelleiste eines Formulars nach Belieben ein- und ausblenden

Ein Formular ohne Titelleiste ist schnell erstellt? OK - einfach als BorderStyle [0 - Kein] gewählt und fertig. Aber eine ansprechende Darstellung in der Taskleiste wäre doch auch eine feine Sache und die ist spätestens hinüber, wenn man sein titelloses Formular mit einem Menü ausstatten möchte. Einen Ausweg zeigt dieser Artikel.

Ein Formular ohne Titelleiste ist eigentlich schnell erstellt. Einfach als BorderStyle-Eigenschaft [0 – Kein] wählen. Aber ganz so einfach will es Ihnen VB doch nicht machen, wenn Sie Ihr Formular zusätzlich mit einem Menü ausstatten wollen und sei es nur ein Kontextmenü, dann sind auf einmal wieder Titelleiste und Rahmen des Form zu sehen. Selbst wenn die ControlBox-Eigenschaft auf False gesetzt wird und die Caption-Eigenschaft geleert wird, verbleibt ein dünner schwarzer Rahmen.

Das ist aber nicht das einzige Problem, das auftaucht, wenn man ein Form ohne Titelleiste erstellen möchte. Verzichtet man auf den Rahmen für das Formular, entzieht man dem Benutzer auch die Standardfunktionen des Fensters, wie "Verschieben" oder "Schließen", die über die Taskleisten-Schaltfläche des Fensters aufgerufen werden können.

Das dritte Manko titelloser Formulare ist deren Darstellung in der Taskleiste, denn es fehlt das Programm-Symbol und will man einen 3D-Rahmen, egal ob dieser nun änderbar (BorderStyle = [2 – Änderbar]) oder fest (BorderStyle = [3 – Fester Dialog]) sein soll, muss man auch auf die Beschriftung der Taskleisten-Schaltfläche verzichten.

Dabei erlaubt es Windows auf recht simple Weise separat festzulegen, ob ein Fenster eine Titelleiste haben soll oder nicht. Der dafür zuständige Fensterstil WS_CAPTION kann über die API Funktion SetWindowLong entfernt oder gesetzt werden und entsorgt zugleich einen eventuell vorhandenen Rahmen, wenn Menüs zum Einsatz kommen. Der aktuelle Fensterstil wird über die API Funktion GetWindowLong ausgelesen.

Private Declare Function GetWindowLong Lib "user32" Alias _
  "GetWindowLongA" _
 (ByVal hwnd As Long, ByVal nIndex 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 Const GWL_STYLE = (-16)
Private Const WS_CAPTION = &HC00000

Private Declare Function DrawMenuBar Lib "user32" _
       (ByVal hwnd As Long) As Long

Public Property Get ShowCaption(ByRef Form As Form) As Boolean
  ShowCaption = (GetWindowLong(Form.hwnd, GWL_STYLE) _
                 And WS_CAPTION) = WS_CAPTION
End Property

Public Property Let ShowCaption(ByRef Form As Form, _
                                ByVal New_Value As Boolean)
  Dim lngStyle As Long
  
  lngStyle = GetWindowLong(Form.hwnd, GWL_STYLE)
  
  If (New_Value) Then
    lngStyle = lngStyle Or WS_CAPTION
  Else
    lngStyle = lngStyle And Not WS_CAPTION
  End If
  
  SetWindowLong Form.hwnd, GWL_STYLE, lngStyle
  DrawMenuBar Form.hwnd
End Property