MFC开发ActiveX控件全过程.docx

上传人:b****5 文档编号:8230726 上传时间:2023-01-30 格式:DOCX 页数:13 大小:57.26KB
下载 相关 举报
MFC开发ActiveX控件全过程.docx_第1页
第1页 / 共13页
MFC开发ActiveX控件全过程.docx_第2页
第2页 / 共13页
MFC开发ActiveX控件全过程.docx_第3页
第3页 / 共13页
MFC开发ActiveX控件全过程.docx_第4页
第4页 / 共13页
MFC开发ActiveX控件全过程.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

MFC开发ActiveX控件全过程.docx

《MFC开发ActiveX控件全过程.docx》由会员分享,可在线阅读,更多相关《MFC开发ActiveX控件全过程.docx(13页珍藏版)》请在冰豆网上搜索。

MFC开发ActiveX控件全过程.docx

MFC开发ActiveX控件全过程

使用MFC开发ActiveX控件全过程

VisualC++是开发ActiveX控件的强大工具,它的特点是开发周期短、便于使用,因此它已经成为开发ActiveX控件的主要工具之一。

VisualC++集成开发环境,使用了微软自己的类库MFC,MFC对开发ActiveX控件提供了全面的支持,本文讲述的过程均在VisualC++6.0(以下简称VC)中实现。

1、 创建工程:

对于使用过VC的人,可以很容易地创建一个开发ActiveX控件的工程,没有使用过VC的人,按

照下面的操作步骤,也可以很快创建一个同样的工程出来。

第一步:

“File”—>“New”—>“(Projects)MFCActiveXControlWizard”,在“ProjectName”中输入合适的工程名(以test为例),在“Location”中选择工程文件存放路径,然后,“OK”进入下一步;

第二步:

选择你想在这个工程中生成的ActiveX控件的个数(至少一个),其余选项决定是否生成一些辅助文件,通常按照默认设置即可,“Next”进入下一步;

第三步:

编辑你的工程中各个类和文件的名称,配置一些辅助选项,可以全部选择默认设置,“Finish”进入下一步;

第四步:

展示向导为你的工程生成的各种配置信息,“Cancel”重新设置不满意的选项,“OK”结束工程的创建。

2、 绘制控件:

MFC将对ActiveX控件的支持封装在COleControl类中,所有ActiveX控件均从这个类

派生。

绘制控件的全部操作则集中在一个虚函数中—OnDraw(),其默认实现如下:

voidCTestCtrl:

:

OnDraw(CDC*pdc,constCRect&rcBounds,constCRect&rcInvalid)

{

//TODO:

Replacethefollowingcodewithyourowndrawingcode.

pdc->FillRect(rcBounds,

CBrush:

:

FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));

pdc->Ellipse(rcBounds);

}

可以看到,OnDraw()函数的默认实现是在矩形rcBounds中绘制一个椭圆,通过改写OnDraw()函数中的内容,就可以绘制自己想要的控件了。

需要注意的一点,控件的绘制被限制在矩形rcBounds中,绘制范围不能超出这个矩形。

3、 添加属性:

ActiveX控件提供了三种类型的属性供用户选择:

公共属性、具有通知特性的属性和Get/Set

类型的属性。

下面依次对三种类型属性的添加、初始化、新属性值的获取和属性的永久保存,分别进行介绍。

三种类型的属性的添加,都遵照相同的步骤:

“View”—>“ClassWizard”—>“(Automation)AddProperty”—>“AddProperty”对话框。

注意,“ClassName”中应是你想添加属性的控件类的名称(如CTestCtrl)。

㈠.公共属性:

COleControl类提供了九种常用的属性作为公共属性,我们以“Caption”为例。

在“AddProperty”对话框中的“ExternalName”选择“Caption”,“Implementation”中选中“Stock”,然后“OK”即向控件添加了Caption公共属性。

COleControl类为每一个公共属性都提供了默认的设置和获取成员函数,对于Caption属性有SetText()和GetText()(或InternalGetText())。

COleControl类在函数DoPropExchange()中对于公共属性都有默认的初始化,但是我们可以在成员函数OnResetState()中,为公共属性设置我们自己想要的初始值。

