动态设置CommandBar“Popup”子菜单图标

时间:2011-01-19 16:49:13

标签: vba ms-office commandbar

我只想确认这一点:在Office 2003中,我想创建一个自定义子菜单 - 在运行时,CommandBar用作弹出窗口(msoControlPopup)的用法,并为其设置图像。使用CommandBarButton,这非常简单

Set btn1 = mnu.Controls.Add(msoControlButton, temporary:=True)
btn1.Caption = "Btn1"
btn1.Picture = stdole.LoadPicture("C:\temp\test.bmp")

但是使用类型为msoControlPopup的CommandBarPopup或CommandBarControl,它会失败

Set sub1 = mnu.Controls.Add(msoControlPopup, temporary:=True)
sub1.Caption = "Sub1"
    'object doesn't support this property or method for next line
sub1.Picture = stdole.LoadPicture("C:\temp\test.bmp")

msoControlPopup类型似乎也不允许.Style属性,这就是Office在控件上确定要显示的内容(图标,文本,两者)的方式。我还没有发现这个证明,所以我最后希望我做错了,事实上,有一种方法可以在运行时在子菜单上插入一个图标。

感谢您可以放下任何光线。

2 个答案:

答案 0 :(得分:3)

好多了风滚草。我很确定答案是,它无法完成。这是我的“证明”:内置子菜单都没有图标(我在之后我发布上面的内容之前没有意识到,如果你运行上面的代码,请转到工具>在菜单栏中自定义,然后单击“测试”菜单将其放下,右键单击“Sub1”,您应该看到所有按钮和样式选项显示为灰色。右键单击“Btn1”,它们可用。

还欢迎任何其他想法。

答案 1 :(得分:0)

当然,如果您需要设置子菜单标题的图像或FaceID,这不是子菜单标题的可用方法,但如果您想在子菜单本身上设置图像或FaceID,我修改了{{{ 3}}完成这个:

 Public Sub newSubMenu()
 Dim menuBar As CommandBar
 Dim newMenu As CommandBarControl
 Dim menuItem As CommandBarControl
 Dim subMenuItem As CommandBarControl
 CommandBars("Sub Menu Bar").Delete
 Set menuBar = CommandBars.Add(menuBar:=False, Position:=msoBarPopup, Name:="Sub Menu Bar", Temporary:=True)


   Set newMenu = menuBar.Controls.Add(Type:=msoControlPopup)
   newMenu.Caption = "&First Menu"

   Set newMenu = menuBar.Controls.Add(Type:=msoControlPopup)
   newMenu.Caption = "&Second Menu"

   Set newMenu = menuBar.Controls.Add(Type:=msoControlPopup)
   newMenu.Caption = "&Third Menu"

   Set menuItem = newMenu.Controls.Add(Type:=msoControlButton)

   With menuItem
      .Caption = "F&irst Sub"
      .FaceId = "356"
      .OnAction = "myTest"
   End With

   Set menuItem = newMenu.Controls.Add(Type:=msoControlButton)

   With menuItem
      .Caption = "S&econd Sub"
      .FaceId = "333"
      .OnAction = "otherTest"
   End With

   Set menuItem = newMenu.Controls.Add(Type:=msoControlPopup)
   menuItem.Caption = "Sub Menus"

   Set subMenuItem = menuItem.Controls.Add(Type:=msoControlButton)

   With subMenuItem
      .Caption = "Item 1"
      .FaceId = 321
      .OnAction = "firstMacro"
   End With

   Set subMenuItem = menuItem.Controls.Add(Type:=msoControlButton)

   With subMenuItem
      .Caption = "Item 2"
      '.FaceId = 432
      .Picture = stdole.StdFunctions.LoadPicture("C:\temp\test.bmp")
      .OnAction = "secondMacro"
   End With
   CommandBars("Sub Menu Bar").ShowPopup
End Sub

我对此进行了测试,它似乎适用于FaceID和加载的图片。

当然为了获得“on run time”效果,我建议将其放在每次用户点击特定控件时调用的函数中。

这里可以进一步处理可变图片。

希望这有帮助。