Introduction
It is not possible to directly put a ProgressBar
or a button in a StatusBar
in VB.NET. Solutions are available for C++ or VB 5 or 6.0. This is a way to do it in VB.NET. The previous version of this article, called StatusProgressBar only allowed using a ProgressBar
. This new version extends the technique to any control.
Using the code
First, create a form with a StatusBar
and a ProgressBar
or any kind of control (tested with a button) you will put anywhere. You have to create at least a Panel
in the StatusBar
and make the Panel
s visible (.showpanels = True
). The control put into the status bar will be called "child control".
Create an instance of StatusBarChild
:
sbcProgressBar = New StatusBarChild(ProgressBar1, StatusBar1, 1)
The parameters are the ProgressBar
(ProgressBar1
), the StatusBar
(StatusBar1
) and the number of the statuspanel (0 for the first one on the left). An optional parameter is the margin between the statuspanel's edges and the ProgressBar
. The ProgressBar
is moved to the StatusBar
when you create the StatusBarChild
. You may put a button in the StatusBar
the same way:
sbcButton= New StatusBarChild(Button1, StatusBar1, 1)
The StatusBarChild
object's properties are the child control (.ChildObject
), the StatusBar
(.StatusBar
), the panel number (.Panel
) and the margin (.Margin
). Its only method is .Resize
, you should call it when the parent form is resized. See the demo for details.
How it works
The child control is declared as an object:
Public ChildControl As Control
The child control's parent is first changed:
ChildControl.Parent = StatusBar
Then, it must be displayed in the proper panel. Since there is no property to get the Panel
's actual width, an API call is necessary. SendMessage
returns a RECT
value containing the coordinates of the Panel
.
Private Structure RECT
Friend Left As Int32
Friend Top As Int32
Friend Right As Int32
Friend Bottom As Int32
End Structure
Dim Rectangle As RECT
SendMessage(StatusBar.Handle.ToInt32, SB_GETRECT, Panel, Rectangle)
With ProgressBar
.Left = Rectangle.Left + Margin
.Top = Rectangle.Top + Margin
.Height = Rectangle.Bottom - Rectangle.Top - 2 * Margin
.Width = Rectangle.Right - Rectangle.Left - 2 * Margin
End With
You may use this technique to put any kind of control into a StatusBar
, provided it has a .parent
property.
The demo uses a button in the first panel, and a ProgressBar
in the second one. Click the button to make the bar progress.
History
- 1.1:
Option Strict On
allowed. See the first thread below.
- 1.0: First public version. Did not allow
Option Strict On
.