翻譯|其它|編輯:郝浩|2006-06-23 17:02:00.000|閱讀 2118 次
概述:
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在完整的框架中,控件宿主功能是在 AxHost 類中實現的。AxHost 類與 CAxHostWindow 類十分相似,后者是一個 ATL 模板類,定義了一個可以宿主 ActiveX 控件的窗口。與 CAxHostWindow 類似,完整框架中的 AxHost 此時能完成的任務大大超出您的需要。在該實現中,您能做到的遠不止對工具欄、屬性頁、框架等的操作。
為了讓實現更易于管理,您需要引入幾個功能部件來封裝整體設計的某些邏輯子集。例如,容器支持將在 AxContainer 類中實現,如圖 1 所示。OleSite 類將負責與站點相關的接口,并負責與控件的 IObjectWithSite 接口交互。
聲明并實例化控件
要在 .NET Compact Framework 中宿主控件,您需要完成兩個主要任務。需要使用 COM 接口定義創建一個導入庫,并構建一個從 AxHost 類派生的控件類。
獲得一個 COM 接口定義
要宿主控件,需要在從 AxHost 類派生的類中實現特定于控件的接口(IDispatch 或 IUnknown)。例如,Microsoft Windows Media Player 控件支持這樣的調度接口:它們允許獲取和設置屬性,以及接收事件。它還支持 IUnknown 接口(如 IWMPCore 和 IWMPPlayer),這些接口可以并且應該直接映射到 .NET Compact Framework 類和接口。AxHost 類允許您通過 GetOcx 方法訪問控件的 IUnknown 接口。如果您在 .NET Compact Framework 代碼中有一個 COM 接口定義,則只需將 GetOcx 方法返回的對象類型轉換為接口類型,框架就會內部執行 QueryInterface 方法。
手動創建接口定義
某些情況下,您會有一個 .idl 文件,它是由控件或 SDK 提供的。這種文件的定義可以手動轉換為 .NET Compact Framework。要這么做并不容易,而且很容易出錯。該方法是您最后的一招 - 當本文描述的其他方法不可用時。
例如,IWMPCdrom 接口是在完整的 Windows Media Player 10 中定義的,如以下示例代碼所示。
[ object, uuid(74C09E02-F828-11d2-A74B-00A0C905F36E), dual, helpstring("IWMPControls: Public interface."), pointer_default(unique) ] interface IWMPControls : IDispatch { [ id( DISPID_WMPCONTROLS_ISAVAILABLE ), propget ] HRESULT isAvailable( [in] BSTR bstrItem, [out, retval] VARIANT_BOOL *pIsAvailable ); [ id( DISPID_WMPCONTROLS_PLAY ) ] HRESULT play(); [ id( DISPID_WMPCONTROLS_STOP ) ] HRESULT stop(); [ id( DISPID_WMPCONTROLS_PAUSE ) ] HRESULT pause(); [ id( DISPID_WMPCONTROLS_FASTFORWARD ) ] HRESULT fastForward(); [ id( DISPID_WMPCONTROLS_FASTREVERSE ) ] HRESULT fastReverse(); [ id( DISPID_WMPCONTROLS_CURRENTPOSITION ), propget ] HRESULT currentPosition( [out, retval] double * pdCurrentPosition ); [ id( DISPID_WMPCONTROLS_CURRENTPOSITION ), propput ] HRESULT currentPosition( [in] double dCurrentPosition ); [ id( DISPID_WMPCONTROLS_CURRENTPOSITIONSTRING ), propget ] HRESULT currentPositionString( [out, retval] BSTR * pbstrCurrentPosition ); [ id( DISPID_WMPCONTROLS_NEXT ) ] HRESULT next(); [ id( DISPID_WMPCONTROLS_PREVIOUS ) ] HRESULT previous(); [ id( DISPID_WMPCONTROLS_CURRENTITEM ), propget ] HRESULT currentItem( [out, retval] IWMPMedia **ppIWMPMedia); [ id( DISPID_WMPCONTROLS_CURRENTITEM ), propput ] HRESULT currentItem( [in] IWMPMedia *pIWMPMedia ); [ id( DISPID_WMPCONTROLS_CURRENTMARKER ), propget ] HRESULT currentMarker( [out, retval] long *plMarker); [ id( DISPID_WMPCONTROLS_CURRENTMARKER ), propput ] HRESULT currentMarker( [in] long lMarker); [ id( DISPID_WMPCONTROLS_PLAYITEM )] HRESULT playItem( [in] IWMPMedia *pIWMPMedia ); }
該接口 (IWMPCdrom) 可在 .NET Compact Framework 代碼中定義,如以下示例代碼所示。
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] [Guid("74C09E02-F828-11D2-A74B-00A0C905F36E")] public interface IWMPControls { [DispId(60)] IWMPMedia currentItem { get; set; } [DispId(61)] int currentMarker { get; set; } [DispId(56)] double currentPosition { get; set; } [DispId(57)] string currentPositionString { get; } [DispId(54)] void fastForward(); [DispId(55)] void fastReverse(); [DispId(62)] bool get_isAvailable(string bstrItem); [DispId(58)] void next(); [DispId(53)] void pause(); [DispId(51)] void play(); [DispId(63)] void playItem(IWMPMedia pIWMPMedia); [DispId(59)] void previous(); [DispId(52)] void stop(); }
前面提到過,這不是您想使用的方法,除非您不得不使用它。您必須顯式定義接口的一種情況是:使用 TLBIMP 工具的自動導入產生了不希望的結果,或者出于某種原因您不能使用接口的平臺調用定義。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn