1.最近做一個(gè)故障樹診斷的項(xiàng)目,用visio二次開(kāi)發(fā),可以同時(shí)打開(kāi)多個(gè)繪制的故障樹圖形文檔。項(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)目中具體涉及代碼如下:
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ō)。
程序中的效果如下:
新聞熱點(diǎn)
疑難解答
圖片精選