3

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

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

但是使用 CommandBarPopup 或 msoControlPopup 类型的 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 确定在控件上显示什么(图标、文本、两者)的方式。我还没有发现这一点得到证实,所以我最后希望我做错了什么,事实上,有一种方法可以在运行时在子菜单上插入图标。

感谢您提供的任何启发。

4

2 回答 2

3

好吧,还有更多的风滚草。我很确定这个问题的答案是,这是不可能的。这是我的“证明”:内置子菜单都没有图标(直到我发布上述内容后我才意识到如果您运行上述代码,请转到菜单栏中的工具>自定义,然后单击在 Test 菜单上将其下拉,然后右键单击 Sub1,您应该会看到所有按钮和样式选项都变灰。右键单击 Btn1,它们可用。

任何其他想法仍然欢迎。

于 2011-01-24T23:05:33.217 回答
0

当然,如果您需要设置子菜单标题的图像或 FaceID,这不是子菜单标题的可用方法,但是如果您想在子菜单本身上设置图像或 FaceID,我从这里修改了代码来完成此操作:

 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 和加载的图片。

当然,为了获得“运行时”的影响,我建议将它放在一个函数中,每次用户单击特定控件时都会调用该函数。

在这里也可以进一步扩展它来处理可变图片。

希望这可以帮助。

于 2011-05-24T22:07:56.017 回答