C#进行Visio二次开发之自定义右键菜单

简介:

Visio Drawing Control中集成自定义菜单是很多项目必须的,很多朋友也问过我如何实现这些菜单,下面介绍下Visio自定义菜单的实现。

Visio二次开发中,为Visio Drawing Control添加自定义菜单有两种方式:一种是使用捕捉VisioMouseUpEvent事件,弹出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, truefalsefalsetruetrue);
            }

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

         /// <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)

本文转自博客园伍华聪的博客,原文链接: C#进行Visio二次开发之自定义右键菜单,如需转载请自行联系原博主。


目录
相关文章
|
7月前
|
自然语言处理 C# Windows
C#开源免费的Windows右键菜单管理工具
C#开源免费的Windows右键菜单管理工具
|
关系型数据库 MySQL C#
C# winform 一个窗体需要调用自定义用户控件的控件名称
给用户控件ucQRCode增加属性: //二维码图片 private PictureBox _pictureBoxFSHLQrCode; public PictureBox PictureBoxFSHLQrCode {   get { return _pictureBoxFSHLQrCode; }   set { this.pictureBoxFSHLQrCode = value; } } 在Form1窗体直接调用即可: ucQRCode uQRCode=new ucQRCode(); ucQRCode.PictureBoxFSHLQrCode.属性= 要复制或传给用户控件上的控件的值
71 0
|
6月前
|
C# C++
C# 自定义时间进度条
本文作者通过参考leslie_xin的一篇文章,成功创建了一个自定义的WinForms控件——时间进度条,该控件带有时间刻度和多种可定制的属性,如颜色、时间间隔等。作者在控件中加入了开始和结束时间,以及自适应的时间刻度间隔。控件能根据设置显示时间标签,并提供了事件处理,如值改变时的触发。代码中包含了计算时间刻度、绘制刻度线和时间标签的逻辑。作者强调了避免循环调用事件、使用OnXXX()形式的事件处理函数以及注意自定义控件中的属性和事件设计。
140 7
|
4月前
|
开发框架 .NET 编译器
总结一下 C# 如何自定义特性 Attribute 并进行应用
总结一下 C# 如何自定义特性 Attribute 并进行应用
101 1
|
编译器 C#
c# 自定义扩展方法
c# 自定义扩展方法
|
7月前
|
移动开发 JavaScript 安全
C# 实现微信自定义分享
C# 实现微信自定义分享
|
7月前
|
C#
C#学习相关系列之自定义遍历器
C#学习相关系列之自定义遍历器
|
编译器 C#
C#中导入其它自定义的命名空间
c#中怎么导入其它自定义的命名空间首先要确保已经导入了想要导入的自定义的命名空间。如上图这时编译器应该会报错,此时就需要手动去添加引用了,cs文件默认没有添加引用,只是加载了想要导入的命名空间,但是没有添加引用,所以需要自己要手动添加引用。切记!然后会有一个对话框选择你想引用的命名空间,点击确定即可。注意:一般而言,C#中如果没有改变那么一般项目的类名都默认是Program,在引用时需要注...
107 1
C#中导入其它自定义的命名空间
|
C# 图形学
C#绘制自定义小人
C#绘制自定义小人