关于WPS工具栏的操作
本篇文章主要介绍何为CommandBar,并且会附带一下如何隐藏某一个按钮或者某一个工具栏
关于CommandBar的介绍(概念)
1. 什么是CommandBars、CommandBar、CommandBarControls、CommandBarControl
上图中红色框内显示了菜单栏和工具栏,故所有工具栏和菜单栏的集合构成CommandBars,所以其中某一个工具栏对应一个CommandBar,我们会发现每一个工具栏或者菜单栏上面都由许多按钮组成,所以某一个工具栏(CommandBar)上面的所有按钮构成CommandBarControls,其中某一个按钮对应CommandBarControl。
我们可以总结出以下包含关系
CommandBarControl < CommandBarControls < CommandBar < CommandBars < Application
至此我们对工具栏和按钮对应关系有一个大概的了解,基本概念已经清晰
CommandBar的获取和调用
1. 关于CommandBar(工具栏)
在用户应用场景中,有很多用户是不想让用户看见我们的一些功能按钮的,所以他们想要隐藏、禁用某些按钮或者菜单栏的某一项,我们WPS的按钮那么多,不可能每个都记住API怎么操作它的,怎么办呢?
(1) 获取工具栏对象
当我们拖拽工具栏的时候,工具栏左上角会显示工具栏名称,如下图
知道了工具栏名称我们怎么操作呢?
app.get_CommandBars.get_Item('常用')。。。。。。。。。。。。No No No获取工具栏对象是不能用中文名称的,只能用英文或者纯数字(记住啦!!!),那我们怎么知道他对应的英文名称或者数字下标是多少呢?
function findIndexAndEnName() {
var commandbars = app.get_CommandBars();
var barsCount = commandbars.Count;
for (var i = 1; i <= barsCount; ++i) {
var commandbar = commandbars.get_Item(i);
var cnName = commandbar.NameLocal;
if (cnName === '常用') {
var enName = commandbar.Name;
alert('该工具栏对应的英文名称为:' + enName + ',对应的数组下标为:' + i);
return;
}
}
alert('没有找到对应工具栏,请检查名称');
}
执行完上述代码之后,会显示英文名称为Standard下标为1,一定要活灵活用,有时候中文名称匹配不上,那我们可以把所有的工具栏的中文名称和英文名称都打印出来看看哪个是我们想要的,在看看下面代码
function printAllCommandBrsInfo() {
var commandbars = app.get_CommandBars();
var barsCount = commandbars.Count;
for (var i = 1; i <= barsCount; ++i) {
var commandbar = commandbars.get_Item(i);
console.log('下标为' + i + '的工具栏的中文名称为:' + commandbar.NameLocal + ',英文名称为:' + commandbar.Name);
}
}
打印的信息如下图
这样我们是不是就能够找到我们需要的某一个工具栏的,在反思一下,那我们是不是能把打印的信息存到文档里面,下次可以直接用?(灵活、灵活、灵活!!!)
(2) 操控工具栏
通过上述介绍我们已经能够获取到工具栏对象了,那我们可以操作工具栏了,以常用工具栏为例
app.get_CommandBars().get_Item('Standard').Visible = false //隐藏常用工具栏
app.get_CommandBars().get_Item('Standard').Enabled = false //禁用常用工具栏(禁用和隐藏对于工具栏效果是一样的)
app.get_CommandBars().get_Item('Standard').Position = 3 //令工具栏的位置置于底部
...//其他属性和方法可以参考WPS.CHM文档
我们也封装了一个隐藏和显示所有工具栏的方法(包含菜单栏),如下
app.setToolbarAllVisible(false)
(3) 特殊的工具栏(菜单栏)
前面已经讲过工具栏对象的获取和其属性、函数的调用,但是菜单栏也算是工具栏的一种,没有做特殊区分对待的,正常对于window窗口菜单栏和工具栏的概念是完全不同的东西。获取菜单栏代码如下
app.get_CommandBars().get_Item('Menu Bar')
2. 关于CommandBarControl(工具栏按钮)
(1) 获取工具栏按钮对象
之前的介绍可以知道工具栏按钮是工具栏的子集,那我们拿到对应的工具栏对象之后,怎么获取工具栏按钮对象呢?以常用工具栏为例,我们可以打印一下它下面的所有按钮的文字提示,代码如下
function printAllControlInfoForStanardBar() {
var controls = app.get_CommandBars().get_Item('Standard').Controls;
var controlsCount = controls.Count;
for (var i = 1; i <= controlsCount; ++i) {
var control = controls.get_Item(i);
if (null == control) {
continue;
}
console.log('下标为' + i + '的工具栏的中文名称为:' + controls.get_Item(i).Caption);
}
}
打印结果如下图所示
(2) 操控工具栏按钮
重点来了,工具栏按钮对象的获取只能用纯数字或者中文和CommandBar略有区别
app.get_CommandBars().get_Item('Standard').Controls.get_Item('打开(&O)...').Visible = false; //隐藏打开按钮
app.get_CommandBars().get_Item('Standard').Controls.get_Item('打开(&O)...').Enabled = fasle; // 置灰打开文件按钮
app.get_CommandBars().get_Item('Standard').Controls.get_Item('打开(&O)...').Execute(); // 执行点击该按钮的功能(和手动点击一样)
(3) 特殊的工具栏按钮(菜单栏子项下的下拉菜单)
由于菜单栏包含两层工具栏按钮即CommandBar > CommandBarControls > CommandBarControl > CommandBarControls > CommandBarControl,所以对菜单栏下拉菜单操作比较特殊,我们可以参照如下代码打印一下所有菜单栏信息
function printMenuBarChildren() {
var controls = app.get_CommandBars().get_Item('Menu Bar').Controls;
var firstCount = controls.Count;
for (var i = 1; i <= firstCount; ++i) {
console.log('------------------------开始
----------------------------');
var firstControl = controls.get_Item(i);
if (null == firstControl) {
continue;
}
console.log("菜单栏子项中文名称:" + firstControl.Caption + ",下标为:" + i);
var secondControls = firstControl.Controls;
if (null == secondControls) {
continue;
}
var secondCount = secondControls.Count;
for (j = 1; j <= secondCount; ++j) {
var secondControl = secondControls.get_Item(j);
if (null == secondControl) {
continue;
}
console.log("下拉菜单的名称为:" + secondControls.get_Item(j).Caption + ",下标为:" + j);
}
console.log('-------------------------结束
---------------------------');
}
}
打印结果如下
以文件菜单栏和其下拉子项为例,我们可以执行如下操作
// 隐藏文件菜单
app.get_CommandBars().get_Item('Menu Bar').Controls.get_Item('文件(&F)')// 隐藏文件菜单的下拉菜单的新建项
app.get_CommandBars().get_Item('Menu Bar').Controls.get_Item('文件(&F)').Controls.get_Item('新建(&N)').Visible = false;
...
CommandBarControl的事件
1. 如何注册某一个按钮的点击事件
上面已经说过如果获取一个工具栏按钮对象,以常用菜单栏的打开文件按钮为例,注册事件的方法如下
function registerOpenFileButtonEvent() {
var control = app.get_CommandBars().get_Item('Standard').Controls.get_Item('打开(&O)...');
var ret = control.registerEvent("DIID__CommandBarButtonEvents", "Click", "openFileButtonCallBack");
console.log("注册打开文件按钮事件事件结果ret--" + ret);
}function openFileButtonCallBack(commandBarControl, cancel) {
// todo
// commandBarControl为当前触发事件的按钮对象
// cancel的值是可以设置的,设置为true则取消当前按钮执行的操作,默认是false
cancel.SetValue(true);
}
其他按钮也可以参考此种方式注册registerEvent函数的前两个参数是固定的,第三个参数是按钮点击事件触发时的回调函数
2. 如何取消注册某一个按钮的点击事件
当我们注册了某个按钮的点击事件时,在程序运行过程中我们不在需要事件回调响应了,那我们可以取消注册该事件,代码如下
function registerOpenFileButtonEvent() {
var control = app.get_CommandBars().get_Item('Standard').Controls.get_Item('打开(&O)...');
var ret = control.unRegisterEvent("DIID__CommandBarButtonEvents", "Click", "openFileButtonCallBack");
console.log("取消注册打开文件按钮事件事件结果ret--" + ret);
}
参数等等都是和注册事件一致的,只不过取消注册的函数名为unRegisterEvent