Skip to content

自定义菜单相关方法

自定义主菜单相关方法

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-39
  • subsubMenuPos:要增加的项目在三级菜单项中的位置。必须从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-9
  • subMenuPos:要允许/禁用的项目在二级菜单项中的位置。必须从0开始增加此参数。取值:0-39
  • subsubMenuPos:要允许/禁用的项目在三级菜单项中的位置。必须从0开始增加此参数。取值:-1-48
  • bEnabled:说明是允许还是禁用指定的菜单项目

使用示例:

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)

功能:
处理自定义菜单项点击事件。

参数:

名称数据类型说明
menuPoslong一级菜单位置
submenuPoslong二级菜单位置
subsubmenuPoslong三级菜单位置
menuCaptionstring菜单标题
menuIDlong菜单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);
    }
}

注意事项

  1. 版本要求:此方法是增强版及以上版本所有
  2. 菜单位置:主菜单位置范围0-9,二级菜单0-39,三级菜单-1-48
  3. 菜单ID:建议使用唯一的菜单ID便于事件处理
  4. 分隔符:使用空字符串或"-"创建分隔符
  5. 状态管理:及时更新菜单项状态
  6. 事件处理:配合OnCustomMenuCmd2事件处理菜单点击
  7. 已过时方法:建议使用新版本方法替代已过时的方法

错误处理

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);
    }
}

技术要点

  1. 版本兼容性:确保使用增强版及以上版本
  2. 菜单位置管理:正确管理各级菜单位置
  3. 菜单ID管理:使用唯一的菜单ID
  4. 状态同步:及时更新菜单项状态
  5. 事件处理:配合OnCustomMenuCmd2事件
  6. 权限控制:根据用户权限控制菜单显示
  7. 错误处理:完善的错误处理机制

总结

自定义菜单相关方法为软航OFFICE文档控件提供了强大的菜单定制能力。通过AddCustomMenu2方法可以创建自定义主菜单,通过AddCustomMenuItem2方法可以创建多级子菜单,通过EnableCustomMenuItem2方法可以控制菜单项状态,为开发者提供了灵活的菜单管理功能,大大提升了控件的可定制性和用户体验。