您的位置:首页 > 编程语言

如何在VC代码中监听ArcEngine的COM事件

2011-05-17 15:23 375 查看

ArcEngine

中,许多组件采用事件方式发送信息。比如,
MapControl

中有鼠标按下事件、鼠标移动等事件,
IworkspaceEdit

也有开始编辑、结束编辑等事件。

有时候,我们需要知道这些事件的发生,以便在发生时候处理必要信息。

那么,如何监听组件的事件呢?下面以监听编辑事件作为例子说明监听的处理方式。

打开帮助,我们会看见如下代码:

struct
__declspec
(uuid
("0b437962-89f9-11d4-8b5f-000000000000"
))

IWorkspaceEditEvents : IUnknown

{

//

// Raw methods provided by interface

//

virtual
HRESULT __stdcall
OnStartEditing (

VARIANT_BOOL withUndoRedo ) = 0;

virtual
HRESULT __stdcall
OnStopEditing (

VARIANT_BOOL saveEdits ) = 0;

virtual
HRESULT __stdcall
OnStartEditOperation ( ) = 0;

virtual
HRESULT __stdcall
OnAbortEditOperation ( ) = 0;

virtual
HRESULT __stdcall
OnStopEditOperation ( ) = 0;

virtual
HRESULT __stdcall
OnUndoEditOperation ( ) = 0;

virtual
HRESULT __stdcall
OnRedoEditOperation ( ) = 0;

};

从上述代码看到编辑事件的函数定义。我们需要建立一个类,重载上述函数。

class
CAEEditEvents :

public
CComObjectRoot,

public
IWorkspaceEditEvents

{

public
:

CAEEditEvents(void
);

~CAEEditEvents(void
);

BEGIN_COM_MAP(CAEEditEvents)

COM_INTERFACE_ENTRY(IWorkspaceEditEvents)

END_COM_MAP()

STDMETHOD(OnStartEditing)(VARIANT_BOOL withUndoRedo)

{

::MessageBox(NULL, _T("

开始编辑了呢?"

), _T("

注意了!!!"

), MB_OK);

return
E_NOTIMPL;

}

STDMETHOD(OnStopEditing)(VARIANT_BOOL saveEdits)

{

return
E_NOTIMPL;

}

STDMETHOD(OnStartEditOperation)()

{

return
E_NOTIMPL;

}

STDMETHOD(OnAbortEditOperation)()

{

return
E_NOTIMPL;

}

STDMETHOD(OnStopEditOperation)()

{

return
E_NOTIMPL;

}

STDMETHOD(OnUndoEditOperation)()

{

return
E_NOTIMPL;

}

STDMETHOD(OnRedoEditOperation)()

{

return
E_NOTIMPL;

}

};

STDMETHOD
的定义弄不明白?唉,其实就是一个宏定义,简化虚函数的定义而已的。

STDMETHOD(OnRedoEditOperation)()
其实就是:

virtual
HRESULT __stdcall
OnRedoEditOperation ( )


简单得很啊!!要是还有很多不明白,那么赶紧看看关于COM
方面的知识吧。

看见了吧?我们把
IworkspaceEditEvents
的接口
函数都实现一次。注意,我们在类定义时候增加了一个
public
CcomObjectRoot
,为什么呢?这里不再解释,权当必须的吧。想知道原因,自己参考COM
方面的知识。

这样,我们把监听的类都准备好了。类只做一个事情,就是当开始编辑这个事件发生时候,发出一个询问,该询问也没有做任何事情,仅仅询问而已。

下面,就正式开始了。先定义变量:

CAEEditEvents *g_pEvents;

DWORD m_dwCookie;

这个变量定义在什么地方? 看你喜欢定义在什么地方啦。

定义完毕,就应该让Iworkspace
知道,你想做什么的时候,要告诉我呀!怎么告诉呢?看下面:

g_pEvents = new
CComObject<CAEEditEvents>;

CComPtr<IUnknown> ptrEventUnk = g_pEvents;

AtlAdvise(ipWorkspace, ptrEventUnk, IID_IWorkspaceEditEvents, &m_dwCookie);

好了,到这里就结束了。等会
Iworkspace
有什么动作的时候,自然会告诉CAEEditEvents
的。

最后,在不需要的时候,不要忘记下面的代码啊:

AtlUnadvise(ipWorkspace, IID_IWorkspaceEditEvents, m_dwCookie);

这个代码干什么的,自己琢磨好了。

------------------------------------------------------------------

注意:

(1) 自定义的类必须重载接口的全部虚函数,如GetTypeInfoCount,GetTypeInfo等

(2) CComModule _Module; 必须要写在全局位置

(3)

IID 可以由__uuidof(IMapControlEvents2)得到
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: