PART I
工程樣例: Polygon
一、 AppWizard 創建項目工程。文件說明:
a) StdAfx.h, cpp. //包含有特殊的頭文件,並有全局變量_Module的extern申明, extern CcomModule _Module
b) Polygonps.def //爲代理、存根DLL定義的模塊文件
c) Polygonps.mk //創建代理、存根DLL的make文件
d) Resource.h,.rc //資源文件及頭
e) Polygon.idl //接口定義文件
f) Polygon.dsw,.dsp //項目文件
g) Polygon.def //標準windows DLL模塊定義文件
h) Polygon.cpp //源,包含有DllMain, DllCanUnloadNow, DllGetClassObject, DllRegisterServer 和 DllUnregisterServer, 以及ATL對象列表MAP。
二、 添加控件。也就是添加接口。
a) 在工作區右鍵,選擇“新建ATL對象”(或使用菜單)
b) 在“目錄”中選擇“控件”,“對象”中選擇“完全控制”
c) 在嚮導Names屬性頁中:鍵入“short name”
d) Attributes:選擇 “Support ISupportErrorInfo”,“Support Connection Points”支持錯誤提示和連接點用於事件響應。Wizard添加IPolyCtlEvents接口。
e) “Stock Properties”選擇庫存屬性“Fill Color”
f) wizard自動添加了.H,CPP,類定義文件,rgs是註冊腳本文件,html是試驗網頁,顯示瞭如何把控件添加到網頁。
g) 可以用Activex control test container 來測試一下。
三、 添加控件屬性。
a) 在工作區選擇要添加屬性的接口,右鍵選擇“添加屬性”,在界面中,輸入參數類型(property type),屬性名(property name)。
b) “Function type”會讓你選擇Get / Put 屬性,默認情況都被選擇。
c) 在“Implementation”產生預覽。
d) 這時,查看接口類定義文件,Wizard爲我們添加了Get / Put 方法。
e) 我們可能需要添加類的成員變量來標識這個屬性。當然,初始化,以及在Get / Put 方法中如何響應,是我們要編寫的。
f) Put 方法也應該響應錯誤輸入時的提示信息,可以如下:
return Error(_T("Shape must have between 3 and 100 sides"));
因爲返回值類型是STDMETHODIMP
四、 控件輸出。
a) 因爲我們的工程是控件,所以一般有窗口。Wizard已經接口類中添加了OnDraw函數,我們可以編寫相應的輸出。
b) 如果要用CRT庫,需設置工程,在“setting for”中選擇“Multiple Configurations”,在彈出的Dialog中,選中所有Release,OK。然後在“C/C++”選項卡中,把“預處理程序定義”內的“_ATL_MIN_CRT”移除。
c) 改變屬性後刷新:FireViewChange();
d) 對OLE_COLOR轉換爲COLORREF:
OleTranslateColor(m_clrFillColor, NULL, &colFore);
五、 事件響應。鍵盤,鼠標,窗口消息等。
a) 右鍵工作區IpolyCtlEvents接口添加方法(Method)
b) 編譯.idl文件,產生.tlb類型庫文件,
c) 使用連接點IconnectionPoint:右鍵工作區接口類,選擇“Implement Connection Point….”,從“Interfaces”選擇PolyCtrlEvents,OK。Wizard 爲連接點生成代理類CProxy_IpolyCtlEvents 及相應的方法。
d) 對接口類添加消息響應事件:WM_LBUTTONDOWN,光標位置取得:
X=LOWORD(LPARAM), Y=HIWORD(LPARAM)
e) 調用代理函數
六、 添加屬性頁。(與添加控件類似)
a) 用ATL wizard,添加:“controls”->“property page”->填寫類名,修改屬性頁窗口名。OK.
b) 編輯對話框
c) 修改Apply函數
n 使用智能指針CComQIPtr
CComQIPtr<IPolyCtl, &IID_IPolyCtl> pPoly(m_ppUnk[i]);
n 失敗時顯示消息:GetErrorInfo, GetDiscription: CcomPtr, CComBSTR智能管理內存
n 設置屬性頁bDirty=FALSE
d) 給屬性頁添加消息響應函數.
e) 給接口類添加屬性映射
七、 放到網頁。
a) 在html文件的BODY內添加:
<OBJECT ID="PolyCtl" <
CLASSID="CLSID:4CBBC676-507F-11D0-B98B-000000000000">
></OBJECT>
b) 添加SCRIPT
c) 避免安全警告:把IobjectSafetyImpl添加到接口類的繼承列表和COM MAP中,分別是:
public IObjectSafetyImpl<CPolyCtl, INTERFACESAFE_FOR_UNTRUSTED_CALLER>
和 COM_INTERFACE_ENTRY(IObjectSafety)