|
|
![]() |
|
||
|
|
|||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||
| Visual Basic Common Control API
Routines Adding a VB Toolbar to a VB StatusBar |
||
| Posted: | Sunday January 20, 2002 | |
| Updated: | Monday December 26, 2011 | |
| Applies to: | VB4-32, VB5, VB6 | |
| Developed with: | VB6, Windows XP | |
| OS restrictions: | None | |
| Author: | VBnet - Randy Birch | |
| Related: | SetParent: Add a VB Toolbar to a MDI Form's StatusBar | |
| Prerequisites |
| None. |
|
|
This
code was prompted by a newsgroup request for code to place a VB command
button inside a VB status bar such that the button reacted
normally to events yet was contained inside the status bar panel area. Attempts to
use SetParent against the command button worked to re-parent the control, however once the parent
was changed the button's events failed to fire. In experimenting, I
found that a regular VB toolbar did fire its events after re-parenting.
I became curious to see if VB controls placed into a toolbar
placeholder also raised events after the SetParent call, and was
pleasantly surprised to find they did. This demo is the result of the
experiment.The toolbar can not have its alignment property set on the form prior to calling SetParent. In addition, since the offset position of a toolbar is always relative to the upper left of the form (regardless of parent), I normally I would have added extra code to calculate and move the toolbar into position in relation to the status bar location using this offset. But I found that I could cheat this need by, at the moment of parenting the toolbar, resetting the alignment property of the status bar to the form top providing a natural offset to the form's corner. Therefore, this code on re-parenting hides the toolbar and status bar, adjusts the control's alignment, calculates the horizontal offset to the panel specified as the 'home' for the toolbar, changes the parent, and re-shows the controls aligned at the bottom of the form. The status bar panel containing the toolbar uses the default AutoSize (no sizing), thereby assuring that the toolbar remains in the current position in the status bar (and as long as all other panels preceding the toolbar panel has this same sizing style). For those wishing to position the toolbar inside the right-most panel to simulate an appearance like Netscape's command toolbar, you will need to add extra code to detect when the form is resized, the new position of the toolbar panel, and then move the toolbar to this new location. Those happy with the buttons on the left (or in any panel so long as all preceding it are sbrNoAutoSize), this code works without change. The Load event of the form handles all the details in creating the toolbar and status bar for this demo. All that is required in addition to a blank toolbar, blank status bar, combo box, text box and command button is an imagelist control containing the button's icons. Note: the combo and text are for demo purposes regarding events. When placed into the status bar, I found their redraw less than optimal should the form be resized horizontally. Vertical resizing seemed to redraw the controls without problem. Note: For MDI forms a modified method is required - see .
|
| BAS Module Code |
| None. |
|
|
| Form Code |
|
|
| Add a toolbar (ToolBar1), statusbar (StatusBar1), combo box (Combo1), text box(Text1) and command button (Command1) to the form. Add an imagelist controls and populate with at least 4 16x16 images. The Load event of the form handles all the details in creating the toolbar buttons and status bar panels for this demo. Paste the following code into the form: |
|
|
Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private defToolbarHwnd As Long
Private Declare Function SetParent Lib "user32" _
(ByVal hWndChild As Long, _
ByVal hWndNewParent As Long) As Long
Private Sub Form_Load()
Dim pnl As Panel
Dim btn As Button
Dim x As Long
'create statusbar
With StatusBar1
For x = 1 To 3
Set pnl = .Panels.Add(, , "", sbrText)
pnl.Alignment = sbrLeft
pnl.Width = 500
pnl.Bevel = sbrInset
If x = 3 Then pnl.AutoSize = sbrSpring
Next
End With
'create toolbar
With Toolbar1
.Align = vbAlignNone
.BorderStyle = ccNone
.Appearance = ccFlat
.TextAlignment = tbrTextAlignBottom
.Wrappable = False
.AllowCustomize = False
.ImageList = ImageList1
.HotImageList = ImageList1
.Style = tbrFlat
Set btn = .Buttons.Add(, , , tbrDefault, 1)
Set btn = .Buttons.Add(, , , tbrDefault, 2)
Set btn = .Buttons.Add(, , "", tbrSeparator)
Set btn = .Buttons.Add(, "phtext", "", tbrPlaceholder)
btn.Width = 1500
Set btn = .Buttons.Add(, , "", tbrSeparator)
Set btn = .Buttons.Add(, , , tbrDefault, 3)
Set btn = .Buttons.Add(, , , tbrDefault, 4)
Set btn = .Buttons.Add(, , "", tbrSeparator)
Set btn = .Buttons.Add(, "phcombo", "", tbrPlaceholder)
btn.Width = 840
Set Combo1.Container = Toolbar1
Set Text1.Container = Toolbar1
End With
'create combo
With Combo1
.Width = Toolbar1.Buttons("phcombo").Width
.Top = (Toolbar1.Height - .Height) \ 2
.Left = Toolbar1.Buttons("phcombo").Left
.AddItem "Red"
.AddItem "Blue"
.AddItem "Green"
.AddItem "Grey"
.ListIndex = 3
End With
'create text
With Text1
.Width = Toolbar1.Buttons("phtext").Width
.Top = (Toolbar1.Height - .Height) \ 2
.Left = Toolbar1.Buttons("phtext").Left
.Text = "type query here"
End With
Command1.Caption = "Set Toolbar"
End Sub
Private Sub Command1_Click()
Dim padding As Long
padding = 60
AttachSBControl Toolbar1, StatusBar1, 1, padding
End Sub
Private Sub Form_Resize()
Toolbar1.Refresh
End Sub
Private Sub Form_Unload(Cancel As Integer)
If defToolbarHwnd <> 0 Then
SetParent Toolbar1.hWnd, defToolbarHwnd
End If
End Sub
Private Function AttachSBControl(tb As Toolbar, _
sb As StatusBar, _
nPanel As Long, _
padding As Long)
Dim x As Long
Dim y As Long
If defToolbarHwnd = 0 Then
'change the parent
defToolbarHwnd = SetParent(tb.hWnd, sb.hWnd)
With sb
'adjust statusbar. Doing it this way
'relieves the necessity of calculating
'the statusbar position relative to the
'top of the form. It happens so fast
'the change is not seen, other than
'the height resizing.
.Align = vbAlignTop
.Visible = False
.Height = tb.Height + padding
'change, move, set width and re-show
'the toolbar in the new parent
tb.Visible = False
tb.Align = vbAlignNone
tb.Appearance = ccFlat
tb.BorderStyle = ccNone
tb.Move (.Panels(nPanel).Left + padding), _
(.Top + padding), _
(.Panels(nPanel).Width - padding), _
(.Height - padding)
tb.Width = 0
For x = 1 To tb.Buttons.Count
y = y + tb.Buttons(x).Width
Next
tb.Width = y + padding
tb.Visible = True
tb.ZOrder 0
'restore the statusbar to the
'bottom of the form and show
.Panels(nPanel).AutoSize = sbrNoAutoSize
.Panels(nPanel).Width = tb.Width + padding
.Align = vbAlignBottom
.Visible = True
End With
End If
End Function
Private Sub Text1_GotFocus()
'show event is raised
With Text1
.SelStart = 0
.SelLength = Len(.Text)
End With
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
'show event is raised
Select Case Button.Index
Case 1: Me.BackColor = &H80&
Case 2: Me.BackColor = &H800000
Case 6: Me.BackColor = &H8000&
Case 7: Me.BackColor = &H8000000F
Case Else
End Select
End Sub
Private Sub Toolbar1_ButtonMenuClick(ByVal ButtonMenu As MSComctlLib.ButtonMenu)
'show event is raised
Select Case ButtonMenu.Index
Case 1: Me.BackColor = &H80&
Case 2: Me.BackColor = &H800000
Case 5: Me.BackColor = &H8000000F
Case 6: Me.BackColor = &H0
End Select
End Sub
Private Sub Combo1_Click()
'show event is raised
Select Case Combo1.ListIndex
Case 0: Me.BackColor = &H80&
Case 1: Me.BackColor = &H800000
Case 2: Me.BackColor = &H8000&
Case 3: Me.BackColor = &H8000000F
End Select
End Sub
|
| Comments |
|
|
|
|
|
|||||
|
|||||
|
|
|||||
|
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |
![]() |