Visio Drawing Control中集成自定义菜单是很多项目必须的,很多朋友也问过我如何实现这些菜单,下面介绍下Visio自定义菜单的实现。
Visio二次开发中,为Visio Drawing Control添加自定义菜单有两种方式:一种是使用捕捉Visio的MouseUpEvent事件,弹出ContextMenu即可;另一种是通过在PageSheet中增加Action来实现,也就是使用RUNADDONWARGS函数来实现。
先介绍第一种方法,首先注册MouseUpEvent的事件,然后,你需要实现onDrawingControlMouseUp函数的内容,在里面你需要限制下右键的一些事件,然后通过X,Y坐标获取选定的Shape对象,弹出你的ContextMenu对象即可。
第二种方式是通过添加Action方式,使用RUNADDONWARGS函数来实现。操作也很简单,先获取指定的Page对象,清除Action事件(因为你每次加入的话,Action始终保留你的添加的内容,防止出现多个相同的右键菜单,我每次删除旧的内容,然后再添加我需要的东西),然后添加所需要
Visio Drawing Control中集成自定义菜单是很多项目必须的,很多朋友也问过我如何实现这些菜单,下面介绍下Visio自定义菜单的实现。
Visio二次开发中,为Visio Drawing Control添加自定义菜单有两种方式:一种是使用捕捉Visio的MouseUpEvent事件,弹出ContextMenu即可;另一种是通过在PageSheet中增加Action来实现,也就是使用RUNADDONWARGS函数来实现。
两种实现的效果如下图所示,两者的区别是,使用第二种会保留Visio控件的一些如复制、粘贴的原有菜单

先介绍第一种方法,首先注册MouseUpEvent的事件,如下代码所示:
drawingControl.MouseUpEvent += new AxMicrosoft.Office.Interop.VisOcx.EVisOcx_MouseUpEventHandler(this.onDrawingControlMouseUp);
然后,你需要实现onDrawingControlMouseUp函数的内容,在里面你需要限制下右键的一些事件,然后通过X,Y坐标获取选定的Shape对象,弹出你的ContextMenu对象即可,如下代码所示。
private void onDrawingControlMouseUp(object sender,AxMicrosoft.Office.Interop.VisOcx.EVisOcx_MouseUpEvent eventData)


{
if ((eventData.button == (int)VisKeyButtonFlags.visMouseRight) &&

((eventData.keyButtonState & (int)VisKeyButtonFlags.visKeyControl) ==0 ))
{

clickedShape = Utility.GetClickedShape(drawingControl, eventData.x, eventData.y);

if (clickedShape != null)
{

eventData.cancelDefault = true;
shapeShortcutMenu.Show(this,Utility.MapVisioToWindows(drawingControl, eventData.x, eventData.y));
}
}
第二种方式是通过添加Action方式,使用RUNADDONWARGS函数来实现。操作也很简单,先获取指定的Page对象,清除Action事件(因为你每次加入的话,Action始终保留你的添加的内容,防止出现多个相同的右键菜单,我每次删除旧的内容,然后再添加我需要的东西),然后添加所需要的右键菜单即可。
Visio.Page page = VisioUtility.GetPage(VisDocument, "馈线图");
if (page != null)

{
//清除所有相关的菜单事件
page.PageSheet.DeleteSection((short)VisSectionIndices.visSectionAction);

//加入新的菜单
VisioUtility.AddRightMouseAction(page.PageSheet,
"\"停电分析\"",
"RUNADDONWARGS(\"QUEUEMARKEREVENT\", \"/Drawing=停电分析\")",
isEnable, true, false, false, true, true);
}

AddRightMouseAction是一个添加右键菜单的函数,函数比较复杂,这里列出函数的原型, 它其实现的内容就是将内容写入Page对象的Actions中而已:


/**//// <summary>
/// 给SHPAE增加一个弹出菜单
/// </summary>
/// <param name="TargetShape"></param>
/// <param name="menuCaption">菜单标题</param>
/// <param name="menuAction">菜单动作</param>
/// <param name="menuEnabled">菜单的可用性</param>
/// <param name="menuChecked"></param>
/// <param name="beginGroup"></param>
/// <param name="addToBottom"></param>
/// <param name="menuCaptionISFormula"></param>
/// <param name="menuVisible">是否可见</param>
public static void AddRightMouseAction(Visio.Shape TargetShape, string menuCaption, string menuAction,
bool menuEnabled, bool menuChecked, bool beginGroup, bool addToBottom, bool menuCaptionISFormula,
bool menuVisible)

转载请注明出处:
撰写人:伍华聪 http://www.iqidi.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)