Skip to content

菜单相关事件

概述

本节介绍软航OFFICE文档控件提供的菜单相关事件,这些事件允许开发者在用户与菜单系统交互时进行响应和处理,为文档管理系统提供完整的菜单事件处理能力。

文件菜单事件

OnFileCommand

语法:

javascript
OnFileCommand(Item, IsCancel)

功能:
该事件在用户单击文件菜单或者工具栏的相关按钮时发生。

参数:

名称必选/可选数据类型说明
Item必选FileCommandType文件菜单命令索引
IsCancel必选bool是否取消命令

说明:
可以与CancelLastCommand属性配合使用来接管缺省的工具栏的新建,打开或者保存操作。

使用示例:

javascript
// 基本用法 - 接管保存操作
<script language="JScript" for="TANGER_OCX" event="OnFileCommand(cmd, canceled)">
    if (cmd == 3) { // 用户点击了文件保存菜单或按钮
        // 保存到服务器
        TANGER_OCX_SaveEditToServerDisk();
        // 取消默认操作
        document.getElementById("TANGER_OCX").CancelLastCommand = true;
    }
</script>

// 处理多个文件命令
<script language="JScript" for="TANGER_OCX" event="OnFileCommand(cmd, canceled)">
    switch(cmd) {
        case 1: // 新建
            console.log("用户点击新建");
            // 执行自定义新建逻辑
            break;
        case 2: // 打开
            console.log("用户点击打开");
            // 执行自定义打开逻辑
            break;
        case 3: // 保存
            console.log("用户点击保存");
            // 执行自定义保存逻辑
            TANGER_OCX_SaveEditToServerDisk();
            document.getElementById("TANGER_OCX").CancelLastCommand = true;
            break;
        case 4: // 另存为
            console.log("用户点击另存为");
            // 执行自定义另存为逻辑
            break;
        default:
            console.log("其他文件命令:", cmd);
    }
</script>

// 记录文件命令操作
<script language="JScript" for="TANGER_OCX" event="OnFileCommand(cmd, canceled)">
    var timestamp = new Date().toISOString();
    var commandNames = {
        1: "新建",
        2: "打开", 
        3: "保存",
        4: "另存为",
        5: "打印",
        6: "退出"
    };
    
    var commandName = commandNames[cmd] || "未知命令";
    console.log("文件命令操作:", commandName, "时间:", timestamp);
    
    // 可以记录用户操作日志
    // logUserAction('file_command', commandName, timestamp);
</script>

自定义菜单事件

OnCustomMenuCmd2

语法:

javascript
OnCustomMenuCmd2(menuPos, submenuPos, subsubmenuPos, menuCaption, myMenuID)

功能:
该事件在用户单击自定义主菜单中的项目时执行。

参数:

名称必选/可选数据类型说明
menuPos必选long一级菜单位置
submenuPos必选long二级菜单位置
subsubmenuPos必选long三级菜单位置
menuCaption必选string自定义菜单名称
myMenuID必选long自定义菜单ID

说明:
各个参数的含义请参考AddCustomMenuItem2方法。在事件中可以通过判断ID和menuCaption两种方式,在对点击菜单事件进行相应操作。而且这个事件并不能捕获在文件菜单下面的菜单项,如果需要此功能参见OnCustomFileMenuCmd事件。

使用示例:

javascript
// 基本用法
<script language="JScript" for="TANGER_OCX" event="OnCustomMenuCmd2(menuPos, submenuPos, subsubmenuPos, menuCaption, myMenuID)">
    console.log("自定义菜单点击:");
    console.log("一级菜单位置:", menuPos);
    console.log("二级菜单位置:", submenuPos);
    console.log("三级菜单位置:", subsubmenuPos);
    console.log("菜单标题:", menuCaption);
    console.log("菜单ID:", myMenuID);
</script>

// 根据菜单ID处理不同操作
<script language="JScript" for="TANGER_OCX" event="OnCustomMenuCmd2(menuPos, submenuPos, subsubmenuPos, menuCaption, myMenuID)">
    switch(myMenuID) {
        case 1001:
            console.log("执行文档格式化操作");
            // 执行文档格式化
            break;
        case 1002:
            console.log("执行文档转换操作");
            // 执行文档转换
            break;
        case 1003:
            console.log("执行文档加密操作");
            // 执行文档加密
            break;
        default:
            console.log("未知菜单操作:", myMenuID);
    }
