Show and Hide a Form's Titlebar at run-time

This tip shows you how to show and hide the title bar of a window at run-time. To make a window's title bar disappear, you have to remove the control box, the maximise box and the minimise box as well as set the caption of the form to blank. Unfortunately, VB's ControlBox, MinButton and MaxButton properties of a form are read-only so you can normally only do this at design time. However, by manipulating the style of the window using API calls, you can get the same thing to happen at run-time.

Start a new project in VB. Add the following code to the project's form:

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 GetWindowLong Lib "user32" _
   Alias "GetWindowLongA" _
   (ByVal hwnd As Long, ByVal nIndex As Long) As Long 
Private Const GWL_STYLE = (-16) 
Private Const WS_CAPTION = &HC00000 ' WS_BORDER Or WS_DLGFRAME 
Private Const WS_MAXIMIZEBOX = &H10000 
Private Const WS_MINIMIZEBOX = &H20000 
Private Const WS_SYSMENU = &H80000 

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 Enum ESetWindowPosStyles 
    SWP_SHOWWINDOW = &H40 
    SWP_HIDEWINDOW = &H80 
    SWP_FRAMECHANGED = &H20 ' The frame changed: send WM_NCCALCSIZE 
    SWP_NOACTIVATE = &H10 
    SWP_NOCOPYBITS = &H100 
    SWP_NOMOVE = &H2 
    SWP_NOOWNERZORDER = &H200 ' Don't do owner Z ordering 
    SWP_NOREDRAW = &H8 
    SWP_NOREPOSITION = SWP_NOOWNERZORDER 
    SWP_NOSIZE = &H1 
    SWP_NOZORDER = &H4 
    SWP_DRAWFRAME = SWP_FRAMECHANGED 
    HWND_NOTOPMOST = -2 
End Enum 

Private Declare Function GetWindowRect Lib "user32" ( _
      ByVal hwnd As Long, lpRect As RECT) As Long 
Private Type RECT 
    Left As Long 
    Top As Long 
    Right As Long 
    Bottom As Long 
End Type 

Private Function ShowTitleBar(ByVal bState As Boolean) 
Dim lStyle As Long 
Dim tR As RECT 

   ' Get the window's position: 
   GetWindowRect Me.hwnd, tR 

   ' Modify whether title bar will be visible: 
   lStyle = GetWindowLong(Me.hwnd, GWL_STYLE) 
   If (bState) Then 
      Me.Caption = Me.Tag 
      If Me.ControlBox Then 
         lStyle = lStyle Or WS_SYSMENU 
      End If 
      If Me.MaxButton Then 
         lStyle = lStyle Or WS_MAXIMIZEBOX 
      End If 
      If Me.MinButton Then 
         lStyle = lStyle Or WS_MINIMIZEBOX 
      End If 
      If Me.Caption <> "" Then 
         lStyle = lStyle Or WS_CAPTION 
      End If 
   Else 
      Me.Tag = Me.Caption 
      Me.Caption = "" 
      lStyle = lStyle And Not WS_SYSMENU 
      lStyle = lStyle And Not WS_MAXIMIZEBOX 
      lStyle = lStyle And Not WS_MINIMIZEBOX 
      lStyle = lStyle And Not WS_CAPTION 
   End If 
   SetWindowLong Me.hwnd, GWL_STYLE, lStyle 

   ' Ensure the style takes and make the window the 
   ' same size, regardless that the title bar etc 
   ' is now a different size: 
   SetWindowPos Me.hwnd, _
       0, tR.Left, tR.Top, _
       tR.Right - tR.Left, tR.Bottom - tR.Top, _
       SWP_NOREPOSITION Or SWP_NOZORDER Or SWP_FRAMECHANGED 

   Me.Refresh 

   ' Ensure that your resize code is fired, as the client area 
   ' has changed: 
   Form_Resize 

End Function 

To try out the hiding and showing the title bar, add a CheckBox to the project's form. Set the check box's Value property to 1 (Checked). Then put the following code under the Check box's click event:

Private Sub Check1_Click() 
    If (Check1.Value = Checked) Then 
        ShowTitleBar True 
    Else 
        ShowTitleBar False 
    End If 
End Sub 

When you click on the check box, the form's titlebar will be alternately hidden and shown.