Team LiB
Previous Section Next Section

Menus

Again, with a few variations, the little demonstration in this section is complements of some friends of mine at Microsoft. Like before, it shows some very interesting features. Here is the code:

Sub AddNewMB()
   Dim MBar As CommandBar, MBarCtl As CommandBarControl
   Dim MBarSubCtl As CommandBarControl
   On Error GoTo AddNewMB_Err

   ' Create a new menu bar and dock it on the left.
   Set MBar = CommandBars.Add(Name:="Sample Menu Bar", Position:= _
      msoBarTop, MenuBar:=True, Temporary:=False)
   ' Make the menu bar visible.
   MBar.Visible = True
   ' Prevent users from undocking the menu bar.
   MBar.Protection = msoBarNoMove

   ' Create a popup control on the bar and set its caption.
   Set MBarCtl = MBar.Controls.Add(Type:=msoControlPopup)
   MBarCtl.Caption = "Displa&y"

   ' Create 2 controls on the Display popup and set some properties.
   Set MBarSubCtl = MBarCtl.Controls.Add(Type:=msoControlButton)
   With MBarSubCtl
      .Style = msoButtonIconAndCaption
      .Caption = "E&nable ClickMe"
      .FaceId = 59
      .OnAction = "=ToggleClickMe()"
      .Parameter = 1
      .BeginGroup = True
   End With
   Set MBarSubCtl = MBarCtl.Controls.Add(Type:=msoControlButton)
   With MBarSubCtl
      .Style = msoButtonIconAndCaption
      .Caption = "Di&sable ClickMe"
      .FaceId = 276
      .OnAction = "=ToggleClickMe()"
      .Parameter = 2
      .BeginGroup = True
   End With

   ' Add another control to the menu bar.
   Set MBarCtl = MBar.Controls.Add(Type:=msoControlButton)
   With MBarCtl
      .BeginGroup = True
      .Caption = "&ClickMe"
      .Style = msoButtonCaption
      .OnAction = "=MsgBox(""You clicked ClickMe"")"
   End With

   ' Add a control to make this menu bar invisible and bring back
   ' the system menu bar.
   Set MBarCtl = MBar.Controls.Add(Type:=msoControlButton)
   With MBarCtl
      .BeginGroup = True
      .Caption = "&Set Visibility Off"
      .Style = msoButtonCaption
      .OnAction = "=SampleMenuDisable()"
   End With
   Exit Sub
AddNewMB_Err:
   MsgBox "Error " & Err.Number & vbCr & Err.Description
   Exit Sub
End Sub

'****************************************************************
' This procedure uses the Parameter property of a command bar
' control to execute a different action depending on which item
' you click on a popup menu.
'****************************************************************
Function ToggleClickMe()
   Dim MyMenu As CommandBar
   Dim MBarClickMe As CommandBarControl
   On Error GoTo ToggleClickMe_Err
   Set MyMenu = CommandBars("Sample Menu Bar")
   Set MBarClickMe = MyMenu.Controls(2)
   ' The ActionControl property of command bars returns the control
   ' whose OnAction property is running this procedure.
   With CommandBars.ActionControl
      Select Case .Parameter
         Case 1
            MBarClickMe.Enabled = True
         Case 2
            MBarClickMe.Enabled = False
      End Select
   End With
   Exit Function
ToggleClickMe_Err:
   MsgBox "Error " & Err.Number & vbCr & Err.Description
   Exit Function
End Function

'****************************************************************
' This function restores the original menu bar. Because there can
' only be one system menu bar, you must hide the sample menu bar
' when you want to bring back the previous system menu bar.
'****************************************************************
Function SampleMenuDisable()
   Application.CommandBars("Sample Menu Bar").Visible = False
   Application.CommandBars("Menu Bar").Visible = True
End Function

If you run the original procedure, you end up with the menu bar, shown here.

Click To expand

In the code, you create the menu bar as follows:

Set MBar = CommandBars.Add(Name:="Sample Menu Bar", Position:= _
      msoBarTop, MenuBar:=True, Temporary:=False)
   ' Make the menu bar visible.
   MBar.Visible = True
   ' Prevent users from undocking the menu bar.
   MBar.Protection = msoBarNoMove

You add the menu bar to the CommandBars collection as you did with the toolbar before. You even set its position at msoBarTop. You have to set its visibility, as before, to true. In this case, however, you prevent the user from undocking the menu by setting the Protection property to msoBarNoMove.

Again, like before, you add controls to the menu bar. The first of these is defined as follows:

' Create a popup control on the bar and set its caption.
Set MBarCtl = MBar.Controls.Add(Type:=msoControlPopup)
MBarCtl.Caption = "Displa&y"

This code adds a menu item (called a CommandBarControl object) to the “Sample Menu Bar” menu bar. The menu item’s caption is “Display.”

The following code then adds another menu item (or CommandBarControl object) to the menu item whose caption is Display:

Set MBarSubCtl = MBarCtl.Controls.Add(Type:=msoControlButton)
   With MBarSubCtl
      .Style = msoButtonIconAndCaption
      .Caption = "E&nable ClickMe"
      .FaceId = 59
      .OnAction = "=ToggleClickMe()"
      .Parameter = 1
      .BeginGroup = True
   End With

This means that when the user selects the Display menu item, a drop-down menu that includes the item “Enable ClickMe” appears. (Subsequent code also adds another menu item captioned “Disable ClickMe.”) The string assigned to the OnAction property can be used to define a command or procedure that is to be executed when this menu item is selected.

Both the Enable ClickMe and Disable ClickMe items refer to the ToggleClickMe procedure. This procedure either enables or disables the ClickMe button. It retrieves a reference to the second control on the command bar (the one captioned “ClickMe”). It then looks at the value of the Parameter property, which is passed to the procedure defined by the OnAction property. Based on the value of this parameter, it decides whether to enable or disable the ClickMe button.

Even though this seems like a lot of code, based upon what you have learned already, it is pretty straightforward and easy to follow.


Team LiB
Previous Section Next Section