欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-10 15:35:16
1.最近做一个故障树诊断的项目,用visio二次开发,可以同时打开多个绘制的故障树图形文档。项目中需要实现判断文档是否发生变化,这是很多编辑软件的基本功能,变化了就加个星号...

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

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

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

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发生变化的事件进行判断。为什么先删除事件代理再添加?是为了解决程序里的另一个问题,这里不细说。

程序中的效果如下:

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