如何在VC程式碼中監聽ArcEngine的COM事件
在 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)得到
相關文章
- flutter 中監聽滑動事件Flutter事件
- 如何在元件中監聽Vuex的資料變化元件Vue
- 如何在MyEclipse中監聽TCP/IP資料傳輸EclipseTCP
- RAC中監聽通知的坑!
- flutter中監聽鍵盤Flutter
- 如何在vue中監聽scroll,從而實現滑動載入更多Vue
- VC++實現COM事件接收器C++事件
- Redis中監聽key過期通知Redis
- oracle中監聽器show命令備記Oracle
- 程式碼如人
- 想學習VC?聽聽vchome斑竹的 (轉)
- [VC] 滑鼠事件的響應事件
- js監聽鍵盤事件程式碼例項例項JS事件
- 寫程式碼如寫散文
- linux系統中監聽埠概念是什麼?Linux
- JMETER中監聽器無結果解決辦法JMeter
- 閱讀layim程式碼小記,監聽事件實現方法事件
- 寫寫程式碼 聽聽歌
- 如何在 SAP Spartacus 中編寫 ASM-Compatible 的程式碼ASM
- 事件監聽事件
- VC++常用功能程式碼C++
- 事件和事件監聽器事件
- VC版DoEvents/處理事件事件
- 重構程式碼(應如寫詩)
- Laravel 中的事件監聽Laravel事件
- passive 的事件監聽器事件
- flutter原始碼系列 PageView原始碼分析以及監聽事件Flutter原始碼View事件
- SpringBoot事件監聽器原始碼分析Spring Boot事件原始碼
- Spring事件監聽機制原始碼解析Spring事件原始碼
- 微信小程式如何在事件中傳參微信小程式事件
- 如何在 Laravel 中監聽控制器, 模版, 樣式檔案並在瀏覽器中實現自動重新整理Laravel瀏覽器
- Flutter事件監聽Flutter事件
- jQuery事件監聽jQuery事件
- 監聽滑鼠事件事件
- JavaScript 事件監聽JavaScript事件
- js 監聽事件JS事件
- 好程式碼如文件,不言自明
- VC++、MFC、COM和ATL的區別C++