C#进行Visio开发的事件处理
Visio的二次开发过程中,必定要处理很多Visio事件,事件基本上分为三类:Document事件、Applicaiton事件、AxDrawingControl事件。Document事件是每个文档创建或者打开都需要重新绑定一次的,但是Application事件不变,即不需要重新绑定,AxDrawingControl是ActiveX控件的事件响应。
在C#进行Visio的开发中,通过继承接口IVisEventProc,可以创建事件的侦听处理类,如下所示:
[ComVisible(
true
)]
public
sealed
class
EventSink2 : IVisEventProc
{
..
object
IVisEventProc.VisEventProc(
short
eventCode,
object
source,
int
eventId,
int
eventSequenceNumber,
object
subject,
object
moreInfo)
{
}
}
事件有很多类,有Application级别的,有Document级别的,有Page级别的,有Shape级别的,有Windows级别的,有Cell级别的..............,下面截取一部分事件代码看看
//
Document event codes
case
(
short
)Microsoft.Office.Interop.Visio.VisEventCodes.
visEvtDoc
+
(
short
)Microsoft.Office.Interop.Visio.
VisEventCodes.visEvtDel:
case
(
short
)Microsoft.Office.Interop.Visio.VisEventCodes.
visEvtCodeBefDocSave:
case
(
short
)Microsoft.Office.Interop.Visio.VisEventCodes.
visEvtCodeBefDocSaveAs:
case
(
short
)Microsoft.Office.Interop.Visio.VisEventCodes.
visEvtCodeDocDesign:
//
Page event codes
case
(
short
)Microsoft.Office.Interop.Visio.VisEventCodes.
visEvtPage
+
(
short
)Microsoft.Office.Interop.Visio.
VisEventCodes.visEvtDel:
case
(
short
)Microsoft.Office.Interop.Visio.VisEventCodes.
visEvtPage
+
visEvtAdd:
case
(
short
)Microsoft.Office.Interop.Visio.VisEventCodes.
visEvtPage
+
(
short
)Microsoft.Office.Interop.Visio.
VisEventCodes.visEvtMod:
//
Master event codes
case
(
short
)Microsoft.Office.Interop.Visio.VisEventCodes.
visEvtMaster
+
(
short
)Microsoft.Office.Interop.Visio.
VisEventCodes.visEvtDel:
case
(
short
)Microsoft.Office.Interop.Visio.VisEventCodes.
visEvtMaster
+
(
short
)Microsoft.Office.Interop.Visio.
VisEventCodes.visEvtMod:
case
(
short
)Microsoft.Office.Interop.Visio.VisEventCodes.
visEvtCodeCancelMasterDel:
//
Shape event codes
case
(
short
)Microsoft.Office.Interop.Visio.VisEventCodes.
visEvtShape
+
(
short
)Microsoft.Office.Interop.Visio.
VisEventCodes.visEvtDel:
case
(
short
)Microsoft.Office.Interop.Visio.VisEventCodes.
visEvtCodeShapeBeforeTextEdit:
case
(
short
)Microsoft.Office.Interop.Visio.VisEventCodes.
visEvtShape
+
visEvtAdd:
case
(
short
)Microsoft.Office.Interop.Visio.VisEventCodes.
visEvtShape
+
(
short
)Microsoft.Office.Interop.Visio.
VisEventCodes.visEvtMod:
//
Cell event codes
case
(
short
)Microsoft.Office.Interop.Visio.VisEventCodes.
visEvtCell
+
(
short
)Microsoft.Office.Interop.Visio.
VisEventCodes.visEvtMod:
case
(
short
)Microsoft.Office.Interop.Visio.VisEventCodes.
visEvtFormula
+
(
short
)Microsoft.Office.Interop.Visio.
VisEventCodes.visEvtMod:
还有很多很多..
将事件和我们的处理函数联系起来,还需要对事件进行侦听,即AddAdvise,下面列出一段如何侦听事件的代码供参考
const
string
sink
=
""
;
Event newEvent
=
null
;
EventList applicationEvents
=
eventApplication.EventList;
EventList documentEvents
=
eventDocument.EventList;
newEvent
=
documentEvents.AddAdvise(
(
unchecked
((
short
)VisEventCodes.visEvtAdd)
+
(
short
)VisEventCodes.visEvtShape),
(IVisEventProc)
this
, sink,
"
ShapeAdd
"
);
newEvent
=
documentEvents.AddAdvise(
(
short
)VisEventCodes.visEvtDel
+
(
short
)VisEventCodes.visEvtShape,
(IVisEventProc)
this
, sink,
"
ShapeDelete
"
);
newEvent
=
documentEvents.AddAdvise(
(
short
)VisEventCodes.visEvtMod
+
(
short
)VisEventCodes.visEvtCell,
(IVisEventProc)
this
, sink,
"
CellChanged
"
);
newEvent
=
documentEvents.AddAdvise(
(
short
)VisEventCodes.visEvtCodeShapeExitTextEdit,
(IVisEventProc)
this
, sink,
"
ShapeExitedTextEdit
"
);
newEvent
=
documentEvents.AddAdvise(
(
short
)VisEventCodes.visEvtCodeQueryCancelSelDel,
(IVisEventProc)
this
, sink,
"
QueryCancelSelectionDelete
"
);
具体的使用,最好下载Visio2007 SDK进行学习,自己编写一些例子对事件进行处理