</script>

// 根据菜单标题处理操作
<script language="JScript" for="TANGER_OCX" event="OnCustomMenuCmd2(menuPos, submenuPos, subsubmenuPos, menuCaption, myMenuID)">
    if (menuCaption === "文档格式化") {
        console.log("执行文档格式化");
        // 执行格式化操作
    } else if (menuCaption === "文档转换") {
        console.log("执行文档转换");
        // 执行转换操作
    } else if (menuCaption === "文档加密") {
        console.log("执行文档加密");
        // 执行加密操作
    } else {
        console.log("其他菜单操作:", menuCaption);
    }
</script>

OnCustomMenuCmd [已过时]

语法:

javascript
OnCustomMenuCmd(menuIndex, menuCaption, menuID)

功能:
该事件在用户单击自定义主菜单中的项目时执行。

参数:

名称必选/可选数据类型说明
menuIndex必选long菜单位置索引
menuCaption必选string自定义菜单名称
menuID可选long自定义菜单ID

说明:
不建议继续采用该事件,建议采用OnCustomMenuCmd2事件。第一个参数是菜单索引,从0开始计算;第二个参数是菜单标题;第三个参数是调用AddCustomMenuItem方法增加主菜单项目时的第4个参数,也就是自定义的菜单ID。

使用示例:

javascript
// 基本用法 [已过时,建议使用OnCustomMenuCmd2]
<script language="JScript" for="TANGER_OCX" event="OnCustomMenuCmd(menuIndex, menuCaption, menuID)">
    console.log("自定义菜单点击 [已过时]:");
    console.log("菜单索引:", menuIndex);
    console.log("菜单标题:", menuCaption);
    console.log("菜单ID:", menuID);
</script>

自定义文件菜单事件

OnCustomFileMenuCmd

语法:

javascript
OnCustomFileMenuCmd(menuIndex, menuCaption, menuID)

功能:
该事件在用户单击自定义文件菜单中的项目时执行。

参数:

名称必选/可选数据类型说明
menuIndex必选long自定义文件菜单位置索引
menuCaption必选string自定义文件菜单名称
menuID可选long自定义文件菜单ID

说明:
第一个参数是菜单索引,从0开始计算;第二个参数是菜单标题;第三个参数是调用AddFileMenuItem方法增加主菜单项目时的第4个参数,也就是自定义的菜单ID。在事件中可以通过判断ID和menuCaption两种方式,在对点击菜单事件进行相应操作。此事件只能捕获在文件菜单下面的菜单项,如果需要此功能参见OnCustomFileMenuCmd事件。

使用示例:

javascript
// 基本用法
<script language="JScript" for="TANGER_OCX" event="OnCustomFileMenuCmd(menuIndex, menuCaption, menuID)">
    console.log("自定义文件菜单点击:");
    console.log("菜单索引:", menuIndex);
    console.log("菜单标题:", menuCaption);
    console.log("菜单ID:", menuID);
</script>

// 根据菜单ID处理文件操作
<script language="JScript" for="TANGER_OCX" event="OnCustomFileMenuCmd(menuIndex, menuCaption, menuID)">
    switch(myMenuID) {
        case 2001:
            console.log("执行文件上传操作");
            // 执行文件上传
            break;
        case 2002:
            console.log("执行文件下载操作");
            // 执行文件下载
            break;
        case 2003:
            console.log("执行文件同步操作");
            // 执行文件同步
            break;
        default:
            console.log("未知文件菜单操作:", myMenuID);
    }
</script>

// 根据菜单标题处理文件操作
<script language="JScript" for="TANGER_OCX" event="OnCustomFileMenuCmd(menuIndex, menuCaption, menuID)">
    if (menuCaption === "上传到服务器") {
        console.log("执行文件上传");
        // 执行上传操作
    } else if (menuCaption === "从服务器下载") {
        console.log("执行文件下载");
        // 执行下载操作
    } else if (menuCaption === "同步到服务器") {
        console.log("执行文件同步");
        // 执行同步操作
    } else {
        console.log("其他文件菜单操作:", menuCaption);
    }
</script>

原始菜单命令事件

BeforeOriginalMenuCommand