Caption默认的初始值为空,可以使用成员函数SetText(LPCTSTRpszText),为其设置任意的字符串。

我们可以通过调用函数GetText()或InternalGetText()获得当前的Caption属性值。

需要注意的是,对于GetText()函数,在调用之后,需要调用SysFreeString()函数以释放资源。

此外,GetText()函数的返回值为BSTR类型,经常需要与大家常用的CString字符串类型进行变换:

BSTR可以直接赋值CString,也可以调用API函数:

:

SysAllocString(Cstring);但是将CString转换成BSTR,必须调用函数CString:

:

AllocSysString()。

InternalGetText()函数则无上述烦恼。

对于公共属性的永久保存,在COleControl类的成员函数DoPropExchange()有默认实现,就无需大家费心了。

㈡.具有通知特性的属性:

在“AddProperty”对话框的“Implementation”中选中“Membervariable”,即选择了向控

件添加具有通知特性的属性。

在“ExternalName”中输入属性的名字(Shape),在“Type”中选择变量类型(BOOL),“VariableName”和“Notificationfunction”中会自动生成默认的变量名(m_shape)和通知函数名(OnShapeChanged),当然也可以手工输入自己习惯的名字。

最后,“OK”便向控件添加了一个具有通知特性的属性。

对于属性的初始化和永久保存,只要在DoPropExchange()函数中调用PX_函数即可。

按照上面添加的属性例子,可以如是调用:

PX_Bool(pPX,_T("Shape"),m_bShape,FALSE)。

其中,“FALSE”为变量“m_bShape”即属性“Shape”的初始值。

至此,不得不先说一下控件的属性对话框了。

MFC将控件的属性对话框封装在类COlePropertyPage中,所有控件的属性对话框都派生自这个类。

控件的属性对话框,是控件开发者提供给控件用户、用于定制控件外观的通讯工具,控件用户可以通过它来修改控件的某些属性。

COlePropertyPage类中最重要的成员当属DoDataExchange()函数了,控件开发者就是通过在其中调用DDP_函数把控件的属性与控件属性对话框中的各种控件联系起来的。

对于控件的公共属性,在为属性对话框中的相应控件添加变量的时候,可以在“Optionalpropertyname”中选择相应的公共属性,则属性对话框类就会在DoDataExchange()函数种自动添加相应的DDP_函数,例如,对于Caption属性,就会自动添加这样的语句:

DDP_Text(pDX,IDC_CAPTION_EDIT,m_strCaption,_T("Caption"));但是对于用户添加的自定义属性,则必须手工输入DDP_函数,例如,对于前面添加的“Shape”属性,应添加如下语句:

DDP_Check(pDX,IDC_SHAPE_CHECK,m_bShape,_T("Shape"))

对于“Notificationfunction”需要补充说明的是,虽然在相应的函数中,属性添加向导会自动添加函数SetModifiedFlag(),但是如果需要在属性被改变时,相应改变控件的显示,则需开发人员手工加入函数InvalidateControl()(它会激发OnDraw()函数的调用)。

㈢.Get/Set类型的属性:

在“AddProperty”对话框的“Implementation”中选中“Get/Setmothods”,即选择了向控

件添加“Get/Set类型的属性”。

在“ExternalName”中输入属性的名字(Color),在“Type”中选择变量类型(OLE_COLOR),“Getfunction”和“Setfunction”中会自动生成默认的函数名“GetColor”和“SetColor”,当然也可以手工输入自己习惯的函数名。

最后“OK”,便完成了向控件添加Get/Set类型的属性。

对于属性的初始化和永久保存,和上面“具有通知特性的属性”一样,只要在DoPropExchange()函数中调用相应的PX_函数即可,不过在此之前,需要声明一个与属性类型相同的变量(m_clrInside),用于保存属性的值。

(PX_函数:

PX_Color(pPX,_T("Color"),m_clrInside,RGB(255,255,255)),其中“RGB(255,255,255)”为变量“m_clrInside”即属性“Color”的初始值)。

现在,需要说明一下公共属性页的问题了:

在ActiveX默认的属性页中,没有字体和颜色属性页,但我们可以通过在属性页的ID表中添加入口的方法添加这两个属性页。

