Appearance
自定义菜单相关方法
自定义主菜单相关方法
AddCustomMenu2
语法:
javascript
AddCustomMenu2(menuPos, cmnuCaption)
功能:
在菜单栏里增加一个自定义主菜单项目。
参数:
名称 | 必选/可选 | 数据类型 | 说明 |
---|---|---|---|
menuPos | 必选 | long | 菜单的位置,取值0-9 |
cmnuCaption | 必选 | string | 菜单标题 |
返回值:
无返回值
说明:
在菜单栏里增加一个自定义主菜单项目。请参考AddCustomMenuItem2方法和OnCustomMenuCmd2事件的介绍。并不能捕获点击弹出菜单的事件,只能捕获菜单项目(MenuItem)的事件。
使用示例:
javascript
// 简单示例
for(var menuPos = 0; menuPos < 3; menuPos++) {
OCX_OBJ.AddCustomMenu2(menuPos, "菜单" + menuPos + "(&" + menuPos + ")");
}
AddCustomMenuItem2
语法:
javascript
AddCustomMenuItem2(menuPos, subMenuPos, subsubMenuPos, isSubMenu, cmnuCaption, [IsSeparator], [cmnuID])
功能:
在指定自定义主菜单中增加一个自定义子菜单项目。
参数:
名称 | 必选/可选 | 数据类型 | 说明 |
---|---|---|---|
menuPos | 必选 | long | 菜单的位置,取值0-9 |
subMenuPos | 必选 | long | 二级菜单位置,取值0-39 |
subsubMenuPos | 必选 | long | 三级菜单位置,取值-1-48 |
isSubMenu | 必选 | bool | 是否是二级菜单子菜单 |
cmnuCaption | 必选 | string | 菜单标题 |
IsSeparator | 可选 | bool | 是否分隔,默认false |
cmnuID | 可选 | long | 菜单ID,默认=0 |
返回值:
无返回值
说明:
在指定自定义主菜单中增加一个自定义二级或者三级菜单项目(主菜单作为一级菜单)自定义主菜单采用AddCustomMenu2方法添加。
参数说明:
menuPos
:要在其中增加项目的自定义主菜单(一级菜单)的位置。0-9。该自定义主菜单必须已经使用AddCustomMenu2方法增加subMenuPos
:要增加的项目在二级菜单项中的位置。必须从0开始增加此参数。取值:0-39subsubMenuPos
:要增加的项目在三级菜单项中的位置。必须从0开始增加此参数。取值:-1-48。如果为-1,则增加二级菜单的项目或者子菜单。如果为0-48,则增加三级菜单条目isSubMenu
:说明该菜单项目是否是一个二级菜单中的子菜单,而不是菜单项目cmnuID
:菜单的ID。可以被用来在事件处理程序OnCustomMenuCmd2中判断用户单击了哪个菜单项目
使用示例:
javascript
// 详细示例
function initCustomMenus() {
var myobj = OCX_OBJ;
for(var menuPos = 0; menuPos < 3; menuPos++) {
myobj.AddCustomMenu2(menuPos, "菜单" + menuPos + "(&" + menuPos + ")");
for(var submenuPos = 0; submenuPos < 10; submenuPos++) {
if(1 == (submenuPos % 3)) { // 主菜单增加分隔符
myobj.AddCustomMenuItem2(menuPos, submenuPos, -1, false, "-", true);
}
else if(0 == (submenuPos % 2)) { // 主菜单增加子菜单
myobj.AddCustomMenuItem2(menuPos, submenuPos, -1, true, "子菜单" + menuPos + "-" + submenuPos, false);
// 增加子菜单项目
for(var subsubmenuPos = 0; subsubmenuPos < 9; subsubmenuPos++) {
if(0 == (subsubmenuPos % 2)) { // 增加子菜单项目
myobj.AddCustomMenuItem2(menuPos, submenuPos, subsubmenuPos, false,
"子菜单项目" + menuPos + "-" + submenuPos + "-" + subsubmenuPos, false,
menuPos * 100 + submenuPos * 20 + subsubmenuPos);
}
else { // 增加子菜单分隔
myobj.AddCustomMenuItem2(menuPos, submenuPos, subsubmenuPos, false, "-" + subsubmenuPos, true);
}
// 测试禁用和启用
if(2 == (subsubmenuPos % 4)) {
myobj.EnableCustomMenuItem2(menuPos, submenuPos, subsubmenuPos, false);
}
}
}
else { // 主菜单增加项目
myobj.AddCustomMenuItem2(menuPos, submenuPos, -1, false,
"菜单项目" + menuPos + "-" + submenuPos, false, menuPos * 100 + submenuPos);
}
// 测试禁用和启用
if(1 == (submenuPos % 4)) {
myobj.EnableCustomMenuItem2(menuPos, submenuPos, -1, false);
}
}
}
}
EnableCustomMenuItem2
语法:
javascript
EnableCustomMenuItem2(menuPos, subMenuPos, subsubMenuPos, bEnabled)
功能:
用来禁用或者允许使用某个菜单项目。
参数:
名称 | 必选/可选 | 数据类型 | 说明 |
---|---|---|---|
menuPos | 必选 | long | 菜单的位置,取值0-9 |
subMenuPos | 必选 | long | 二级菜单位置,取值0-39 |
subsubMenuPos | 必选 | long | 三级菜单位置,取值-1-48 |
bEnabled | 必选 | bool | 是否禁用指定的菜单项目 |
返回值:
无返回值
说明:
用来禁用或者允许使用某个菜单项目。
参数说明:
menuPos
:要允许/禁用的项目的自定义主菜单(一级菜单)的位置。0-9subMenuPos
:要允许/禁用的项目在二级菜单项中的位置。必须从0开始增加此参数。取值:0-39subsubMenuPos
:要允许/禁用的项目在三级菜单项中的位置。必须从0开始增加此参数。取值:-1-48bEnabled
:说明是允许还是禁用指定的菜单项目
使用示例:
javascript
// 禁用菜单项目
OCX_OBJ.EnableCustomMenuItem2(0, 1, -1, false);
// 启用菜单项目
OCX_OBJ.EnableCustomMenuItem2(0, 1, -1, true);
RemoveCustomMenu2
语法:
javascript
RemoveCustomMenu2(menuPos)
功能:
删除指定的自定义主菜单项目。
参数:
名称 | 必选/可选 | 数据类型 | 说明 |
---|---|---|---|
menuPos | 必选 | long | 菜单的位置,取值0-9 |
返回值:
无返回值
说明:
删除指定的自定义主菜单项目。
使用示例:
javascript
// 删除第一个自定义菜单
OCX_OBJ.RemoveCustomMenu2(0);
已过时的自定义菜单方法
AddCustomMenuItem [已过时]
语法:
javascript
AddCustomMenuItem(cmnuCaption, [IsSeparator], [IsNeedOpenDoc], [cmnuID])
功能:
在自定义的主菜单中增加自定义菜单项。
参数:
名称 | 必选/可选 | 数据类型 | 说明 |
---|---|---|---|
cmnuCaption | 必选 | string | 菜单项目的标题 |
IsSeparator | 可选 | bool | 是否分隔,默认为false |
IsNeedOpenDoc | 可选 | bool | 是否需要打开文档,默认为true |
cmnuID | 可选 | long | 菜单ID,默认=0 |
返回值:
无返回值
说明:
在自定义的主菜单中增加自定义菜单项。该方法不建议继续采用,建议采用AddCustomMenu2和AddCustomMenuItem2方法。
使用示例:
javascript
// 增加菜单项目
OCX_OBJ.AddCustomMenuItem("创建Word文档", false, false, 1);
// 增加分隔符
OCX_OBJ.AddCustomMenuItem("");
RemoveCustomMenuItem [已过时]
语法:
javascript
RemoveCustomMenuItem(index)
功能:
在自定义的主菜单中删除一个自定义菜单项。
参数:
名称 | 必选/可选 | 数据类型 | 说明 |
---|---|---|---|
index | 必选 | long | 菜单索引值 |
返回值:
无返回值
说明:
在自定义的主菜单中删除一个自定义菜单项。该方法不建议继续采用,建议采用RemoveCustomMenu2方法。
ClearAllCustomMenuItems [已过时]
语法:
javascript
ClearAllCustomMenuItems()
功能:
删除所有的自定义主菜单项目。
返回值:
无返回值
说明:
删除所有的自定义主菜单项目。
文件菜单相关方法
AddFileMenuItem
语法:
javascript
AddFileMenuItem(cmnuCaption, [IsSeparator], [IsNeedOpenDoc], [cmnuID])
功能:
在自定义的文件菜单中增加自定义菜单项。
参数:
名称 | 必选/可选 | 数据类型 | 说明 |
---|---|---|---|
cmnuCaption | 必选 | string | 菜单项目的标题 |
IsSeparator | 可选 | bool | 是否分隔,默认为false |
IsNeedOpenDoc | 可选 | bool | 是否需要打开文档,默认为true |
cmnuID | 可选 | long | 菜单ID,默认=0 |
返回值:
无返回值
说明:
在自定义的文件菜单中增加自定义菜单项。该方法的参数和含义与AddCustomMenuItem方法相同,只是该方法是在文件菜单中增加自定义的菜单项。
使用示例:
javascript
// 在文件菜单中增加自定义项目
OCX_OBJ.AddFileMenuItem("导出为PDF", false, true, 1001);
OCX_OBJ.AddFileMenuItem(""); // 添加分隔符
OCX_OBJ.AddFileMenuItem("发送邮件", false, true, 1002);
RemoveFileMenuItem
语法:
javascript
RemoveFileMenuItem(index)
功能:
在自定义的文件菜单中删除一个自定义菜单项。
参数:
名称 | 必选/可选 | 数据类型 | 说明 |
---|---|---|---|
index | 必选 | long | 菜单索引值 |
返回值:
无返回值
说明:
在自定义的文件菜单中删除一个自定义菜单项。
使用示例:
javascript
// 删除第一个文件菜单项
OCX_OBJ.RemoveFileMenuItem(0);
ClearAllFileMenuItems
语法:
javascript
ClearAllFileMenuItems()
功能:
删除所有自定义文件菜单项。
返回值:
无返回值
说明:
删除所有自定义文件菜单项。
使用示例:
javascript
// 清除所有文件菜单项
OCX_OBJ.ClearAllFileMenuItems();
事件处理
OnCustomMenuCmd2事件
语法:
javascript
OnCustomMenuCmd2(menuPos, submenuPos, subsubmenuPos, menuCaption, menuID)
功能:
处理自定义菜单项点击事件。
参数:
名称 | 数据类型 | 说明 |
---|---|---|
menuPos | long | 一级菜单位置 |
submenuPos | long | 二级菜单位置 |
subsubmenuPos | long | 三级菜单位置 |
menuCaption | string | 菜单标题 |
menuID | long | 菜单ID |
使用示例:
javascript
// 事件处理示例
<script language="JScript" for="OCX_OBJ" event="OnCustomMenuCmd2(menuPos,submenuPos,subsubmenuPos,menuCaption,menuID)">
alert("第" + menuPos + "," + submenuPos + "," + subsubmenuPos + "个菜单项,menuID=" + menuID + ",菜单标题为\"" + menuCaption + "\"的命令被执行.");
</script>
方法分类总结
分类 | 方法 | 功能 | 说明 |
---|---|---|---|
主菜单管理 | AddCustomMenu2 | 添加自定义主菜单 | 创建一级菜单 |
RemoveCustomMenu2 | 删除自定义主菜单 | 删除一级菜单 | |
子菜单管理 | AddCustomMenuItem2 | 添加自定义子菜单项 | 创建二级/三级菜单 |
EnableCustomMenuItem2 | 启用/禁用菜单项 | 控制菜单项状态 | |
文件菜单 | AddFileMenuItem | 添加文件菜单项 | 文件菜单定制 |
RemoveFileMenuItem | 删除文件菜单项 | 删除文件菜单项 | |
ClearAllFileMenuItems | 清除所有文件菜单项 | 清空文件菜单 | |
已过时方法 | AddCustomMenuItem | 添加自定义菜单项 [已过时] | 旧版方法 |
RemoveCustomMenuItem | 删除自定义菜单项 [已过时] | 旧版方法 | |
ClearAllCustomMenuItems | 清除所有自定义菜单项 [已过时] | 旧版方法 |
使用流程
1. 创建自定义菜单结构
javascript
// 创建自定义菜单结构
function createCustomMenuStructure() {
try {
// 创建主菜单
OCX_OBJ.AddCustomMenu2(0, "文件操作(&F)");
OCX_OBJ.AddCustomMenu2(1, "编辑操作(&E)");
OCX_OBJ.AddCustomMenu2(2, "工具操作(&T)");
// 为第一个主菜单添加子菜单
OCX_OBJ.AddCustomMenuItem2(0, 0, -1, false, "新建文档", false, 1001);
OCX_OBJ.AddCustomMenuItem2(0, 1, -1, false, "打开文档", false, 1002);
OCX_OBJ.AddCustomMenuItem2(0, 2, -1, false, "", true); // 分隔符
OCX_OBJ.AddCustomMenuItem2(0, 3, -1, false, "保存文档", false, 1003);
OCX_OBJ.AddCustomMenuItem2(0, 4, -1, false, "另存为", false, 1004);
// 为第二个主菜单添加子菜单
OCX_OBJ.AddCustomMenuItem2(1, 0, -1, false, "撤销", false, 2001);
OCX_OBJ.AddCustomMenuItem2(1, 1, -1, false, "重做", false, 2002);
OCX_OBJ.AddCustomMenuItem2(1, 2, -1, false, "", true); // 分隔符
OCX_OBJ.AddCustomMenuItem2(1, 3, -1, false, "复制", false, 2003);
OCX_OBJ.AddCustomMenuItem2(1, 4, -1, false, "粘贴", false, 2004);
console.log("自定义菜单结构创建完成");
} catch (error) {
console.error("创建自定义菜单结构失败:", error.message);
}
}
2. 创建多级菜单
javascript
// 创建多级菜单
function createMultiLevelMenu() {
try {
// 创建主菜单
OCX_OBJ.AddCustomMenu2(0, "高级操作(&A)");
// 添加二级菜单(子菜单)
OCX_OBJ.AddCustomMenuItem2(0, 0, -1, true, "文档转换", false);
// 为子菜单添加三级菜单项
OCX_OBJ.AddCustomMenuItem2(0, 0, 0, false, "转换为PDF", false, 3001);
OCX_OBJ.AddCustomMenuItem2(0, 0, 1, false, "转换为HTML", false, 3002);
OCX_OBJ.AddCustomMenuItem2(0, 0, 2, false, "转换为TXT", false, 3003);
// 添加另一个二级菜单
OCX_OBJ.AddCustomMenuItem2(0, 1, -1, true, "文档处理", false);
// 为第二个子菜单添加三级菜单项
OCX_OBJ.AddCustomMenuItem2(0, 1, 0, false, "添加水印", false, 4001);
OCX_OBJ.AddCustomMenuItem2(0, 1, 1, false, "添加页眉页脚", false, 4002);
OCX_OBJ.AddCustomMenuItem2(0, 1, 2, false, "设置密码", false, 4003);
console.log("多级菜单创建完成");
} catch (error) {
console.error("创建多级菜单失败:", error.message);
}
}
3. 管理菜单状态
javascript
// 管理菜单状态
function manageMenuStatus() {
try {
// 根据文档状态启用/禁用菜单项
if (OCX_OBJ.DocType === 0) {
// 没有文档时禁用某些菜单项
OCX_OBJ.EnableCustomMenuItem2(0, 3, -1, false); // 禁用保存
OCX_OBJ.EnableCustomMenuItem2(0, 4, -1, false); // 禁用另存为
} else {
// 有文档时启用所有菜单项
OCX_OBJ.EnableCustomMenuItem2(0, 3, -1, true); // 启用保存
OCX_OBJ.EnableCustomMenuItem2(0, 4, -1, true); // 启用另存为
}
// 根据用户权限控制菜单项
var userRole = getUserRole();
if (userRole === 'viewer') {
// 查看者禁用编辑相关菜单
OCX_OBJ.EnableCustomMenuItem2(1, 0, -1, false); // 禁用撤销
OCX_OBJ.EnableCustomMenuItem2(1, 1, -1, false); // 禁用重做
}
console.log("菜单状态管理完成");
} catch (error) {
console.error("菜单状态管理失败:", error.message);
}
}
完整示例
1. 基础菜单创建
javascript
// 基础菜单创建示例
function createBasicMenu() {
try {
// 创建主菜单
OCX_OBJ.AddCustomMenu2(0, "我的菜单(&M)");
// 添加菜单项
OCX_OBJ.AddCustomMenuItem2(0, 0, -1, false, "新建文档", false, 1001);
OCX_OBJ.AddCustomMenuItem2(0, 1, -1, false, "打开文档", false, 1002);
OCX_OBJ.AddCustomMenuItem2(0, 2, -1, false, "", true); // 分隔符
OCX_OBJ.AddCustomMenuItem2(0, 3, -1, false, "保存文档", false, 1003);
OCX_OBJ.AddCustomMenuItem2(0, 4, -1, false, "关闭文档", false, 1004);
console.log("基础菜单创建完成");
} catch (error) {
console.error("基础菜单创建失败:", error.message);
}
}
2. 复杂菜单结构
javascript
// 复杂菜单结构示例
function createComplexMenu() {
try {
// 创建多个主菜单
OCX_OBJ.AddCustomMenu2(0, "文件(&F)");
OCX_OBJ.AddCustomMenu2(1, "编辑(&E)");
OCX_OBJ.AddCustomMenu2(2, "工具(&T)");
OCX_OBJ.AddCustomMenu2(3, "帮助(&H)");
// 文件菜单
OCX_OBJ.AddCustomMenuItem2(0, 0, -1, false, "新建", false, 1001);
OCX_OBJ.AddCustomMenuItem2(0, 1, -1, false, "打开", false, 1002);
OCX_OBJ.AddCustomMenuItem2(0, 2, -1, false, "", true); // 分隔符
OCX_OBJ.AddCustomMenuItem2(0, 3, -1, false, "保存", false, 1003);
OCX_OBJ.AddCustomMenuItem2(0, 4, -1, false, "另存为", false, 1004);
OCX_OBJ.AddCustomMenuItem2(0, 5, -1, false, "", true); // 分隔符
OCX_OBJ.AddCustomMenuItem2(0, 6, -1, false, "退出", false, 1005);
// 编辑菜单
OCX_OBJ.AddCustomMenuItem2(1, 0, -1, false, "撤销", false, 2001);
OCX_OBJ.AddCustomMenuItem2(1, 1, -1, false, "重做", false, 2002);
OCX_OBJ.AddCustomMenuItem2(1, 2, -1, false, "", true); // 分隔符
OCX_OBJ.AddCustomMenuItem2(1, 3, -1, false, "复制", false, 2003);
OCX_OBJ.AddCustomMenuItem2(1, 4, -1, false, "粘贴", false, 2004);
// 工具菜单
OCX_OBJ.AddCustomMenuItem2(2, 0, -1, true, "转换", false);
OCX_OBJ.AddCustomMenuItem2(2, 0, 0, false, "转PDF", false, 3001);
OCX_OBJ.AddCustomMenuItem2(2, 0, 1, false, "转HTML", false, 3002);
OCX_OBJ.AddCustomMenuItem2(2, 1, -1, false, "设置", false, 3003);
// 帮助菜单
OCX_OBJ.AddCustomMenuItem2(3, 0, -1, false, "关于", false, 4001);
OCX_OBJ.AddCustomMenuItem2(3, 1, -1, false, "帮助", false, 4002);
console.log("复杂菜单结构创建完成");
} catch (error) {
console.error("复杂菜单结构创建失败:", error.message);
}
}
3. 文件菜单定制
javascript
// 文件菜单定制示例
function customizeFileMenu() {
try {
// 在文件菜单中添加自定义项
OCX_OBJ.AddFileMenuItem("导出为PDF", false, true, 5001);
OCX_OBJ.AddFileMenuItem("发送邮件", false, true, 5002);
OCX_OBJ.AddFileMenuItem(""); // 分隔符
OCX_OBJ.AddFileMenuItem("打印设置", false, true, 5003);
OCX_OBJ.AddFileMenuItem("页面设置", false, true, 5004);
console.log("文件菜单定制完成");
} catch (error) {
console.error("文件菜单定制失败:", error.message);
}
}
注意事项
- 版本要求:此方法是增强版及以上版本所有
- 菜单位置:主菜单位置范围0-9,二级菜单0-39,三级菜单-1-48
- 菜单ID:建议使用唯一的菜单ID便于事件处理
- 分隔符:使用空字符串或"-"创建分隔符
- 状态管理:及时更新菜单项状态
- 事件处理:配合OnCustomMenuCmd2事件处理菜单点击
- 已过时方法:建议使用新版本方法替代已过时的方法
错误处理
javascript
// 自定义菜单错误处理
function handleMenuError(operation, error) {
console.error("自定义菜单操作失败:", operation, error.message);
switch(operation) {
case 'AddCustomMenu2':
console.log("添加主菜单失败,请检查:");
console.log("1. 菜单位置是否在0-9范围内");
console.log("2. 菜单标题是否有效");
console.log("3. 控件版本是否支持此功能");
break;
case 'AddCustomMenuItem2':
console.log("添加菜单项失败,请检查:");
console.log("1. 主菜单是否已创建");
console.log("2. 菜单位置参数是否正确");
console.log("3. 菜单标题是否有效");
break;
case 'EnableCustomMenuItem2':
console.log("设置菜单状态失败,请检查:");
console.log("1. 菜单项是否已创建");
console.log("2. 菜单位置参数是否正确");
console.log("3. 状态参数是否有效");
break;
default:
console.log("未知自定义菜单操作失败");
}
}
最佳实践
1. 菜单设计最佳实践
javascript
// 菜单设计最佳实践
function menuDesignBestPractice() {
try {
// 按功能分组设计菜单
OCX_OBJ.AddCustomMenu2(0, "文件(&F)");
OCX_OBJ.AddCustomMenu2(1, "编辑(&E)");
OCX_OBJ.AddCustomMenu2(2, "视图(&V)");
OCX_OBJ.AddCustomMenu2(3, "工具(&T)");
OCX_OBJ.AddCustomMenu2(4, "帮助(&H)");
// 文件菜单设计
OCX_OBJ.AddCustomMenuItem2(0, 0, -1, false, "新建(&N)", false, 1001);
OCX_OBJ.AddCustomMenuItem2(0, 1, -1, false, "打开(&O)", false, 1002);
OCX_OBJ.AddCustomMenuItem2(0, 2, -1, false, "", true); // 分隔符
OCX_OBJ.AddCustomMenuItem2(0, 3, -1, false, "保存(&S)", false, 1003);
OCX_OBJ.AddCustomMenuItem2(0, 4, -1, false, "另存为(&A)", false, 1004);
// 编辑菜单设计
OCX_OBJ.AddCustomMenuItem2(1, 0, -1, false, "撤销(&U)", false, 2001);
OCX_OBJ.AddCustomMenuItem2(1, 1, -1, false, "重做(&R)", false, 2002);
OCX_OBJ.AddCustomMenuItem2(1, 2, -1, false, "", true); // 分隔符
OCX_OBJ.AddCustomMenuItem2(1, 3, -1, false, "复制(&C)", false, 2003);
OCX_OBJ.AddCustomMenuItem2(1, 4, -1, false, "粘贴(&P)", false, 2004);
console.log("菜单设计完成");
} catch (error) {
console.error("菜单设计失败:", error.message);
}
}
2. 状态管理最佳实践
javascript
// 状态管理最佳实践
function stateManagementBestPractice() {
try {
// 根据文档状态更新菜单状态
function updateMenuStates() {
var docType = OCX_OBJ.DocType;
if (docType === 0) {
// 没有文档时禁用某些菜单项
OCX_OBJ.EnableCustomMenuItem2(0, 3, -1, false); // 禁用保存
OCX_OBJ.EnableCustomMenuItem2(0, 4, -1, false); // 禁用另存为
OCX_OBJ.EnableCustomMenuItem2(1, 0, -1, false); // 禁用撤销
OCX_OBJ.EnableCustomMenuItem2(1, 1, -1, false); // 禁用重做
} else {
// 有文档时启用所有菜单项
OCX_OBJ.EnableCustomMenuItem2(0, 3, -1, true); // 启用保存
OCX_OBJ.EnableCustomMenuItem2(0, 4, -1, true); // 启用另存为
OCX_OBJ.EnableCustomMenuItem2(1, 0, -1, true); // 启用撤销
OCX_OBJ.EnableCustomMenuItem2(1, 1, -1, true); // 启用重做
}
}
// 定期更新菜单状态
setInterval(updateMenuStates, 1000);
console.log("状态管理设置完成");
} catch (error) {
console.error("状态管理设置失败:", error.message);
}
}
3. 权限控制最佳实践
javascript
// 权限控制最佳实践
function permissionControlBestPractice() {
try {
// 根据用户权限控制菜单显示
function updateMenuPermissions() {
var userRole = getUserRole();
switch(userRole) {
case 'admin':
// 管理员显示所有菜单
for(var i = 0; i < 5; i++) {
OCX_OBJ.EnableCustomMenuItem2(i, 0, -1, true);
}
break;
case 'editor':
// 编辑者隐藏某些菜单
OCX_OBJ.EnableCustomMenuItem2(4, 0, -1, false); // 隐藏帮助菜单
break;
case 'viewer':
// 查看者只显示查看相关菜单
OCX_OBJ.EnableCustomMenuItem2(0, 0, -1, false); // 隐藏新建
OCX_OBJ.EnableCustomMenuItem2(0, 3, -1, false); // 隐藏保存
OCX_OBJ.EnableCustomMenuItem2(1, 0, -1, false); // 隐藏撤销
OCX_OBJ.EnableCustomMenuItem2(1, 1, -1, false); // 隐藏重做
break;
}
}
// 初始化权限控制
updateMenuPermissions();
console.log("权限控制设置完成");
} catch (error) {
console.error("权限控制设置失败:", error.message);
}
}
技术要点
- 版本兼容性:确保使用增强版及以上版本
- 菜单位置管理:正确管理各级菜单位置
- 菜单ID管理:使用唯一的菜单ID
- 状态同步:及时更新菜单项状态
- 事件处理:配合OnCustomMenuCmd2事件
- 权限控制:根据用户权限控制菜单显示
- 错误处理:完善的错误处理机制
总结
自定义菜单相关方法为软航OFFICE文档控件提供了强大的菜单定制能力。通过AddCustomMenu2方法可以创建自定义主菜单,通过AddCustomMenuItem2方法可以创建多级子菜单,通过EnableCustomMenuItem2方法可以控制菜单项状态,为开发者提供了灵活的菜单管理功能,大大提升了控件的可定制性和用户体验。