语法:

javascript
BeforeOriginalMenuCommand(menuTitle, IsCancel)

功能:
在用户执行文档菜单命令之前执行。

参数:

名称必选/可选数据类型说明
menuTitle必选string菜单标题
IsCancel必选bool是否取消命令

说明:
以下代码将显示用户点击的菜单命令,并取消所有操作(将CancelLastCommand属性设定为true则可以取消操作)。

使用示例:

javascript
// 基本用法 - 显示菜单命令并取消操作
<script language="JScript" for="TANGER_OCX" event="BeforeOriginalMenuCommand(menuTitle, canceled)">
    alert(menuTitle);
    CancelLastCommand = true;
</script>

// 根据菜单标题执行不同操作
<script language="JScript" for="TANGER_OCX" event="BeforeOriginalMenuCommand(menuTitle, canceled)">
    console.log("用户点击菜单:", menuTitle);
    
    if (menuTitle === "保存") {
        console.log("拦截保存操作,执行自定义保存");
        // 执行自定义保存逻辑
        TANGER_OCX_SaveEditToServerDisk();
        CancelLastCommand = true;
    } else if (menuTitle === "打印") {
        console.log("拦截打印操作,执行自定义打印");
        // 执行自定义打印逻辑
        CancelLastCommand = true;
    } else {
        console.log("允许默认操作:", menuTitle);
        CancelLastCommand = false;
    }
</script>

// 记录菜单操作
<script language="JScript" for="TANGER_OCX" event="BeforeOriginalMenuCommand(menuTitle, canceled)">
    var timestamp = new Date().toISOString();
    console.log("菜单操作记录:", menuTitle, "时间:", timestamp);
    
    // 可以记录用户菜单操作日志
    // logUserAction('menu_command', menuTitle, timestamp);
</script>

自定义右键菜单事件

OnClickCustomContextMenu

语法:

javascript
OnClickCustomContextMenu(MenuIndex)

功能:
在用户点击通过CustomMenuStr属性自定义的右键菜单项就会触发本事件。

参数:

名称必选/可选数据类型说明
MenuIndex必选long自定义右键菜单索引

说明:
参数MenuIndex:即在CustonMenuStr中指定的索引。

使用示例:

javascript
// 基本用法
<script language="JScript" for="TANGER_OCX" event="OnClickCustomContextMenu(MenuIndex)">
    alert(MenuIndex);
</script>

// 根据菜单索引执行不同操作
<script language="JScript" for="TANGER_OCX" event="OnClickCustomContextMenu(MenuIndex)">
    console.log("右键菜单点击,索引:", MenuIndex);
    
    switch(MenuIndex) {
        case 1:
            console.log("执行复制操作");
            // 执行复制操作
            break;
        case 2:
            console.log("执行粘贴操作");
            // 执行粘贴操作
            break;
        case 3:
            console.log("执行格式化操作");
            // 执行格式化操作
            break;
        case 4:
            console.log("执行插入图片操作");
            // 执行插入图片操作
            break;
        default:
            console.log("未知右键菜单操作:", MenuIndex);
    }
</script>

// 记录右键菜单操作
<script language="JScript" for="TANGER_OCX" event="OnClickCustomContextMenu(MenuIndex)">
    var timestamp = new Date().toISOString();
    var menuActions = {
        1: "复制",
        2: "粘贴",
        3: "格式化",
        4: "插入图片",
        5: "插入表格"
    };
    
    var actionName = menuActions[MenuIndex] || "未知操作";
    console.log("右键菜单操作:", actionName, "时间:", timestamp);
    
    // 可以记录用户右键菜单操作日志
    // logUserAction('context_menu', actionName, timestamp);
</script>

方法分类总结

分类事件功能说明
文件菜单OnFileCommand文件菜单命令点击时触发文件操作命令
自定义菜单OnCustomMenuCmd2自定义主菜单点击时触发自定义菜单操作
OnCustomMenuCmd自定义主菜单点击时触发 [已过时]自定义菜单操作
文件菜单OnCustomFileMenuCmd自定义文件菜单点击时触发自定义文件菜单操作
原始菜单BeforeOriginalMenuCommand原始菜单命令执行前触发菜单命令拦截
右键菜单OnClickCustomContextMenu自定义右键菜单点击时触发右键菜单操作

