visio二次開發(fā)--判斷文檔是否已發(fā)生變化(變化就加星號(hào)*)
1.最近做一個(gè)故障樹診斷的項(xiàng)目,用visio二次開發(fā),可以同時(shí)打開多個(gè)繪制的故障樹圖形文檔。項(xiàng)目中需要實(shí)現(xiàn)判斷文檔是否發(fā)生變化,這是很多編輯軟件的基本功能,變化了就加個(gè)星號(hào)*。如果整個(gè)項(xiàng)目從0開始自己設(shè)計(jì)就是另外一回事了,這里是基于visio二次開發(fā),首先想到的是去看微軟的官方文檔,看是否有相關(guān)的API,或則是否改變會(huì)觸發(fā)某些事件,遺憾的是我沒找到。
2.不過(guò)visio畢竟是微軟的產(chǎn)品,做的就是好。它對(duì)程序運(yùn)行動(dòng)態(tài)中的很多過(guò)程進(jìn)行了定義和監(jiān)視,有一個(gè)對(duì)Scope的監(jiān)視,比如粘貼,復(fù)制,刪除,移動(dòng)對(duì)象,形狀數(shù)據(jù)更改都對(duì)應(yīng)一個(gè)Scope對(duì)象,都有唯一的scopeId(Scope的具體定義就不細(xì)說(shuō)了,具體看開發(fā)文檔)。值得一提的是,這里每個(gè)操作的對(duì)應(yīng)Scope的信息我不是從開發(fā)文檔看的,而是使用Visio里面提供的開發(fā)工具(需要在設(shè)置里面選擇該項(xiàng)功能才有)一個(gè)個(gè)操作觀察的,具體看圖
括號(hào)中的內(nèi)容就是對(duì)應(yīng)的Scope對(duì)象的信息。開頭的編號(hào)是對(duì)應(yīng)的唯一scopeID。每行信息都是一個(gè)事件,都可以在程序監(jiān)視和觸發(fā)。EnterScope和ExitScope之間為一個(gè)Scope對(duì)象。
所以監(jiān)視EnterScope事件,然后判斷當(dāng)前scopeID就可以知道進(jìn)行了什么操作,比如scopeID==1187,就是移動(dòng)了對(duì)象。然后把移動(dòng)對(duì)象,粘貼,刪除等等之類的都或上,這要是這些就可以判定文檔發(fā)生了改變。
我的項(xiàng)目中具體涉及代碼如下:
private void VisApplication_EnterScope(Visio.Application app, int scopeID, String description)//故障樹文檔發(fā)生改變,要記錄,關(guān)閉時(shí)提示保存
{
axDrawingControl1.Document.Pages[1].CellChanged -= new EPage_CellChangedEventHandler(Form_paint_CellChanged);//文檔發(fā)生更改事件
axDrawingControl1.Document.Pages[1].CellChanged += new EPage_CellChangedEventHandler(Form_paint_CellChanged);//文檔發(fā)生更改事件
// Console.WriteLine("$currentScope.tostring$" + app.CurrentScope.ToString()+ "$ID$" + scopeID.ToString() + "$Des$" + description);
/*
1188$ID$1188$Des$設(shè)置對(duì)象大小;0
delete=1486,//刪除對(duì)象
dragInto=1246,//拖入圖形
moveShape = 1187,//移動(dòng)對(duì)象
shapeData=1312,//形狀數(shù)據(jù)
changePageSize=1239,//更改頁(yè)面大小
changeShapeSize = 1189,//設(shè)置對(duì)象大小
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;//變化了,需要保存到臨時(shí)文件夾
string temp = TabControl.SelectedTab.Text;
if (temp[temp.Length - 5] != '*')
{
TabControl.SelectedTab.Text = temp.TrimEnd() + " * ";
}
}
}
3.Scope的具體定義開發(fā)文檔中很詳細(xì),如果有耐心你也可以一個(gè)個(gè)試,在開發(fā)者工具-事件監(jiān)視器里觀察。
4.至于前兩句EPage_CellChangedEventHandler,這是我的程序中為了動(dòng)態(tài)判斷形狀數(shù)據(jù)是否合法,實(shí)事監(jiān)控形狀數(shù)據(jù)對(duì)應(yīng)的Cel發(fā)生變化的事件進(jìn)行判斷。為什么先刪除事件代理再添加?是為了解決程序里的另一個(gè)問(wèn)題,這里不細(xì)說(shuō)。
程序中的效果如下:
相關(guān)文章
C#遍歷文件夾及其子目錄的完整實(shí)現(xiàn)方法
這篇文章主要介紹了C#遍歷文件夾及其子目錄的方法,涉及C#文件與目錄的基本操作技巧,簡(jiǎn)單實(shí)用,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06C#網(wǎng)站生成靜態(tài)頁(yè)面的實(shí)例講解
今天小編就為大家分享一篇關(guān)于C#網(wǎng)站生成靜態(tài)頁(yè)面的實(shí)例講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01C#生成互不相同隨機(jī)數(shù)的實(shí)現(xiàn)方法
這篇文章主要介紹了C#生成互不相同隨機(jī)數(shù)的實(shí)現(xiàn)方法,文中詳細(xì)描述了C#生成互不相同隨機(jī)數(shù)的各個(gè)步驟及所用到的函數(shù),非常具有借鑒價(jià)值,需要的朋友可以參考下2014-09-09Unity Shader實(shí)現(xiàn)圖形繪制(藍(lán)天白云大海)
這篇文章主要為大家詳細(xì)介紹了Unity Shader實(shí)現(xiàn)圖形繪制,藍(lán)天白云大海,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04