1打开VC6集成开发环境,按新建按钮,选择PROJECT标签。2选择ATLCOMAppWizard。3在右侧ProjectName下面的空白处输入"Polygon"。如下图所示:图1按下OK按钮,出现如下对话框:图2按Finish按钮,接受默认设置,出现如下对话框:图3按下OK按钮,ATLCOMAppWizard将生成一系列的文件,现在描述如下:Polygon.cpp:包含了DllMain,DllCanUnloadNow,DllGetClassObject,DllRegisterServer,DllUnregisterServer的实现,同时它也包含objectmap:BEGIN_OBJECT_MAPObjectMap//这里将列出你的工程中将会用到的ATL对象,这里最初为空,//因为我们目前还没有创建新的ATL对象END_OBJECT_MAPPolygon.defDLL便准模块定义文件Polygon.dsw项目工作区文档Polygon.dsp项目设置文档Polygon.idl接口定义语言文件,它详细的描述了您的工程中所有的接口Polygon.rc资源文件,它包含了版本信息和工程名称字符串Resource.h资源文件的头文件Polygonps.mk这个就是makefile,它能被用来创建代理存根DLLPolygonps.def代理存根DLL的模块定义文件StdAfx.cpp此文件包含ATL的执行档StdAfx.h此文件包含ATL的头文件为了使它PolygonDLL变得有用,我们需要用ATLObjectWizard给它添加一个控件control。二添加一个控件1打开INSERT菜单,选择NewATLObject项,出现如下对话框:图42我们在左边选择"Controls",右边选择FullControl,按下NEXT按钮,出现如下所示对话框:图53我们在Names标签页,"ShortName"后面的空白中输入"PolyCtl",这时你将注意到其他的空白将会自动完成。Class域显示控件将会使用的类名称。CoClass是控件的组件类IDInterface是接口名称,我们将会在此接口中实现一些方法和属性Type是控件描述ProgID是易记的类ID名称,用它可以得到控件的CLSID4为了激活错误提示信息和connectionpoints支持,我们选择Attributes标签页,选择SupportISupportErrorInfo和SupportConnectionPoints,结果如下图所示:图65由于我们将会在多变形内部染色,所以我们需要增加一个FillColor属性支持。我们选择stockproperty标签页,在左边的列表框中双击FillColor,结果如下图所示:图76按下“确定”按钮,结束创建控件。VC6将会生成如下新的文件:PolyCtl.h/cpp:包含了C++类CPolyCtl的实现PolyCtl.rgs:一个包含了注册控件所需要的注册信息的文本文件PolyCtl.htm:一个HTML文件,其中有关于这个控件的引用的代码。例如在我这个例子中有:同时Wizard也改变了以下几处:a在StdAfx.h和StdAfx.cpp文件中增加了一条include语句,它把控件必需的ATL文件包含进来了b注册脚本文件PolyCtl.rgs被增加到工程资源中。cPolygon.idl被修改以便包括新的控件细节信息。文件PolyCtl.h是最有趣的,因为它包含实现你的控件主要的代码。现在,你已经准备好了建立你的控件:1.在Build菜单点击BuildPolygon.dll。2.一旦你的控件已经完成Build,你就可以点击在Tools菜单上的ActiveXControlTestContainer,控件测试容器工具将启动。3.在ActiveXControlTestContainer中,选择Edit菜单的InsertNewControl,InsertControl会话框出现。如下所示:图84.从InsertControl会话框的列表框中选择PolyCtlclass,按下OK,你将看到ActiveXControlTestContainer客户区出现一个长方形,在其中央显示了本文"ATL3.0:PolyCtl",如下所示:图95.关闭ActiveXControlTestContainer。然后,你将会在控件中加入定制属性。三为控件添加一个属性1IPolyCtl是包含你定制的方法和属性的接口。要把属性加入这一个接口的最容易的方法是在ClassView中右击它,而且选择AddProperty。如下所示:图102AddPropertytoInterface会话框出现,允许你加入你的属性细节:1.在属性类型的下拉列表框中选择short。2.输入"Sides"作为我们的属性名称。当你编辑属性名字域的时候,Implementation下面的编辑框将会出现一些信息,这些信息将被增加到你的IDL文件。如下所示:图113.按下OK按钮。MIDL编译idl文件的程序定义了一个Get和一个Put方法,他们将分别取得和设定属性。当MIDL编译文件的时候,它对属性名字加前缀put_和get_,在接口中自动地定义那二个方法。连同把必需的信息加入.idl文件,AddPropertytoInterface对话框也在类定义文件PolyCtl.h中加入Get和Put函数原型,并在类实现文件PolyCtl.cpp中加入相应的空的实现函数。3为了能设定并且取回属性值,我们需要一个地方来储存它。从FileView,打开PolyCtl.h,在类定义结尾即在m_clrFillColor定义之后加入如下一行代码:shortm_nSides;4现在你能实现Get和Put方法。get_Sides和put_Sides函数定义已经被增加到PolyCtl.h。你把代码加入PolyCtl.cpp如下列各项:STDMETHODIMPCPolyCtl::get_Sidesshort*pVal{*pVal=m_nSides;returnS_OK;}STDMETHODIMPCPolyCtl::put_SidesshortnewVal{ifnewVal>2&&newVal#include"resource.h"//mainsymbols在Releasebuilds时需要注意:当ATLCOMAppWizard产生内定工程的时候,它定义了_ATL_MIN_CRT宏。这个宏的作用是,在你不需要CRun-TimeLibrary支持的时候,CRun-TimeLibrary不被带到你的代码之内。多角形控件需要CRun-TimeLibrarystart-upcode设定浮点函数初值。因此,如果你建立一个释放版本,你需要除去_ATL_MIN_CRT宏。为了要除去该宏,点击Project菜单上的Settings。在SettingsFor:下拉框中选择MultipleConfigurations。在跳出来的Selectprojectconfigurationstomodify对话框中,为所有的四个释放版本按复选框,如图所示:图12然后点击OK。在C/C++标签页,选择General,除去Preprocessordefinitions定义结尾的",_ATL_MIN_CRT"图132一旦多边形顶点计算出来了,你就可以通过增加一个POINT类型的数组来保存所有的点,在PolyCtl.h中:OLE_COLORm_clrFillColor;shortm_nSides;POINTm_arrPoint,riidreturnS_OK。
黄石华2019-12-21 18:55:06