使用流程

1. 基本菜单事件处理流程

javascript
// 基本菜单事件处理流程
function basicMenuEventHandling() {
    // 文件菜单事件处理
    function handleFileCommand(cmd, canceled) {
        console.log("文件命令:", cmd);
        // 处理文件命令
    }
    
    // 自定义菜单事件处理
    function handleCustomMenu(menuPos, submenuPos, subsubmenuPos, menuCaption, myMenuID) {
        console.log("自定义菜单:", menuCaption);
        // 处理自定义菜单
    }
    
    // 右键菜单事件处理
    function handleContextMenu(menuIndex) {
        console.log("右键菜单:", menuIndex);
        // 处理右键菜单
    }
}

2. 高级菜单事件处理流程

javascript
// 高级菜单事件处理流程
function advancedMenuEventHandling() {
    // 菜单事件配置
    var menuEventConfig = {
        enableLogging: true,
        enableCustomHandling: true,
        enableCommandInterception: true
    };
    
    // 处理文件命令
    function handleAdvancedFileCommand(cmd, canceled) {
        if (menuEventConfig.enableLogging) {
            console.log("文件命令日志:", cmd);
        }
        
        if (menuEventConfig.enableCustomHandling) {
            // 执行自定义处理
        }
    }
    
    // 处理自定义菜单
    function handleAdvancedCustomMenu(menuPos, submenuPos, subsubmenuPos, menuCaption, myMenuID) {
        if (menuEventConfig.enableLogging) {
            console.log("自定义菜单日志:", menuCaption);
        }
        
        if (menuEventConfig.enableCustomHandling) {
            // 执行自定义处理
        }
    }
}

3. 菜单事件质量控制流程

javascript
// 菜单事件质量控制流程
function menuEventQualityControl() {
    // 处理菜单事件质量控制
    function controlMenuEventQuality() {
        var menuEventQuality = {
            totalEvents: 0,
            successfulEvents: 0,
            failedEvents: 0,
            qualityScore: 0
        };
        
        // 计算质量分数
        if (menuEventQuality.totalEvents > 0) {
            menuEventQuality.qualityScore = (menuEventQuality.successfulEvents / menuEventQuality.totalEvents) * 100;
        }
        
        console.log("菜单事件质量控制:", menuEventQuality);
        return menuEventQuality;
    }
    
    // 执行质量控制
    var qualityResult = controlMenuEventQuality();
    console.log("菜单事件质量控制结果:", qualityResult);
}

完整示例

1. 基础菜单事件处理

javascript
// 基础菜单事件处理示例
function basicMenuEventHandling() {
    // 文件菜单处理
    function onFileCommand(cmd, canceled) {
        console.log("文件命令:", cmd);
        // 处理文件命令
    }
    
    // 自定义菜单处理
    function onCustomMenu(menuPos, submenuPos, subsubmenuPos, menuCaption, myMenuID) {
        console.log("自定义菜单:", menuCaption);
        // 处理自定义菜单
    }
}

2. 高级菜单事件处理

javascript
// 高级菜单事件处理示例
function advancedMenuEventHandling() {
    // 菜单事件管理
    var menuEventManager = {
        isMenuEnabled: true,
        isCustomMenuEnabled: true,
        isContextMenuEnabled: true
    };
    
    // 处理文件命令
    function handleFileCommand(cmd, canceled) {
        if (menuEventManager.isMenuEnabled) {
            console.log("文件命令处理:", cmd);
            // 处理文件命令
        }
    }
    
    // 处理自定义菜单
    function handleCustomMenu(menuPos, submenuPos, subsubmenuPos, menuCaption, myMenuID) {
        if (menuEventManager.isCustomMenuEnabled) {
            console.log("自定义菜单处理:", menuCaption);
            // 处理自定义菜单
        }
    }
}

3. 菜单事件质量控制

