※ 1 ※
Visual C++的ActiveX 控件 内容提要:本文详细介绍了ActiveX 控件的基本概念和ActiveX 控件的创建方法,同时介绍了
ActiveX 控件的属性、方法和事件的添加和使用方法。通过本文的学习,读者应了解ActiveX 控件的原理;能够用Visual C++创建ActiveX 控件;会使用ActiveX 控件;会向ActiveX 控件添加属性、方法和事件。
关键字:ActiveX 控件、OLE 、ActiveX 自动化 引言:ActiveX 是Microsoft 公司的一项注册技术,它使用COM 实现Windows 程序之间的通信。ActiveX 封装包括了OLE 、Internet 和多媒体在内的各种技术,是Internet/Intranet 的一个开放式平台。ActiveX 控件是OLE 控件的升级版,大大简化了用户的操作,用户可以像使用Windows 标准控件那样使用它。ActiveX 控件可以插入到Web 页或者ActiveX 包容器中。
正文:
1 ActiveX 控件介绍
ActiveX 控件是为Windows 编写的可重复使用的定制控件,它是作为进程中的服务器而实现的。
本节将介绍ActiveX 控件的相关知识。
1.1 ActiveX 控件的相关技术
与ActiveX 控件相关的技术有OLE 、容器与服务器、ActiveX 自动化等,下面分别加以介绍。 1. OLE 介绍 OLE (Object Linking and Embedding ,对象的嵌入与链接)是以COM 为基础的。COM (Component Object Model ,组件对象模型)是OLE 的基础。COM 是一种能够使软部件作为对象进行相互作用的二进制标准。COM 不是一种编程语言,但可以为支持COM 对象二进制形式的语言一起工作。可以认为,COM 提供了二进制对象的规范。
OLE 使应用程序能够通过数据链接或嵌入的方式共享数据。当数据集合被链接到文档中,文档将与此数据集合作为文档的一部分,并保持其与文档的链接。数据集合仍然作为一个分离对象保存在自己的文件内,可以使用指针用其编辑程序单独打开。修改对象后,文档也发生相应的变化。如果数据被嵌入文档,文档将不保留与最初含有此数据集合的文件的链接关系。也就是文档不会随数据集合的原文件的修改而修改。无论是链接还是嵌入,都提供在文档中打开相应应用程序处理其中特定数据集合的能力。
2. 容器与服务器
嵌入和链接的实现都需要容器和服务器(Container and Server )的支持。含有链接或嵌入数据的应用程序称为容器应用程序,而为这些数据提供编辑功能的应用程序称为服务程序。
其中,服务器分为三种类型:小型服务器、全服务器和自动化服务器。小型服务器是指不能独立运行,只能使用其包含到容器的服务器。全服务器是指可作为独立的应用程序运行,又可由容器启动的服务器。自动化服务器是为自动化提供服务的程序。
3. ActiveX 自动化
OLE 自动化(ActiveX Automation )允许通过使用高级的宏语言或脚本语言(如JavaScript )在一个应用程序的内部操作另一个应用程序的属性和方法。用于驱动的应用程序称为自动化客户(Automation Client ),而被驱动的应用程序称为自动化服务器(Automation Server )或自动化部件。自动化客户是指使用OLE 自动化提供服务的控制程序,它通过IDispatch 接口工作。
自动化部件是一项由一个应用程序提供,而被另一个应用程序使用的服务,它是用对象描述语言定义的。
对象描述语言所生成的文件扩展名为ODL ,ODL 文件经编译后存储到类型库(Type Library )
o k .n e t w w w .c n b o o
k .c n b o o k .n e t w w w .c n b o o k .n e t w w w .c n b o o k .n e t w w w .c n b o o k .n e t w w w .c n b o o k .n e t w w w .c n b o o k .n e t w w w .c n b o o k .n e t w w w .c n b o o k o o
k .n e t w w w .c
※ 2 ※
中,类型库是以TLB 为扩展名的二进制文件。可以使用Visual C++中的OLE/COM Object Viewer 实用程序来读取类型库,并以图形形式来浏览自动化部件的信息,如常量、接口、方法和属性等(图1)。
图1 OLE/COM Object Viewer 实用程序
1.2 ActiveX 控件的接口
ActiveX 控件是OLE 控件在Internet 上的扩展。一个ActiveX 控件必须支持IUnknown 接口,而且必须要注册,它是一个一般的COM 对象。
ActiveX 控件(ActiveX Controls )是运行中的小型自动化服务器,可以放入对话框、网页或者任何容器应用程序。微软已经使用ActiveX 控件取代了OLE 控件。
ActiveX 控件由两部分组成:控件本身,作为已经编译的库函数(实际是一个扩充的DLL );应用程序的OLE 载体,提供了嵌入式ActiveX 控件之间的接口。ActiveX 提供了三种接口类型:
(1)属性(Property ):ActiveX 控件内用于定义颜、大小、范围和状态标志符等的数值。属性可以是库存属性(Stock )或者自定义属性(Custom )。
(2)方法(Method ):ActiveX 控件内供容器程序外部调用的函数。ActiveX 控件的方法包括库存方法和自定义方法。
(3)事件(Event ):ActiveX 控件对诸如鼠标消息和键盘输入等消息的反映。ActiveX 控件把这些消息翻译成事件通知容器程序来产生相应的动作。ActiveX 控件的事件包括库存事件和自定义事件。
2 ActiveX 控件的使用
本节用实例介绍ActiveX 控件的使用,包括ActiveX 控件属性的添加和修改、ActiveX 控件方法
的添加和ActiveX 事件的添加。
首先,利用ActiveX ControlWizard 生成一个控件。然后为该控件添加标识控件内图形填充图案的用户自定义属性和控件背景标准属性。接着定制属性控制对话框来控制这两个属性。最后为控件添加方法和事件。
o
k .
n e t
w
w w .c n b o o
k .c
n
b o o k .
n e t
w
w w .
c n b o o k .n
e t w
w w .c n
b o o k .
n e t
w
w w .c n b o o
k .n
e t w
w w .
c n b o o k .
n e t
w
w w .c n b o o
k .n
e t w
w w
.c n
b o o k .
n e t
w
w w .
c n b
o o k o o
k .
n e t
w
w w .
c
※ 3 ※
2.1 使用ActiveX ControlWizard 控件框架
使用ActiveX ControlWizard 控件框架的方法如下: (1)单击“文件”→“新建”,弹出“新建”对话框。切换到“工程”标签页,在对话框左侧选择MFC ActiveX ControlWizard 工程类型,在对话框右侧输入工程的名字,如ActiveXSample 。输入或者选择工程保存的位置。单击“确定”按钮新建一个ActiveX 工程,如图2所示。
图2 新建控件工程
(2)在弹出的MFC ActiveX ControlWizard -Step 1 of 2对话框中,可以选择项目包含多少个控件(最多99个);是否让项目文件中的控件有运行时的许可;是否产生上下文敏感的帮助文件(图3)。在本例中,采用默认选项,单击“下一个”按钮。
图3 MFC ActiveX ControlWizard -Step 1 of 2对话框
(3)在MFC ActiveX ControlWizard -Step 2 of 2对话框中,采用默认选项,如图4所示,单击“完成”按钮,向导将生成新项目代码。
图4 MFC ActiveX ControlWizard -Step 2 of 2对话框
MFC ActiveX ControlWizard 的第(2)个步骤决定了控件如何与包容器进行交互(图3),下面
对步骤(3)的各个选项进行解释。
① Activates when visible (可见时激活)。
o
控件的使用
k .
n e t
w
w w .c n b o o
k .
c n b
o o k .
n e t
w
w w .
c n b o o k .n
e t w
w w .c n
b o o k .
n e t
w
w w .c n b o o
k .n
e t w
w w .
c n b o o k .
n e t
w
w w .c n b o o
k .n
e t w
w w
.c n
b o o k .
n e t
w
w w .
c n b
o o k o o
k .
n e t
w
w w .
c
※ 4 ※
决定当控件可见时,包容器是否应自动激活它。对于ActiveX 控件,通常需要立即激活。尽管选中Activates when Visible 选项,但它仅仅作为包容器应用程序的线索,它可能忽略申请。
② Invisible at runtime (在运行时不可见)。
如果选中了该选项,ControlWizard 将不把OnDraw()函数添加到控件类中。可以为那些不需要与用户进行交互的控件使用该选项。
③ Available in “Insert Object” dialog (在插入对象对话框中可用)。
这与从Test Container 工具到Microsoft Offfice 应用程序的许多应用程序提供的Insert Object 对话框(或等价物)相关。若没有选中该选项,将通知包容器,它不应该在包容器的Insert Object 对话框中包括这个新的控件。
④ Has an “About” box (有一个About 框)。
ControlWizard 将为About 方法生成源程序代码,为常用About 框生成资源。 ⑤ Acts as a simple frame control (作为一个简单的框架控件)。
它为IsimpleFrame-Site 接口提供支持。该选项将设置控件,来充当框架,用来包围包容器窗口中其他ActiveX 控件,将控件分组,并允许它们一起移动。并不是所有的包容器都支持简单的框架。
另外,单击“Edit Names ”按钮可以对控件的名字进行修改,单击“Advanced ”按钮可以对创建ActiveX 控件的高级选项进行设置。
2.2 分析ActiveX ControlWizard 生成的代码
MFC ActiveX ControlWizard 为ActiveXSample 控件生成了三个类:CActiveXSampleApp 、
CActiveXSampleCtrl 和CActiveXSamplePropPage 。
1. CActiveXSampleApp 类
该类由COleControlModule 类派生。
在该类的头文件中,声明了几个作为标识的外部变量。 const GUID CDECL _tlid; const WORD _wVerMajor; const WORD _wVerMinor;
并且,在该类的实现文件中,对这些外部变量进行了赋值。
const GUID CDECL BASED_CODE _tlid ={ 0xbe7ae7e5, 0xe87b, 0x4de4, { 0xac, 0x77, 0xb9, 0xa9, 0x64, 0xce, 0x50, 0xad } }; const WORD _wVerMajor = 1; const WORD _wVerMinor = 0;
其中,_tlid 是一个用于标识用户控件的全局的独特ID ,_wVerMajor 和_wVerMinor 则提供了版本的一些信息。
2. CActiveXSampleCtrl 类
CActiveXSampleCtrl 类是从COleControl 类派生的。
CActiveXSampleCtrl 类是控件类,值得注意的是该类的映射和OnDraw()函数。 CActiveXSampleCtrl 类的映射一共有三种,分别是消息映射(Message Map )、分发映射(Dispatch Map )和事件映射(Event Map )。一般情况下不提倡用户自己修改映射的入口,ClassWizard 会处理映射。
OnDraw()函数的程序代码如1所示。 【程序代码1】
void CActiveXSampleCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) { // TODO: Replace the following code with your own drawing code. pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
o
k .
n e t
w
w w .c n b o o
k .c
n
b o o k .
n e t
w
w w .
c n b o o k .n
e t w
w w .c n
b o o k .
n e t
w
w w .c n b o o
k .n
e t w
w w .
c n b o o k .
n e t
w
w w .c n b o o
k .n
e t w
w w
.
c n
b o o k .
n e t
w
w w .
c n b
o o k o o
k .
n e t
w
w w .
c
※ 5 ※
pdc->Ellipse(rcBounds); }
传给OnDraw()函数的参数有3个。pdc 是指向设备环境对象的指针,rcBounds 指定了控件边框矩形,rcInvalid 则指定了控件无效需要重绘的区域。
在ControlWizard 生成的默认代码中,使用系统定义的白画刷填充了整个控件区域,并沿着边框矩形画了一个椭圆。
3. CActiveXSamplePropPage 类
CActiveXSamplePropPage 类是从COlePropertyPage 类派生的。
CActiveXSamplePropPage 类是属性页类,与对话框类相似。该类的构造函数用来对属性页的数据进行初始化,而DoDataExchange()函数负责数据的交换,也就是属性的更新工作。这两个函数的代码都由ClassWizard 管理,用户无需管理。
2.3 添加属性
属性是控件的特征,ActiveX 控件将其暴露给容器作为控制控件的参数。ActiveX 控件的属性有
两种:
(1)库存属性(Stock ):是每个控件都必须支持的,如背景颜的实现由MFC 在ActiveX 控件运行中用DLL 提供,可被自定义属性覆盖。
(2)自定义属性(Custom ):由控件开发人员定制的属性,管理ActiveX 控件的内部性能。 本例主要介绍添加标准属性和用户自定义属性。 1. 添加用户定制属性
本例要添加的用户自定义属性是图形的填充图案属性brush ,它确定图形内部的填充图案。 添加brush 属性的步骤如下:
(1)单击“查看”→“建立类向导”打开MFC ClassWizard 对话框,切换到Automation 选项卡。选中要添加属性的类名为CActiveXSampleCtrl 类,单击Add Property 按钮,如图5所示。
(2)在弹出的Add Property 对话框中,输入External name 为brush ,这是控件属性的外部名称。选择Type 为short ,选择行为为Member variable ,如图6所示。
图5 MFC ClassWizard 对话框 图6 添加brush 属性
其中,Variable name 为对应的变量的名称,这里使用默认值。Notification 框中是用来处理属性
发生变化时的函数,也使用默认生成的函数名。Implementation 用来选择更改属性的方法,Stock 是标准属性,由标准的方法来处理;Member variable 用成员变量的方法来处理,可以直接更改属性的取值;Get/Set methods 不能直接改变属性的取值,必须提供专门的函数来实现。
(3)初始化属性的成员变量m_brush, 如程序代码2所示。 【程序代码2】
CActiveXSampleCtrl::CActiveXSampleCtrl() {
InitializeIIDs(&IID_DActiveXSample, &IID_DActiveXSampleEvents);
o
k .
n e t
w
w w .c n b o o
k .c
n
b o o k .
n e t
w
w w .
c n b o o k .n
e t w
w w .c n
b o o k .
n e t
w
w w .c n b o o
k .n
e t w
w w .
c n b o o k .
n e t
w
w w .c n b o o
k .n
e t w
w w
.c n
b o o k .
n e t
w
w w .
c n b
o o k o o
k .
n e t
w
w w .
c
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论