visio二次開(kāi)發(fā)--判斷文檔是否已發(fā)生變化(變化就加星號(hào)*)
1.最近做一個(gè)故障樹(shù)診斷的項(xiàng)目,用visio二次開(kāi)發(fā),可以同時(shí)打開(kāi)多個(gè)繪制的故障樹(shù)圖形文檔。項(xiàng)目中需要實(shí)現(xiàn)判斷文檔是否發(fā)生變化,這是很多編輯軟件的基本功能,變化了就加個(gè)星號(hào)*。如果整個(gè)項(xiàng)目從0開(kāi)始自己設(shè)計(jì)就是另外一回事了,這里是基于visio二次開(kāi)發(fā),首先想到的是去看微軟的官方文檔,看是否有相關(guān)的API,或則是否改變會(huì)觸發(fā)某些事件,遺憾的是我沒(méi)找到。
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ō)了,具體看開(kāi)發(fā)文檔)。值得一提的是,這里每個(gè)操作的對(duì)應(yīng)Scope的信息我不是從開(kāi)發(fā)文檔看的,而是使用Visio里面提供的開(kāi)發(fā)工具(需要在設(shè)置里面選擇該項(xiàng)功能才有)一個(gè)個(gè)操作觀察的,具體看圖


括號(hào)中的內(nèi)容就是對(duì)應(yīng)的Scope對(duì)象的信息。開(kāi)頭的編號(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)//故障樹(shù)文檔發(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的具體定義開(kāi)發(fā)文檔中很詳細(xì),如果有耐心你也可以一個(gè)個(gè)試,在開(kāi)發(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#判斷一天、一年已經(jīng)過(guò)了百分之多少的方法
這篇文章主要介紹了C#判斷一天、一年已經(jīng)過(guò)了百分之多少的方法,涉及C#針對(duì)時(shí)間及日期的運(yùn)算與判定技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
C#開(kāi)發(fā)Windows UWP系列之3D變換
這篇文章介紹了C#開(kāi)發(fā)Windows UWP系列之3D變換,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
使用C#實(shí)現(xiàn)簡(jiǎn)單的線性回歸的代碼詳解
最近注意到了NumSharp,想學(xué)習(xí)一下,最好的學(xué)習(xí)方式就是去實(shí)踐,因此從github上找了一個(gè)用python實(shí)現(xiàn)的簡(jiǎn)單線性回歸代碼,然后基于NumSharp用C#進(jìn)行了改寫(xiě),需要的朋友可以參考下2024-01-01
基于C#的電視臺(tái)節(jié)目表接口調(diào)用代碼
這篇文章主要介紹了基于C#的電視臺(tái)節(jié)目表接口調(diào)用代碼的相關(guān)資料,需要的朋友可以參考下2016-06-06