javascript
// 菜单事件质量控制示例
function menuEventQualityControl() {
    // 菜单事件质量控制
    function controlMenuEventQuality() {
        var menuEventQuality = {
            fileCommands: 0,
            customMenus: 0,
            contextMenus: 0,
            errors: []
        };
        
        // 监控菜单事件质量
        function monitorMenuEventQuality(eventType, success) {
            if (success) {
                menuEventQuality[eventType]++;
            } else {
                menuEventQuality.errors.push({
                    event: eventType,
                    timestamp: new Date().toISOString()
                });
            }
        }
        
        console.log("菜单事件质量控制:", menuEventQuality);
        return menuEventQuality;
    }
    
    // 执行质量控制
    var qualityResult = controlMenuEventQuality();
    console.log("菜单事件质量控制结果:", qualityResult);
}

注意事项

  1. 事件顺序:注意菜单事件触发的顺序,确保在正确的时机执行相应操作
  2. 参数验证:验证菜单事件参数的有效性,避免空值或无效值
  3. 错误处理:实现完善的错误处理机制
  4. 性能考虑:避免在菜单事件处理中执行耗时操作
  5. 资源管理:及时清理不需要的资源
  6. 状态同步:保持菜单状态的一致性
  7. 用户体验:确保菜单事件处理不影响用户体验

错误处理

javascript
// 菜单事件错误处理
function handleMenuEventError(eventType, error) {
    console.error("菜单事件处理失败:", eventType, error.message);
    
    switch(eventType) {
        case 'OnFileCommand':
            console.log("文件菜单事件失败,请检查:");
            console.log("1. 文件菜单是否正确配置");
            console.log("2. 文件操作是否支持");
            console.log("3. 控件是否已正确初始化");
            break;
        case 'OnCustomMenuCmd2':
            console.log("自定义菜单事件失败,请检查:");
            console.log("1. 自定义菜单是否正确添加");
            console.log("2. 菜单ID是否正确");
            console.log("3. 菜单事件处理是否正确");
            break;
        case 'OnClickCustomContextMenu':
            console.log("右键菜单事件失败,请检查:");
            console.log("1. 右键菜单是否正确配置");
            console.log("2. 菜单索引是否正确");
            console.log("3. 右键菜单事件处理是否正确");
            break;
        default:
            console.log("未知菜单事件处理失败");
    }
}

最佳实践

1. 菜单事件管理最佳实践

javascript
// 菜单事件管理最佳实践
function menuEventManagementBestPractice() {
    // 菜单事件配置
    var menuEventConfig = {
        enableLogging: true,
        enableCustomHandling: true,
        enableCommandInterception: true,
        enableQualityControl: true
    };
    
    // 应用菜单事件配置
    function applyMenuEventConfig() {
        try {
            // 设置菜单事件处理
            if (menuEventConfig.enableLogging) {
                console.log("菜单事件日志已启用");
            }
            
            if (menuEventConfig.enableCustomHandling) {
                console.log("自定义菜单处理已启用");
            }
            
            console.log("菜单事件配置应用成功");
        } catch (error) {
            handleMenuEventError('applyMenuEventConfig', error);
        }
    }
    
    // 应用配置
    applyMenuEventConfig();
}

2. 菜单事件质量控制最佳实践

javascript
// 菜单事件质量控制最佳实践
function menuEventQualityControlBestPractice() {
    // 菜单事件质量控制
    function controlMenuEventQuality() {
        try {
            // 菜单事件质量控制
            var menuEventQuality = {
                totalEvents: 0,
                successfulEvents: 0,
                failedEvents: 0,
                qualityScore: 0
            };
            
            // 计算质量分数
            if (menuEventQuality.totalEvents > 0) {
                menuEventQuality.qualityScore = (menuEventQuality.successfulEvents / menuEventQuality.totalEvents) * 100;
            }
            
            console.log("菜单事件质量控制完成:", menuEventQuality);
            return menuEventQuality;
        } catch (error) {
            console.error("菜单事件质量控制失败:", error.message);
            return null;
        }
    }
    
    // 执行质量控制
    var qualityResult = controlMenuEventQuality();
    console.log("菜单事件质量控制结果:", qualityResult);
}

技术要点

  1. 事件顺序:注意菜单事件触发的顺序,确保在正确的时机执行相应操作
  2. 参数验证:验证菜单事件参数的有效性,避免空值或无效值
  3. 错误处理:完善的错误处理机制
  4. 性能优化:避免在菜单事件处理中执行耗时操作
  5. 资源管理:及时清理不需要的资源
  6. 状态同步:保持菜单状态的一致性
  7. 用户体验:确保菜单事件处理不影响用户体验