加入颜色属性页的代码如下:

BEGIN_PROPPAGEIDS(CTest1Ctrl,2)

PROPPAGEID(CTest1PropPage:

:

guid)

PROPPAGEID(CLSID_CColorPropPage)

END_PROPPAGEIDS(CTest1Ctrl)

其中,以粗体显示的代码,由开发人员加入,同时ID数目增加1,由原来的1变为2。

Get/Set类型的属性,属性值的获取和设置分别由相应的Get/Set函数处理。

Get函数中返回当前的属性值(returnm_clrInside);Set函数中设置新的属性值(m_clrInside=nNewValue),同样,如果需要在属性被改变时,改变控件的显示,需开发人员手工加入函数InvalidateControl()。

4、 添加事件:

事件是AcTiveX控件通知ActiveX控件容器的手段,一般事件是由一些交互操作激发的,如鼠

标操作、键盘操作等。

ActiveX控件支持公共事件和自定义事件,两者添加方法相似,只是公共事件由COleControl类自动处理。

使用VC自带的ClassWizard添加事件:

“View”—>“ClassWizard”—>“(ActiveXEvents)AddEvent...”,出现“AddEvent”对话框。

如果是添加公共事件,只要在“ExternalName”下拉列表中选择想要添加的事件,“OK”即可;添加自定义事件,则在“ExternalName”中输入自定义事件的名称(ClickIn),“InternalName”中会自动生成事件激发函数的名称(FireClickIn),也可以输入自己习惯的名字,然后在“Parameterlist”中输入需要的参数名称(Hit)和参数类型(BOOL),最后“OK”就完成了自定义事件的添加。

对于公共事件,COleControl类会自动激发,例如:

当鼠标中的任意一个键在单击控件时,Click事件就会自动被激发,向控件容器发送通知;对于自定义事件,必须由开发人员在需要激发事件的时候,调用相应的成员函数,来激发事件,以上面的“ClickIn”自定义事件为例,在需要激发事件的地方,需要开发人员调用相应的事件激发函数“FireClickIn”来激发“ClickIn”事件。

附带一提,事件携带的参数是控件容器判断事件类型的依据,例如上面的“Hit”参数,其值为“TRUE”或“FALSE”,就可以代表两种不同的情形。

5、 测试控件:

完成了控件的编码工作,接下来就需要对控件进行相关的测试了。

测试控件,就需要一个控件

容器来装载控件,如果只是为了测试控件,而专门开发一个控件容器,根本就是本末倒置、得不偿失,开发一个ActiveX控件容器的工作量,是绝对不容小觑的!

幸运的是,VC为我们提供了一个方便的ActiveX控件测试工具—“ActiveXControlTestContainer”(以下简称ACTC),这是VC为ActiveX控件开发人员,方便进行ActiveX控件的测试,而专门开发的一个ActiveX控件容器。

ACTC使用起来非常方面,可以通过两种方式打开它:

一、在VC的主界面中,“Tools”—>“ActiveXControlTestContainer”;二、“ExecuteProgram”时,在跳出的“ExecutableForDebugSession”对话框的“Executablefilename”中选择“ActiveXControlTestContainer”,然后“OK”即可。

ACTC打开之后,“Edit”—“InsertNewControl”或在窗口空白处单击右键,然后选择“InsertNewControl”,就会打开“InsertControl”对话框,最后在对话框左边的列表中找到自己的控件并选中,“OK”相应控件就会被添加到并显示在ACTC中。

测试控件的属性,可以“Edit”—>“Properties...”,就会打开控件的属性对话框;测试事件,事件的结果会在ACTC下面的窗口中显示。

MFCActiveX控件

ActiveX控件是基于组件对象模型(COM)的可重用软件组件,它支持广泛的OLE功能并可自定义以满足多种软件的需要。

ActiveX控件旨在用于普通的ActiveX控件容器和Internet上的万维网页。

您既可以用此处介绍的MFC也可以用活动模板库(ATL)来创建ActiveX控件。

ActiveX控件可以在自己的窗口中对自身进行描述,对事件(如单击鼠标)做出响应,并可以通过包括属性和方法的接口进行管理,这些属性和方法与自动化对象中的属性和方法相似。

