visio二次開發 事件篇

2022-07-16 10:45:12 字數 4534 閱讀 5258

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設計模式開發,基於模組和操作的方式進行訪問,採用單一入口模式進行專案部署和訪問,無論訪問任何乙個模組或者功能,只有乙個統一的入口...