Chinaunix首页 | 论坛 | 博客
  • 博客访问: 80585
  • 博文数量: 27
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 300
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-21 11:32
文章分类

全部博文(27)

文章存档

2010年(3)

2009年(13)

2008年(11)

我的朋友

分类: C/C++

2008-11-05 12:27:57

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;

    CComPtr ptrEventUnk = g_pEvents;

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

 

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

 

 

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

AtlUnadvise(ipWorkspace, IID_IWorkspaceEditEvents, m_dwCookie);

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

 

 

阅读(1156) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~