如何在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)得到
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)得到
相关文章推荐
- 如何用Delphi调用由VC开发的ATL/COM服务,并响应其事件
- All-In-One Code Framework(AIO): 如何编写VC++代码来使用COM组件 (How to use COM in a VC++ client)
- VC++中如何快速地规范代码的缩进格式? 自动缩进 快捷键
- Fragment详解之六——如何监听fragment中的回退事件与怎样保存fragment状态
- iOS 如何监听出插入耳机 拔掉耳机事件?
- 如何在ArcMap中监听键盘鼠标事件(转)
- iOS 如何监听出插入耳机 拔掉耳机事件?
- 监听来自内核hotplug的事件(代码)
- Fragment详解之六——如何监听fragment中的回退事件与怎样保存fragment状态
- iOS 如何监听出插入耳机 拔掉耳机事件?
- [Unity3D——用代码说明一切] UGUI:用代码添加事件监听
- 用惯了VB6,VC6,一时不知道如何在VS2005添加事件了
- 如何用vc2005托管代码编写一个oledb创建access2003数据库的程序?
- 右键点击修改Grid的单列值,及修改全表的值,还有相同点击事件的代码简化,及如何双击关闭一个tabsheet
- 数据集控件 放在 数据模块 上后,如何写事件代码
- vc++实现word应用程序事件监听及响应
- VC++如何获取代码运行时间
- 如何快速找出网页中事件对应的js代码片段
- vc 如何调用com
- C#如何在一个按钮事件中调用另一个按钮的事件代码