visio二次开发--判断文档是否已发生变化(变化就加星号*)

 更新时间:2013年04月02日 17:02:08   作者:  
最近做一个故障树诊断的项目,用visio二次开发,可以同时打开多个绘制的故障树图形文档。项目中需要实现判断文档是否发生变化,这是很多编辑软件的基本功能,变化了就加个星号*

1.最近做一个故障树诊断的项目,用visio二次开发,可以同时打开多个绘制的故障树图形文档。项目中需要实现判断文档是否发生变化,这是很多编辑软件的基本功能,变化了就加个星号*。如果整个项目从0开始自己设计就是另外一回事了,这里是基于visio二次开发,首先想到的是去看微软的官方文档,看是否有相关的API,或则是否改变会触发某些事件,遗憾的是我没找到。

2.不过visio毕竟是微软的产品,做的就是好。它对程序运行动态中的很多过程进行了定义和监视,有一个对Scope的监视,比如粘贴,复制,删除,移动对象,形状数据更改都对应一个Scope对象,都有唯一的scopeId(Scope的具体定义就不细说了,具体看开发文档)。值得一提的是,这里每个操作的对应Scope的信息我不是从开发文档看的,而是使用Visio里面提供的开发工具(需要在设置里面选择该项功能才有)一个个操作观察的,具体看图

括号中的内容就是对应的Scope对象的信息。开头的编号是对应的唯一scopeID。每行信息都是一个事件,都可以在程序监视和触发。EnterScope和ExitScope之间为一个Scope对象。

所以监视EnterScope事件,然后判断当前scopeID就可以知道进行了什么操作,比如scopeID==1187,就是移动了对象。然后把移动对象,粘贴,删除等等之类的都或上,这要是这些就可以判定文档发生了改变。

我的项目中具体涉及代码如下:

复制代码 代码如下:

private void VisApplication_EnterScope(Visio.Application app, int scopeID, String description)//故障树文档发生改变,要记录,关闭时提示保存
        {
            axDrawingControl1.Document.Pages[1].CellChanged -= new EPage_CellChangedEventHandler(Form_paint_CellChanged);//文档发生更改事件
            axDrawingControl1.Document.Pages[1].CellChanged += new EPage_CellChangedEventHandler(Form_paint_CellChanged);//文档发生更改事件
            //   Console.WriteLine("$currentScope.tostring$" + app.CurrentScope.ToString()+ "$ID$" + scopeID.ToString() + "$Des$" + description);
            /*
             1188$ID$1188$Des$设置对象大小;0
            delete=1486,//删除对象
            dragInto=1246,//拖入图形
            moveShape = 1187,//移动对象
            shapeData=1312,//形状数据
            changePageSize=1239,//更改页面大小
            changeShapeSize = 1189,//设置对象大小
            paste = 1022 //粘贴
            paste2 = 1158 //粘贴
            1501//插入注释
            */
            if (scopeID == 1486 || scopeID == 1246 || scopeID == 1187 || scopeID == 1312 || scopeID == 1239 || scopeID == 1189 || scopeID == 1022 || scopeID == 1158 || scopeID == 1188 || scopeID == 1501)
            {
                needSave = true;//变化了,需要保存到临时文件夹

                string temp = TabControl.SelectedTab.Text;
                if (temp[temp.Length - 5] != '*')
                {
                    TabControl.SelectedTab.Text = temp.TrimEnd() + " *    ";
                }
            }
        }

3.Scope的具体定义开发文档中很详细,如果有耐心你也可以一个个试,在开发者工具-事件监视器里观察。
4.至于前两句EPage_CellChangedEventHandler,这是我的程序中为了动态判断形状数据是否合法,实事监控形状数据对应的Cel发生变化的事件进行判断。为什么先删除事件代理再添加?是为了解决程序里的另一个问题,这里不细说。

程序中的效果如下:

 

相关文章

  • C#遍历文件夹及其子目录的完整实现方法

    C#遍历文件夹及其子目录的完整实现方法

    这篇文章主要介绍了C#遍历文件夹及其子目录的方法,涉及C#文件与目录的基本操作技巧,简单实用,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • unity实现透明水波纹扭曲

    unity实现透明水波纹扭曲

    这篇文章主要为大家详细介绍了unity实现透明水波纹扭曲,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C#如何更改Word的语言设置

    C#如何更改Word的语言设置

    这篇文章主要为大家详细介绍了C#如何更改Word的语言设置,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • C#网站生成静态页面的实例讲解

    C#网站生成静态页面的实例讲解

    今天小编就为大家分享一篇关于C#网站生成静态页面的实例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • C#控制台下测试多线程的方法

    C#控制台下测试多线程的方法

    这篇文章主要介绍了C#控制台下测试多线程的方法,涉及C#操作多线程的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C# 实现枚举转列表

    C# 实现枚举转列表

    这篇文章主要介绍了C# 如何实现枚举转列表,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12
  • C#日期格式化的几个要点小结

    C#日期格式化的几个要点小结

    本文将介绍C#日期格式化的几个要点,包括标准 DateTime 格式字符串。希望大家能从中得到更多的理解和帮助
    2013-09-09
  • C#生成互不相同随机数的实现方法

    C#生成互不相同随机数的实现方法

    这篇文章主要介绍了C#生成互不相同随机数的实现方法,文中详细描述了C#生成互不相同随机数的各个步骤及所用到的函数,非常具有借鉴价值,需要的朋友可以参考下
    2014-09-09
  • C# ConfigHelper 辅助类介绍

    C# ConfigHelper 辅助类介绍

    ConfigHelper(包含AppConfig和WebConfig), app.config和web.config的[appSettings]和[connectionStrings]节点进行新增、修改、删除和读取相关的操作。
    2013-04-04
  • Unity Shader实现图形绘制(蓝天白云大海)

    Unity Shader实现图形绘制(蓝天白云大海)

    这篇文章主要为大家详细介绍了Unity Shader实现图形绘制,蓝天白云大海,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04

最新评论