可以为许多用途(如数据库访问、数据监视或图形绘制)开发这些控件。

除可移植性外,ActiveX控件还支持先前所不具备的功能,如与现有OLE容器的兼容性和将其菜单与OLE容器的菜单集成在一起的能力。

另外,ActiveX控件完全支持自动化,使控件得以公开读/写属性和一组可由控件用户调用的方法。

可以创建无窗口的ActiveX控件和只有在活动时才创建窗口的控件。

无窗口控件可加速应用程序的显示并可包含透明控件和非矩形控件。

也可以异步加载ActiveX控件的属性。

ActiveX控件作为进程内服务器(通常是一个小型对象)实现,而进程内服务器可用于任何OLE容器。

请注意,只有在识别ActiveX控件的OLE容器内使用时,ActiveX控件的全部功能才可用。

这种容器类型(以后称为“控件容器”)可以通过使用ActiveX控件的属性和方法来操作该控件,并可以从ActiveX控件接收事件形式的通知。

下图演示了此交互。

ActiveX控件容器与有窗口的ActiveX控件之间的交互

ActiveX控件的基本组件

ActiveX控件使用几个编程元素与控件容器和用户有效地进行交互。

这些元素是COleControl类、一组事件引发函数和调度映射。

您开发的每个ActiveX控件对象都从其MFC基类COleControl继承一组强大的功能。

这些功能包括就地激活和自动化逻辑。

COleControl可为控件对象提供与MFC窗口对象相同的功能,并提供引发事件的能力。

COleControl还可提供无窗口控件。

无窗口控件依赖其容器的帮助获得窗口提供的某些功能(鼠标捕获、键盘焦点、滚动),但显示速度快得多。

由于该控件类是从COleControl派生的,因此它继承了在满足某些条件时,向控件容器发送或“引发”消息(称为事件)的能力。

这些事件用于在控件中发生重要的事情时通知控件容器。

通过向事件附加参数,可将关于事件的其他信息发送到控件容器。

最后的元素是调度映射,它用于向控件用户公开一组函数(称为方法)和特性(称为属性)。

属性使控件容器或控件用户得以以各种方式操作控件。

用户可以更改控件的外观、更改控件的某些值或生成控件请求(如访问控件所维护的特定数据片段)。

该接口由控件开发人员确定并通过“类视图”定义。

有窗口的控件与ActiveX控件容器之间的交互

当在控件容器内使用控件时,该控件使用两种机制进行通信:

一种是公开属性和方法,一种是引发事件。

下图演示了这两种机制的实现方式。

ActiveX控件容器与ActiveX控件之间的通信

上图还阐释了控件如何处理除自动化和事件之外的其他OLE接口。

控件与容器进行的所有通信都由COleControl执行。

为处理容器的某些请求,COleControl调用在控件类中实现的成员函数。

所有方法和部分属性都是以此方式处理的。

控件类也可以通过调用COleControl的成员函数来初始化与容器的通信。

事件是以此方式引发的。

ActiveX控件的活动状态和非活动状态

控件有两种基本状态:

活动和非活动。

传统上,根据控件是否有窗口来区分这两种状态。

活动控件有窗口,而非活动控件没有窗口。

引入了无窗口激活后,这种区别不再通用,但仍适用于许多控件。

当无窗口控件处于活动状态时,它从其容器调用鼠标捕获、键盘焦点、滚动和其他窗口服务。

除了可以创建等待直到被激活以创建窗口的控件外,还可以为非活动控件提供鼠标交互。

当有窗口的控件处于活动状态时,它能够与控件容器、用户和Windows进行完全交互。

下图演示了ActiveX控件、控件容器和操作系统之间的通信路径。

有窗口的ActiveX控件(活动时)中的Windows消息处理

序列化

序列化数据的能力(有时称为持久性)使控件得以将其属性值写入持久性存储。

这样就可以通过从存储读取对象状态来重新创建控件。

请注意,控件并不负责获取对存储媒体的访问。

相反,控件的容器负责为控件提供存储媒体以便在适当的时候使用。

有关序列化的更多信息,请参见文章MFCActiveX控件:

序列化。

有关优化序列化的信息,请参见“ActiveX控件:

