右键菜单
大约 2 分钟
右键菜单
WebCAD 提供了灵活的右键菜单系统,支持自定义菜单项、根据命令状态调整菜单、完全替换默认菜单等功能。
事件系统
右键菜单通过事件系统进行自定义,主要使用 ContextMenuOpening 事件。
import { CadEventManager, CadEvents } from 'webcad-lib-ts';
const events = CadEventManager.getInstance();
events.on(CadEvents.ContextMenuOpening, (args) => {
// 自定义右键菜单
});基础用法
添加自定义菜单项
在默认菜单项前后添加自定义项:
events.on(CadEvents.ContextMenuOpening, (args) => {
// 在默认菜单之前添加
args.prependItems.push({
label: "我的工具",
icon: "tool",
submenu: [
{
label: "画圆",
callback: () => {
const c = new CircleEnt([50, 50], 15);
c.setDefaults();
Engine.addEntities(c);
}
},
{
label: "画线",
callback: () => {
const l = new LineEnt([0, 0], [100, 100]);
l.setDefaults();
Engine.addEntities(l);
}
}
]
});
// 分隔线
args.prependItems.push({ isSeparator: true });
// 在默认菜单之后添加
args.appendItems.push({ isSeparator: true });
args.appendItems.push({
label: "缩放全图",
shortcut: "Z+E",
callback: () => Engine.zoomExtents()
});
});禁止系统右键菜单
events.on(CadEvents.ContextMenuOpening, (args) => {
args.cancel = true; // 完全禁止显示菜单
});根据命令状态定制菜单
events.on(CadEvents.ContextMenuOpening, (args) => {
if (args.isCommandActive) {
// 有命令正在执行
console.log('当前命令:', args.activeCommandName);
// 为特定命令添加选项
if (args.activeCommandName === 'LINE') {
args.appendItems.push({
label: "闭合",
callback: () => { /* 闭合逻辑 */ }
});
}
} else {
// 空闲状态
args.prependItems.push({
label: "快捷命令",
submenu: [
{ label: "画线", command: "LINE" },
{ label: "画圆", command: "CIRCLE" }
]
});
}
});完全自定义菜单
禁用默认菜单项,只显示自定义项:
events.on(CadEvents.ContextMenuOpening, (args) => {
args.useDefaultItems = false; // 不显示默认菜单项
args.prependItems.push({ label: "自定义项1", callback: () => {} });
args.prependItems.push({ label: "自定义项2", callback: () => {} });
args.prependItems.push({ isSeparator: true });
args.prependItems.push({ label: "缩放全图", callback: () => Engine.zoomExtents() });
});事件参数
ContextMenuOpeningEventArgs
| 属性 | 类型 | 说明 |
|---|---|---|
document | CadDocument | 当前文档 |
screenX | number | 屏幕坐标 X |
screenY | number | 屏幕坐标 Y |
canvasX | number | 画布坐标 X |
canvasY | number | 画布坐标 Y |
isCommandActive | boolean | 是否有命令正在执行 |
activeCommandName | string | undefined | 当前命令名称 |
menuItems | ContextMenuItemInfo[] | 默认菜单项(可修改) |
prependItems | ContextMenuItemInfo[] | 前置自定义项 |
appendItems | ContextMenuItemInfo[] | 后置自定义项 |
useDefaultItems | boolean | 是否显示默认项 |
cancel | boolean | 是否取消显示菜单 |
菜单项配置
ContextMenuItemInfo
| 属性 | 类型 | 说明 |
|---|---|---|
label | string | 菜单文本 |
icon | string | 图标名称 |
shortcut | string | 快捷键文本 |
command | string | 系统命令名称 |
callback | () => void | 点击回调函数 |
submenu | ContextMenuItemInfo[] | 子菜单数组 |
disabled | boolean | 是否禁用 |
checked | boolean | 是否选中 |
isSeparator | boolean | 是否为分隔线 |
相关事件
| 事件 | 说明 |
|---|---|
ContextMenuOpening | 右键菜单打开前(可取消、可自定义) |
ContextMenuOpened | 右键菜单打开后 |
ContextMenuItemClicked | 菜单项点击 |
示例代码
完整示例请参考:
06contextmenu.js- 添加自定义项06contextmenu_disable.js- 禁止菜单06contextmenu_command.js- 根据命令状态定制06contextmenu_custom.js- 完全自定义菜单