January 21, 2021
Hot Topics:

Create a Status Bar using the API

  • By Sam Huggill
  • Send Email »
  • More Articles »

I will take you through the functions found in the form's code. The first, create (found under the command button cmdCreate) is, quite obviously, used to create the status bar. When creating it, we need to apply (as a minimum) the WS_CHILD and WS_VISIBLE constants. These force the status bar to be visible and make it a child of our form. If you omitted the WS_CHILD constants the status bar would draw on the desktop. You might want this, although I doubt your users would! Anyway, after that we use the MoveWindow API call. By default, the status bar assumes its own size/position. A call to the MoveWindow function ensures that we can see our status bar.

The next part, AddCaption (found under cmdAddCaption) changes the text in the status bar. I had some problems using this, mainly getting it to draw text in different panels. You will see what I mean when you use it. Anyway, this uses a small routine to apply new text. We use the SendMessage call to apply the new text using the SB_SETTEXT constant. We also include the style for the panel. I have used the default SBT_SUNKEN style but you could use the SBT_POPOUT (included) or other styles supported.

We now apply a font to the status bar. By using the WM_GETFONT we can get the font of our form (set to Tahoma) and then use the WM_SETFONT and SendMessage to apply the font. If you were wrapping this in an activex control, then you would be getting the font of the usercontrol. You can get the font of any object that has a hWnd property.

Notice in the Form_Resize event I have used the MoveWindow call to resize the status bar. If we didn't do this, then the status bar would just stay the same size both in length and width.

The Add function (found under cmdAdd) basically adds a new panel using the SB_SETPARTS and the SendMessage. First, we have to define the size of this panel and then call the SendMessage function. The destroy function just calls the DestroyWindow with a reference to the status bars window handle.

The form requires six command buttons (although this could be scaled down). Rename them cmdDestroy, cmdCreate, cmdAddCaption, cmdFont, cmdAdd and cmdGetText. Copy and paste the code below into the form:

Option Explicit 
'// Holds the window handle for our status bar  
Private lnghWnd As Long 
Private Sub cmdCreate_Click() 
  Dim lngStyle As Long 
  'WS_CHILD - Makes the status bar a child of  
  'this form.  
  'WS_VISIBLE - Makes the statusbar visible  
  lngStyle = lngStyle Or WS_CHILD 
  lngStyle = lngStyle Or WS_VISIBLE 
  '   Make the statusbar using the 
  '   CreateStatusWindow API Call  
  '   Note: This is much easier than using 
  '   the CreateWindowEx API  
  lnghWnd = CreateStatusWindowA _
   (lngStyle, "VB Square API Drawn _
    Statusbar", Me.hWnd, 0) 
  '   By default, our new status bar assumes
  '   its own position and  
  '   size. Use the MoveWindow API to move it 
  '   to the bottom of the form  
  MoveWindow lnghWnd, 0, ScaleHeight - 20, _
    ScaleWidth, 20, True 
End Sub 
Private Sub cmdAddCaption_Click() 
  Dim strText As String 
  '   Sets the caption for both panels using a   
  '   string from an input box  
  '   For some reason the text doesn't draw  
  '   If anyone knows why, please let me know  
  strText = InputBox$ _
   ("Enter a caption...") 
  SetCaption strText 
End Sub 
Private Sub cmdFont_Click() 
  Dim lRet As Long 
  '   Set the font of the status bar using   
  '   the WM_SETFONT by getting the font from
  '   this form using the WM_GETFONT  
  lRet = SendMessage(Me.hWnd, WM_GETFONT, 0, 0) 
  SendMessage lnghWnd, WM_SETFONT, lRet, 0 
End Sub 
Private Sub cmdAdd_Click() 
  Dim lngParts As Long 
  '   Holds the size of the new panel  
  lngParts = ScaleWidth - 100 
  '   Adds the new panel to our status bar  
  SendMessage lnghWnd, SB_SETPARTS, _
   ByVal 2, lngParts 
End Sub 
Private Sub cmdDestroy_Click() 
  '   Use the DestroyWindow API to destroy 
  '   our status bar  
  DestroyWindow lnghWnd 
  '   Set the window handle holder to 0  
  lnghWnd = 0 
End Sub 
Private Sub cmdGetText_Click() 
  Dim pnlNum As Long 
  '   Find out which panel the user wants 
  '   the text from  
  pnlNum = Val _
   (InputBox("Text from panel number:")) 
  '   Return the text using the GetText function  
  MsgBox GetText(pnlNum) 
End Sub 
Private Sub Form_Load() 
  '   Move the form to the centre of the screen  
  Move (Screen.Width - Width) * 0.5, _
   (Screen.Height - Height) * 0.5 
  '   Set the scalemode to pixels because 
  '   certain functions require this.  
  ScaleMode = vbPixels 
End Sub 
Private Sub Form_Resize() 
  '   Use the WM_SIZE constant to resize the  
  '   status bar to keep it at the bottom 
  '   of the form  
  SendMessage lnghWnd, WM_SIZE, 0, 0 
End Sub 
Function GetPanels() As Integer 
  '   Returns the number of panels  
  GetPanels = SendMessage _
   (lnghWnd, SB_GETPARTS, 0, ByVal 0) 
End Function 
Sub SetCaption(strText As String) 
  Dim lngRet As Long 
  '   Set some new text in the status bar using 
  '   the SM_SETTEXT. Use the SBT_ constants 
  '   to define how the panel looks.  
  lngRet = GetPanels() - 1 
  SendMessage lnghWnd, SB_SETTEXT, _
    ByVal SBT_SUNKEN, ByVal strText 
  SendMessage lnghWnd, SB_SETTEXT, _
    ByVal lngRet Or SBT_SUNKEN, ByVal strText 
End Sub 
Function GetTextLen(pnlNum As Long) As Long 
  Dim lngRet As Long 
  '   Returns the lenght of the string 
  '   in the panel  
  lngRet = SendMessage _
   (lnghWnd, SB_GETTEXTLENGTH, ByVal pnlNum, 0) 
  GetTextLen = (lngRet And &HFFFF&) 
End Function 
Function GetText(pnlNum As Long) As String 
  Dim strText As String 
  Dim lngRet As Long 
  '   Returns the string in the panel 
  '   specificed by pnlNum  
  strText = String$(GetTextLen(pnlNum), 0) 
  lngRet = SendMessage(lnghWnd, SB_GETTEXT, _
   ByVal pnlNum, ByVal strText) 
  GetText = Left$(strText, _
   (lngRet And &HFFFF&)) 
End Function  

Page 3 of 3

This article was originally published on November 20, 2002

Enterprise Development Update

Don't miss an article. Subscribe to our newsletter below.

Thanks for your registration, follow us on our social networks to keep up-to-date