visio
二次開發的事件程式設計主要分為四個步驟:
首先,需要建立
visio
事件**和
visio
事件處理類,並新增需要處理的事件;
其次,對需要處理的事件向物件進行註冊,即新增到物件的
eventlist
事件列表中,並同時指定
visio
事件處理類。這樣,當物件觸發了相應的事件後,能夠向事件處理類發出通知;
再次,需要實現事件處理類的事件處理方法,以便當接到通知後,能夠做出相應的處理;
最後,根據接收到的事件通知,判斷其事件**、事件源、作用物件、事件
id等引數,來觸發相應的需要處理的事件。
下面結合原始碼給予說明:
1.建立
visio
事件**和
visio
事件處理類,並新增需要處理的事件
//////
是乙個用於處理visio事件的visio事件**
//////
引發事件的visio物件
///與事件相關的引數
public
delegate
void
visioeventhandler(object sender, eventargs e);
//////
這是乙個visio事件處理類,繼承iviseventproc。
///所有的註冊了的visio事件發出通知後,都會呼叫viseventproc()過程;
///public
sealed
class
eventsink : iviseventproc
;///
///圖形新增事件
///public
event
visioeventhandler onshapeadd;
//////
圖形刪除事件
///public
event
visioeventhandler onshapedelete;
//////
定義圖形雙擊事件
///public
event
visioeventhandler onshapedoubleclick;
2.向物件註冊事件,可以接收註冊事件的物件有:
和document
。就是將事件分為處於應用層的事件(和應用相關的事件),還有文件層的事件(只和文件相關的事件)。那麼哪一些事件和
相關?哪一些事件和
document
相關呢?可以參考前一篇文章「
visio
二次開發
_事件篇
_事件分類」。這裡和
相關的事件與和
document
相關的事件有點區別,關於這方面的內容,在後續的文章會有介紹。
向物件註冊事件,其實就是呼叫物件的
eventlist
的addadvise
()方法:
假設有物件
和document
物件visdocument
。eventlist
eventlist
documentevents = visdocument.eventlist;
event
newevent = null;
// 向visdocument註冊該文件的圖形新增事件
newevent = documentevents.addadvise(
(unchecked((short)viseventcodes.visevtadd) +
(short)viseventcodes.visevtshape),
(iviseventproc)this, sink, targetargs);
// 向visdocument註冊該文件的圖形刪除事件
newevent = documentevents.addadvise(
(short)viseventcodes.visevtdel +
(short)viseventcodes.visevtshape,
(iviseventproc)this, sink, targetargs);
// (short)viseventcodes.visevtmarker,
(iviseventproc)this, sink, targetargs);
3.實現事件處理類的事件處理方法,根據
eventcode
判斷是什麼樣的事件,這裡需要注意的是要將
viseventcodes
強制轉變為
short
型別。關於標籤事件在後續的文章中會介紹:
object
iviseventproc.viseventproc(short eventcode, object source,
int eventid,
int eventsequencenumber,
object subject,
object moreinfo)
switch
(eventcode)
4. 觸發相應的需要處理的事件。由於篇幅原因,這裡只給出圖形新增的例子。需要注意的事情是,為了提高效率,往往會使用佇列來處理這些圖形新增事件,就是暫時將新增的圖形放到佇列中去,等到空閒的時候,再出隊處理(即丟擲事件):
private
void handleshapeadd(shape addedshape)
當然要進行事件程式設計,到這裡並沒有結束。需要進行事件程式設計的元件還要向這個visio事件處理類的例項物件註冊事件處理方法:
eventsink
visioeventsink = new
eventsink();
//註冊圖形新增處理事件;
visioeventsink. onshapeadd += new
visioeventhandler(visioeventsink_onshapedoubleclick);
//註冊圖形刪除處理事件;
visioeventsink. onshapedelete +=
newvisioeventhandler(visioeventsink_onselectthesamefloorshape);
其實本文主要介紹了如何註冊事件,相應事件通知,再分別丟擲事件等過程。拋磚引玉,希望大家提出自己的高見。
下面是完整的原始碼:
code
using
system;
using
system.diagnostics;
using
microsoft.office.interop.visio;
namespace
indoordistribut
//////
當然這首先要通過addadvise()新增需要偵測的事件。
///也就是需要用addadvise()向visio註冊事件;
///summary>
[clscompliant(
false
)]public
void
if==
null)if
(callingdocument
==null
)object
iviseventproc.viseventproc(
short
eventcode,
object
source,
inteventid,
inteventsequencenumber,
object
subject,
object
=null
;document eventdocument
=null
;shape eventshape
=null;if
(source is=
else
if(source
isivdocument)
switch
(eventcode)
return
null;}
private
void
setaddadvise()
catch
(exception e)
return;}
///visio空閒時,需做的處理
private
void
//處理新增圖形事件佇列
if(onshapeadd
!=null)}
else
//處理新增圖形事件佇列
if(onshapedelete
!=null)}
else
return;}
private
void
handleshapeadd(shape addedshape)
private
void
handleshapedelete(shape deletedshape)}}
Visio二次開發(一) 巧用Visio巨集
最近做的專案中需要用到visio二次開發,安裝了visio的sdk,還有從網上找了一些這方面的部落格,visio的sdk是全英文的,看著有點費勁,很多的東西都不知道該如何去找,不過網上的一些部落格還是有一些不錯的,前兩天發現乙個有助於visio二次開發的方法,下面分享給大家。就是巧用visio的巨集...
postek二次開發 POSTEK二次開發介面
例項簡介 例項截圖 核心 using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.text using ...
mcms二次開發 YzmCMS二次開發手冊
摘要 yzmcms是採用mvc設計模式開發,基於模組和操作的方式進行訪問,採用單一入口模式進行專案部署和訪問,無論訪問任何乙個模組或者功能,只有一.yzmcms是採用mvc設計模式開發,基於模組和操作的方式進行訪問,採用單一入口模式進行專案部署和訪問,無論訪問任何乙個模組或者功能,只有乙個統一的入口...