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)