學習ATL編程:源於MSDN

 

PART I

工程樣例:  Polygon

 

一、  AppWizard 創建項目工程。文件說明:

a)         StdAfx.h cpp.    //包含有特殊的頭文件,並有全局變量_Moduleextern申明, extern CcomModule _Module

b)        Polygonps.def        //爲代理、存根DLL定義的模塊文件

c)        Polygonps.mk        //創建代理、存根DLLmake文件

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中,選中所有ReleaseOK。然後在“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”選擇PolyCtrlEventsOKWizard 爲連接點生成代理類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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章