优化”中的优化持久性和初始化。

安装ActiveX控件类和工具

安装VisualC++时,如果在安装过程中选择了ActiveX控件(默认情况下选择它们),则将自动安装MFCActiveX控件类和发布及调试ActiveX控件运行时DLL。

默认情况下,ActiveX控件类和工具安装在\ProgramFiles\MicrosoftVisualStudio.NET下的下列子目录中:

∙\Common7\Tools

包含测试容器文件(TstCon32.exe及其帮助文件)。

∙\Vc7\atlmfc\include

包含使用MFC开发ActiveX控件所需的包含文件

∙\Vc7\atlmfc\src\mfc

包含MFC中特定ActiveX控件类的源代码

∙\Vc7\atlmfc\lib

包含使用MFC开发ActiveX控件所需的库

还有MFCActiveX控件的示例。

简单介绍VC2003使用ATL开发ActiveX控件

第一步:

创建ATL项目

  使用新建项目->VC++项目->ATL,选择ATL项目,输入项目名字,进入创建项目向导,选择好对应的属性(动态链接库),VC2003将自动生成一个框架,内含:

  项目代码(.c,.cpp),模块定义文件(.def),接口定义语言文件(.idl),注册脚本(.rgs),以及其他的资源文件等

第二步:

添加一个ATL对象(Class)

  在类视图中,在项目上点击右键,选择“添加->添加类”,在类选择框中,选择VC++->ATL中的“ATL控件”,出现ATL控件向导对话框,在向导的“名称”选项卡,“简称”(Shortname)中,填写你的ActiveX控件的名字,如PolyCtl,这个名字就是控件注册后使用的名字。

其他选项基本选择默认。

如果想使用,可以用鼠标悬停在相应项上查看简单说明。

  在“选项”里面,选择支持“连接点”,可以让生成的控件调用外部实现接口,即执行特定页面函数的实现。

  VC6中,需要手工选择支持IError等接口。

第三步:

设置控件的属性和实现

  例程的控件是实现绘出一个正多边形,多边形的边数可以调整。

并能够响应鼠标左键点击事件,点击事件将判断鼠标点击的位置,并根据情况调用两个外部实现函数。

  在类视图的IPolyCtl上点击右键,选择“添加->添加属性”,添加一个short类型的属性,名字为Sides,其他属性选默认,点击完成,向导将自动添加get_Sides和put_Sides的实现函数,这两个函数是外界取得ActiveX控件属性的时候被隐式调用的。

  为控件类添加一个成员变量shortm_nSides来存储多边形的边数。

在类构造函数中将其初始化为3。

  在get_Sides和put_Sides中分别实现存取:

STDMETHODIMPCPolyCtl:

:

get_Sides(short*pVal)

{

*pVal=m_nSides;

returnS_OK;

}

STDMETHODIMPCPolyCtl:

:

put_Sides(shortnewVal)

{

if(newVal>2&&newVal<101)

{

m_nSides=newVal;

FireViewChange();//立即更新窗口

returnS_OK;

}

else

returnError(_T("Shapemusthavebetween3and100sides"));

}

第四步:

实现绘图

  为了实现绘出多边形,这里用到了sin和cos函数,这两个函数包含在C头文件math.h中,所以需要添加引用#include

  由于使用Polygon函数进行绘图,需要在类中添加一个点数组POINTm_arrPoint[100];

  在类中添加一个函数,用来计算指定矩形区域中多边形每个顶点的位置:

voidCalcPoints(constRECT&rc);

voidCPolyCtl:

:

CalcPoints(constRECT&rc)

{

constdoublepi=3.14159265358979;

POINTptCenter;

doubledblRadiusx=(rc.right-rc.left)/2;

doubledblRadiusy&nb

sp;=(rc.bottom-rc.top)/2;

doubledblAngle=3*pi/2;//Startatthetop

doubledblDiff=2*pi/m_nSides;//Angleeachsidewillmake

ptCenter.x=(rc.left+rc.right)/2;

ptCenter.y=(rc.top+rc.bottom)/2;

//Calculatethepointsforeachside

for(inti=0;i

{

m_arrPoint[i].x=(long)(dbl

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1