你所不知道的CommandBar

Office能够让你写插件。2003系列虽然已经远去,其CommandBar也被2007的Ribbon给替代。但是,你未必就完全了解了这个存在多年看似简单,实则狗屎的CommandBar。

我们翻开手册(其实没有什么手册,在2007之前,office是没有提供给VBA程序员之外的文档的),发现Application对象上有一个CommandBars属性。我们可以调用其Add方法给它添加一个CommandBar。

application.CommandBars.Add("Spike", MsoBarPosition.msoBarTop, false, true);


问题:
我要是第二次启动是不是会创建第二Spike Command Bar,第三次就有三个了?

我们在word中,把command bar显示出来,然后拖拽到底部。

问题:
再次启动word,这个command bar是在顶部还是在底部?

然后我们把我们的插件卸载了。重新启动word 2003。

问题:
Spike Command Bar 还在那里吗?

我们继续翻开手册,发现给command bar添加一个Label也不是什么很难的事情。很简单嘛,一行搞定。

commandBar.Controls.Add(MsoControlType.msoControlLabel, Type.Missing, Type.Missing, Type.Missing, true);


我kao,真TMD的天才。我连Type.Missing都知道用诶。

问题:
这行有错嘛?错误在哪里?

如果要添加的是一个按钮并响应点击事件呢?也很简单,两行搞定

CommandBarButton button = (CommandBarButton) commandBar.Controls.Add(MsoControlType.msoControlButton, Type.Missing, Type.Missing, Type.Missing, true);
button.Click += delegate { MessageBox.Show("Hello!"); };


我要是刚学C#,我都为我自己骄傲。看看,我不但知道它返回的类型是CommandBarButton,还会华丽的delegate语法。

问题:
这行能运行吗?运行起来啥效果?

问题:
第二次启动word,是有一个button还是两个button。


恩,既然自己加一个button能响应点击事件。而且它还有一个参数叫Cancel Default呢。老板正好叫我把Cut按钮给禁用了。简单,找到Cut按钮,响应Click事件,Cancel Default。

CommandBarButton cutButton = (CommandBarButton)application.CommandBars.FindControl(Type.Missing, CUT_BUTTON_CONTROL_ID, Type.Missing, Type.Missing);
cutButton.Click += delegate(CommandBarButton ctrl, ref bool cancelDefault) { cancelDefault = true; };


居然连FindControl都会用,太神奇了。

问题:
这行能用吗?运行起来啥效果?

button还有一个state状态。我一行就能toggle它了:

button.State = button.State == MsoButtonState.msoButtonDown
                               ? MsoButtonState.msoButtonUp
                               : MsoButtonState.msoButtonDown;


You are the genius!~~~

问题:
我打开了两篇文档,两篇文档对应窗口上的button状态是和文档想关联的。也就是互相状态独立。能做到吗?如果不能,要怎么做?

终结者QA

一天下午,我们PM走过来,创建了一个word的快捷方式在桌面上。把word窗口缩放到一个合适的位置。关闭所有的word实例。然后只见他快速地,迅雷不及掩耳的,说时迟那是快的,三击了word的快捷方式:

问题:
请问有几个word进程

问题:
我的状态独立版的command bar还在那吗?为什么?

你可能感兴趣的:(C++,c,C#,Office,VBA)