程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 如何在VC代碼中監聽ArcEngine的COM事件

如何在VC代碼中監聽ArcEngine的COM事件

編輯:vc教程

  在ArcEngine中,許多組件采用事件方式發送信息。比如,MapControl中有鼠標按下事件、鼠標移動等事件,IworkspaceEdit也有開始編輯、結束編輯等事件。有時候,我們需要知道這些事件的發生,以便在發生時候處理必要信息。那麼,如何監聽組件的事件呢?下面以監聽編輯事件作為例子說明監聽的處理方式。打開幫助,我們會看見如下代碼:

struct __declspec(uuid("0b437962
-89f
9-11d4-8b
5f
-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. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved