代码之家  ›  专栏  ›  技术社区  ›  Ben Robbins

如何以编程方式启用MS Word打印设置对话框中的“选项…”按钮

  •  0
  • Ben Robbins  · 技术社区  · 15 年前

    我正试图在VSTO加载项中显示用于Microsoft Word 2003的MS Word“打印设置”对话框。我可以显示对话框,但对话框左下角的“选项”按钮始终根据以下屏幕捕获禁用。

    alt text http://i47.tinypic.com/f38gbc.jpg

    到目前为止,我所做的相关代码是:

    private void printSetup_Click(CommandBarButton Ctrl, ref bool CancelDefault)
    {
        Dialog dialog = App.Dialogs[WdWordDialog.wdDialogFilePrintSetup];
        Object missing = Type.Missing;
        dialog.Show(ref missing); // Note that the param is TimeOut
    }
    

    有人能告诉我启用选项按钮需要做什么吗?我知道这是可以做到的,因为我们正在替换一个在VBA中用于此操作的模板,并且在那里启用了按钮…

    当做, 本

    2 回复  |  直到 15 年前
        1
  •  0
  •   João Angelo    15 年前

    对话框的属性只能通过后期绑定使用,因为您使用的是C,所以需要使用 InvokeMember 获取和设置与正在使用的对话框相关的值。

    WdWordDialog Enumeration 你知道这是为了 WdWordDialog.wdDialogFilePrintSetup 对话一 Options 属性可用。链接是针对Office2007的,但对于手头的案例来说,它应该足够了。

    有了这些知识,您可以这样做来设置对话框属性值:

    object objectDialog = (object)dialog;
    
    object[] args = new object[1];
    args[0] = (object) null; // Specify value for Options attribute just as in VBA
    
    objectDialog.GetType().InvokeMember(
        "Options", 
        BindingFlags.SetProperty, 
        null, 
        objectDialog, 
        args);
    
        2
  •  0
  •   Ben Robbins    15 年前

    我现在有了一个我从同事那里得到的有效的解决方案。

    虽然它不能解决从任何vsto c代码启动此对话框的更一般情况,但它确实可以通过单击工具栏按钮(这正是我们要做的)正确启动此对话框。所以这为我们解决了问题。

    事实上,我认为这是一个bug(特性?)对于MS Word,没有任何通用的方法可以从代码中显示此对话框并启用“选项…”按钮。我认为只有当对话框被MS Word自动调用时,它才能工作,因为它作为内置控件连接到命令栏。我在vba和通过vsto看到了相同的行为,它们倾向于支持这个理论,即它是一个词限制/错误。

    所以我们以前有这样的代码:

    public MyCommandBar()
    {
      _myBar = App.CommandBars.Add("My Toolbar", 1, Type.Missing, true);
    
      // Add a button to call our custom event handler
      _printSetup = (CommandBarButton)
              _myBar.Controls.Add(MsoControlType.msoControlButton, 
              Type.Missing, Type.Missing, 1, true); 
      _printSetup.Click += printSetup_Click(); // Call the handler shown in my original question
      // More stuff...
    }
    

    当修改为通过将第二个参数(id)从type.missing更改为controls.add()来调用内置控件时,会像这样将“选项…”按钮启用为511(文件打印设置对话框的id):

    public MyCommandBar()
    {
      _myBar = App.CommandBars.Add("My Toolbar", 1, Type.Missing, true);
    
      // Call the built-in File Print Setup dialog automagically
      _printSetup = (CommandBarButton)
              _myBar.Controls.Add(MsoControlType.msoControlButton, 
              511, Type.Missing, 1, true); 
      // More stuff...
    }
    

    希望这能帮助其他遇到这个问题的人。