实验八 ActiveX 控件的创建和使用.doc
实验八 ActiveX 控件的创建和使用一 实验目的1 掌握基于 MFC 创建 ActiveX 控件的过程2 掌握 ActiveX 控件的属性和事件的编程方法3 了解非标准形状控件的编程方法二 实验要求8.1 创建一个控件,在控件上显示一串字符,设置属性,可以对显示的字符进 行设置和修改;另一方面,设置两个事件,当鼠标移动时,将鼠标的位置告知, 当鼠标左键压下时,产生另一个事件,告知鼠标位置。编写测试程序,在对话窗口上使用编写的控件,可以输入在控件上待显示 的字符,当鼠标在控件上移动时,在对话框上显示其坐标。当鼠标左键压下时, 产生另一个事件,告知鼠标位置。8.2 创建一椭圆形控件(或其它形状),双击后弹出颜色设置对话窗口,选择 其中颜色,将控件颜色设置为选择的颜色。编写测试程序,在测试程序中测试 控件的功能。三 实验过程实验 1 步骤:(1)首先利用 MFC ActiveX ControlWizard 生成一个 ActiveX 控件程序的框架。在 VC+开发环境中,选择【FileNew】菜单项,在打开的对 话框上选择 Projects 选项卡,并在列表框中 MFC ActiveX ControlWizard,工 程命名为:Example1。然后单击【OK】进入向导的第一步,直接单击 【Finish】按钮保持所有默认设置不变。说明:其中 CExample1App 类是从 CWinApp 派生的,所以可以把该类看作是一个 应用程序类。CExample1Ctrl 类是从 CWnd 类派生的,对控件窗口进行的操作都 将在 CExample1Ctrl 类中完成。在 CExample1Ctrl 类的头文件中提供了消息映 射、调度映射和事件映射。调度映射是为了让外部应用程序可以方便地访问控 件的属性和方法,而事件映射让控件可以向包含它的容器发送事件通知。Example1PropPage 类派生于 CDialog 类,是用来显示 Example1 控件的属性 页的,该类和一个 ID 为 IDD_PROPPAGE_EXAMPLE1 的对话框资源相对应。在上述 介绍的三个类的上面还有两项内容:_DExample1 和_DExample1Events,它们都是接口。接口是控件与外部程序进行通信的协议。可以把接口看作是函数的集 合,外部程序通过这个接口所暴露出来的方法去访问控件的属性和方法。实际 上,可以把接口看作一个抽象基类,在此接口中定义的所有函数都是虚函数, 这些函数的实现在 CExample1Ctrl 类中完成的。所以通过接口调用的函数实际 上是调用 CExample1Ctrl 中的函数来实现的。(2)ActiveX 控件不能独立运行,它必须嵌入到一个容器中运行。编译并运行 刚刚创建的工程,可以看到如图所示的对话框:我们可以单击该对话框上标示了一个向右箭头的按钮,将弹出一个快捷菜单, 选择【ActiveX Control Test Container】菜单项,也就是选择 ActiveX Control Test Container 这个应用程序作为 Example1 控件的容器。然后单击 上图所示对话框的【OK】按钮关闭该对话框。这时将打开 ActiveX Control Test Container 这个应用程序,如下图所示:于是我们可以加载特定的 ActiveX 控件了,方法是选择【EditInsert New Control.】菜单项,这时将打开如下图所示的对话框:选中我们创建的 Example1 控件,单击对话框上的【OK】按钮关闭对话框,这时, 在 ActiveX Control Test Container 应用程序中就加载了 Example1 控件。这 时该控件的代码都是 MFC 自动生成的。(3)控件功能的实现。首先将 CExample1Ctrl 类中 OnDraw 函数中自动生成的 两行代码注释起来,它们分别用来填充控件的背景和绘制椭圆。然后为控件添 加自定义属性,选择 ClassWizard 对话框上的 Automation 选项卡,然后单击 【Add Property】按钮,将弹出属性对话框。在 External name 中填写属性名 称为“SetText”,类型选择为“CString”,变量名被自动的设置为 m_setText,而且 ClassWizard 为该控件增加了一个通知函数: OnSetTextChanged,当在外部修改属性时,这个函数将被调用。在添加属性对 话框上还有三个单选按钮,保持默认选择的 Member variable,当选择该选项后, ClassWizard 会为该属性生成一个成员变量和一个通知函数。在 CExample1Ctrl 类的构造函数中对 m_setText 进行初始化,加入代码:m_setText=“你好!“;在 通知函数 OnSetTextChanged 中加入代码如下:Invalidate();使窗口发生重绘 调用 OnDraw 函数,在 OnDraw 函数中加入代码如下:pdc- >TextOut(0,0,m_setText);(4)为控件增加标准事件。选择 ClassWizard 对话框上的 ActiveX Events 选 项卡,然后单击【Add Event】按钮,将显示添加事件对话框,在此对话框上有 一个名称为 External name 的组合框,当单击其右边向下的箭头时,将会看到 列出了一些预先准备好的事件。在 External name 下拉列表中选择 Click,保 持默认的 Stock 选项不变,然后单击【OK】按钮关闭 Add Event 对话框,同理 增加 MouseMove 事件,然后单击 ClassWizard 对话框上的【OK】按钮关闭该对 话框。这时,在 ClassView 选项卡中可以看到,在_DclockEvents 接口下面增 加了两个方法,就是刚刚添加的事件。(5)测试控件的属性和事件。利用 Build 命令生成控件,利用 ActiveX Control Test Container 来测试该控件。利用【EditInsert New Control.】菜单项插入该控件后,选中该控件,然后单击【ControlInvoke Methods.】菜单项,这时将显示如下所示的对话框:在此对话框中有一个方法名称(Method Name)下拉列表,在此列表中列出了当 前控件提供的方法,如下图所示:如果想要得到某个属性值,应该选择 PropGet 类型的方法;如果想要设置某个 属性的值,则应该选择 PropPut 类型的方法。因此应该选择 PropPut 类型的方 法,并在随后出现的对话框的 Parameter 编辑框中输入:ni hao,单击【Set Value】按钮,再单击【Invoke】按钮使得设置生效,观察运行结果。当把鼠标 放到控件上时,ActiveX Control Test Container 的位于下部的窗口将显示鼠 标的位置;当单击控件的时候,下部的窗口将显示控件被单击的消息。(6)生成一个发行版本的 ActiveX 控件。方法是在 VC+开发环境打开 Example1 工程,然后选择【BuildSet Active Configuration.】菜单项, 从弹出的对话框中选择“Example1-Win32 Release”,单击【OK】按钮,然后重 新利用 Build 命令生成控件。(7)编写一个 ActiveX 控件的测试程序。新建一个基于对话框的工程,命名为: Example1Test,并删除自动生成的对话框资源上的静态文本控件。在 VC+中插 入 ActiveX 控件的方法是,选择【ProjectAdd To ProjectComponents and Control.】菜单项,将显示如下图所示的对话框:在此对话框中双击“Registered ActiveX Controls”目录,并在此目录下找到 Example1 控件,然后单击【Insert】按钮,并单击随后显示的确认对话框上的 【确认】按钮,这时将弹出如下图所示的对话框:Comment 园园园园1: 应是对话框类Comment 园园园园2: 什么这时,会在工程中为该控件生成一个类,类名为 Example1。最后单击【OK】按 钮关闭该对话框,并单击【Close】按钮关闭插入组件和控件的对话框。这时, 在 ClassView 选项卡上,可以看到增加了一个类:Example1,该类提供了一些 函数,我们只需要调用这些函数就可以访问 Example1 这个控件的方法和属性了。 同时,在工具箱上也增加了 Example1 控件的图标,我们只需要单击该图标,并 在对话框资源上拖放在一块合适的区域就可以放置一个 Example1 控件了。(8)在程序中动态的产生一个 Example1 控件,首先为 CExample1TestDlg 类增 加一个成员变量,变量名为 m_example1,类型为 CExample1。然后在 CExample1TestDlg 类的 OnInitDialog 函数中加入代码如下: m_example1.Create(“example1“,WS_CHILD|WS_VISIBLE,CRect(0,0,100,50),th is,123);动态产生一个 Example1 控件,并在 Example1Test.h 文件中加入代码 如下:#include “example1.h“。然后先在对话框上放置一个静态文本控件, Caputions 设置为:“输入要显示的字符串:”。再放置一个编辑框控件,并 为编辑框控件关联一个 Cstring 类型的成员变量 m_str。再放置一个按钮控件, 将 Caputions 设置为:设置,ID 设置为 IDC_BUTTON,并为其添加单击消息 OnButton。最后放置一个 Example1 控件,调整位置如下图所示:在 OnButton 函数中添加代码如下:UpdateData(); m_example1.SetSetText(m_str);利用编辑框来改变动态产生的 Example1 控件 的显示文本。编译并运行程序,通过编辑框来输入要显示的字符串,单击设置 按钮来完成设置,观察 Example1 控件的显示文本。(9)在 VC 中访问静态增加的 Example1 控件的事件。在该控件上单击鼠标右键, 从弹出的快捷菜单上选择【ClassWizard.】,将弹出如下图所示的对话框:可以看到,通过 ClassWizard 可以为 Example1 控件增加 Click 事件和 MouseMove 事件。如果要增加某个事件,在此对话框中选中该事件,然后单击 【Add Function.】按钮即可。通过这种方法为 Example1 控件增加 Click 事 件和 MouseMove 事件。Click 事件的消息响应函数为 OnClickExample1ctrl2,MouseMove 事件的消息响应函数为 OnMouseMoveExample1ctrl2。(10)首先为 CExample1TestDlg 类增加一个类型为 CPoint 的公有成员变量 m_point,然后在 OnClickExample1ctrl2 函数中增加代码如下:CClientDC dc(this);CString str;str.Format(“x=%d,y=%d“,m_point.x,m_point.y);dc.TextOut(200,250,str);完成当鼠标单击控件时,显示鼠标的位置。鼠标的位置会在 OnMouseMoveExample1ctrl2 函数中添加,代码如下:CClientDC dc(this);m_point.x=x;m_point.y=y;CString str;str.Format(“x=%d,y=%d“,x,y);dc.TextOut(100,100,str);完成当鼠标在控件上移动时,显示鼠标的位置。编辑并运行程序,观察结果。实验 2 步骤:(1)首先利用 MFC ActiveX ControlWizard 生成一个 ActiveX 控件程序的框 架。在 VC+开发环境中,选择【FileNew】菜单项,在打开的对话框上选择 Projects 选项卡,并在列表框中 MFC ActiveX ControlWizard,工程命名为: Rectangle.然后单击【OK】进入向导的第一步,直接单击【Finish】按钮保持 所有默认设置不变。(2)控件功能的实现。首先将 CRectangleCtrl 类中 OnDraw 函数中自动生成的 两行代码注释起来。然后为控件添加标准属性,选择 ClassWizard 对话框上的 Automation 选项卡,然后单击【Add Property】按钮,将弹出属性对话框。在 External name 选项卡中选择 ForeColor 前景色属性,其它保持默认设置。为 了实现设置前景色的功能,还有在 CRectangleCtrl 类的 OnDraw 函数中添加代 码如下:CBrush brush(TranslateColor(GetForeColor();pdc->Rectangle(rcBounds);pdc->FillRect(rcBounds,GetForeColor 函数用来获得前景色,然后在整个控件区域内绘制一个矩形,最 后用前景色来填充整个矩形。(3)为控件增加标准事件双击事件。选择 ClassWizard 对话框上的 ActiveX Events 选项卡,然后单击【Add Event】按钮,将显示添加事件对话框,在此 对话框上有一个名称为 External name 的组合框,当单击其右边向下的箭头时, 将会看到列出了一些预先准备好的事件。在 External name 下拉列表中选择 DblClick,保持默认的 Stock 选项不变,然后单击【OK】按钮关闭 Add Event 对话框,然后单击 ClassWizard 对话框上的【OK】按钮关闭该对话框。(4)利用实验 1 中的方法来测试控件的属性和事件。(5)生成一个发行版本的 ActiveX 控件。方法是在 VC+开发环境打开 Rectangle 工程,然后选择【BuildSet Active Configuration.】菜单项, 从弹出的对话框中选择“Rectangle-Win32 Release”,单击【OK】按钮,然后 重新利用 Build 命令生成控件。(6)编写一个 ActiveX 控件的测试程序。新建一个基于对话框的工程,命名为: RectangleTest,并删除自动生成的对话框资源上的静态文本控件。利用实验 1 中的方法插入 Rectangle 控件。这时,会在工程中为该控件生成一个类,类名 为 CRectangle。(7)在程序中动态的产生一个 Rectangle 控件,首先为 CRectangleTestDlg 类 增加一个成员变量,变量名为 m_rectangle,类型为 CRectangle。然后在 CRectangleTestDlg 类的 OnInitDialog 函数中加入代码如下: m_rectangle.Create(“Rectangle“,WS_CHILD|WS_VISIBLE,CRect(100,100,200, 150),this,123);动态产生一个 Rectangle 控件,并在 RectangleTest.h 文件中 加入代码如下:#include “rectangle.h“。编译并运行程序,如下图所示:(8)为动态产生的 Rectangle 控件增加双击事件的响应。首先在 ResourceView 选项卡下,打开主对话框,并在其上静态拖放一个 Rectangle 控 件,将其 ID 设置为 IDC_RECTANGLECTRL1。在该控件上单击鼠标右键,从弹出 的快捷菜单上选择【ClassWizard.】,可以看到,通过 ClassWizard 可以为 Rectangle 控件增加 DblClick 事件。如果要增加某个事件,在此对话框中选中 该事件,然后单击【Add Function.】按钮即可。(9)删除刚刚添加的静态 Rectangle 控件。打开 FileView 选项卡,打开 Resource.h 文件,并在其中添加代码:#define IDC_RECTANGLECTRL1 123此时,即将动态创建的 Rectangle 控件和静态创建的 Rectangle 控件的双击事 件结合在一起了。(10)在 Rectangle 控件的双击事件响应函数 OnDblClickRectanglectrl1 中添 加代码如下:CColorDialog dlg;if(IDOK=dlg.DoModal()m_rectangle.SetForeColor(dlg.m_cc.rgbResult);当双击 Rectangle 控件时,首先创建一个颜色对话框,当做出选择,按下“确 定”按钮的时候,DoModal 函数返回 IDOK,此时,把颜色对话框中保存的结果 dlg.m_cc.rgbResult 传递给 SetForeColor 函数来设置控件的前景色。(11)编辑并运行程序,观察实验结果。下图为选择绿色为前景色所得结果:四 独立实验1、创建一个控件,平时显示蓝色,调用“启动(Start)方法”后显示红色,维 持一段时间后恢复原底色,方法包括对维持时间的设置,强行停止等,在维持 过程中,要定时产生已维持时间信息,当维持时间结束时产生事件结束事件。测试程序:在对话窗口放置显示块(即控件),并对显示块进行设置和控制, 包括启动、强行结束按钮,维持时间输入,用标准控件显示维持过程。五 技术支持1 非规则外形的窗口建立方法:在 .H 文件中加:CRect m_rectWnd ; /记录窗口初始矩形CRgn m_rgn ; /设置窗口所在区域如果是窗口类,对话框模板的属性(Styles)设置为”popup”、无边界 (Border)为 none。 在初始化对话窗口函数中添加: BOOL CmyDlg:OnInitDialog() CDialog:OnInitDialog(); GetClientRect(m_rectWnd); /获得对话窗口的尺寸 m_rgn.CreateEllipticRgn(0,0,m_rectWnd.right,m_rectWnd.bottom); / 创建窗口区域与窗口的关系,即限制窗口区域 SetWindowRgn(HRGN)m_rgn,TRUE); 如果希望获得其它形状,可利用 CRgn 函数,组成其它形状,如多区域的拼接, 程序如下:this->GetClientRect(m_rect); m_rgn1.CreateEllipticRgn(m_rect.Width() /2 , 0 ,m_rect.Width(),m_rect.Height(); m_rgn2.CreateEllipticRgn(0 , 0 ,m_rect.Width()/2 ,m_rect.Height();m_rgn3.CreateRectRgn( 0, 0, 50, 50 ); int nCombineResult = m_rgn3.CombineRgn( / ASSERT( nCombineResult != ERROR | nCombineResult != NULLREGION );this ->SetWindowRgn(HRGN)m_rgn3 ,TRUE);CRgn 成员函数:如果是一般窗口,增加对 WM_CREATE 消息处理,处理程序类似上面。 在控件中,处理方法与一般窗口类似。2 关于 ActiveXActiveX 控件是可执行的部件,它们被设计为嵌在一个窗口或网页中以完成一 些自带的任务。对用户来说,它们非常类似于 Windows 系统提供的普通控件。 从应用上看,对 ActiveX 的使用包括两部分,首先是如何在一个用户的应用程 序中使用 ActiveX 控件,另一个部分就是如何编写 ActiveX 程序,当然包括 调试等。 在 MFC 中,微软已经将将 ActiveX 编程方面的许多细节用框架已经 解决了,这就大大地 减轻了程序设计者的困难,ActiveX 应用程序只需要很少 或无需过多地了解关于简化了开发过程,可以将注意力集中在程序的设计方面。名字是新的,而技术却是原来已经成熟的。ActiveX 控件是基于微软早期的 OLE 技术,OLE 过去指的是对象链接与嵌入,但对象嵌入只是 OLE 功能的一个 部分,随着软件技术的发展,它已经从一个为特殊目的而设计的技术,发展成 为一个包括 ActiveX 在内的其它特定技术所依赖的通用体系结构。OLE 为创建 和连接不同的程序部件 (包括称为 OLE 自定义控件的服务器模块) 定义了一个 标准的蓝图。简而言之,它们过去叫做 OLE 控件,现在微软将其称为 ActiveX 控件。那么什么是 ActiveX 控件呢?简单的回答就是:ActiveX 控件是一个动态链接 库,它可以作为一个 OLE 服务器,而且可以被嵌在一个包容器主应用程序中。 ActiveX 控件是可移植的软件模块,用于完成一点的任务。ActiveX 控件类类 似于按钮和列表框等标准控件,可以在对话窗口和其它窗口中显示和使用。 ActiveX 控件可以自己创建,从 Internet 下载或从其它软件商中获得。ActiveX 控件的优点在于无论应用应用程序使用哪种计算机语言,都可以插入 ActiveX 控件。 ActiveX 控件由容器的概念而来,集成了容器的基本机制:属 性、事件和方法。 关键性的概念:ActiveX 是由 Microsoft 公司定义的用于 Internet 的一种对象链接与嵌入 技术(OLE) 计算模型已经由传统的基于主机的模型发展为现代的 ActiveX 基于 Internet 的模型 可以通过 Visual Basic (控件创建版本)、Visual C+、Borland C+、Borland Delphi 等工具来创建 ActiveX 控件。可以通过诸如 ActiveX Control Pad 之类的工具来写 ActiveX 脚本。ActiveX 文档( ActiveX Document )是一种非 HTML 的文档,浏览器可以通过 ActiveX 技术来显示它通过在应用程序中使用 Microsoft 公司的 ActiveX 讨论开发工具集(SDK), 使应用程序具有讨论的能力。通过使用 ActiveX Server,可以使 Web 模型更为智能化 可以使用基于 Microsoft 组件对象模型 (COM) 的 ActiveX Java 与 ActiveX 是互为补充的 定义属性定义固有属性和自定义属性。修改属性页ActiveX 控件可以包括一个或几个属性页。每个属性页可以形成一个对话框, 可以包括控件的属性值。可以用属性页定义属性的初始值。每个属性页用对话 编辑器中 Properties 对话框的标签 定义方法在 ActiveX 控件中,可以定义方法,最常见的方法是 AboutBox。在 VC 的开 发平台上,用户可以为设计的控件增加方法。增加的方法应有方法名称、返回 类型和参数。 用户也可以为 ActiveX 控件旦定义事件,ActiveX 即可调用相关的 Fire 函数 告诉容器程序发生了事件。调用 Fire 函数称为产生事件。同时产生事件可以 调用相同的事件处理函数。 和属性与方法一样,事件有固有和自定义两种。对 固有事件,MFC 提供了 Fire 函数和在 适当时间调用这个函数的代码。而对于 自定义事件, 则由 ClassWizard 产生新的 Fire 函数,当然 这时需要编写发 出事件时调用相应函数的代码。 COM 是基本的对象模型”,根据 COM,ActiveX 控件与 OLE 才可建立。COM 允许对象向其他元件及应用显示其功能。对于对象如何显示自身及这种显示如 何贯穿于过程与网络作了定义。COM 也定义了对象的生命周期。 COM 基本有以下内容:接口对象显示其功能的机制。 IUnknow 产生其他接口的基本接口。在运行 COM 时,实现参考记数与接 口查询机制 参考记数对象 ( 严格来说,为接口 ) 决定何时不再使用,并自行移除 的技术 QueryInterface 对给定接口查询对象的方法。 编组 ( Marshaling ) 考虑到地址的独立性,通过调用过程网络使对象 可以使用的 机制。聚合 对象可以使用另一对象的方法。 如果要在程序中使用 ActiveX 控件,首先应该注册,否则应用程序是无法将其 嵌入到程序中的,(如果该控件是在当前机器是创建的,那么系统已经将其自动 注册),在 VC 中有将控件注册的软件,如 Regsvr32.exe, 在开发平台上,有 启动该命令的菜单。在网页中加入在网页中加入 ActiveXActiveX 控件方法控件方法 首先,你使用的应该是支持 ActiveX 的文本编辑器和浏览器,如果要在 HTML 文档中使用 ActiveX 在控件,首先要查找到该控件的 32 位类标识器号,即 CLSID。要查找这个类标识器号,在登记项编辑器提供了查找控件的 CLSID 提 供方法。用 regedit 或 regedit32 ,单击登记项编辑器的 Edit 菜单上 的 Find 命令,并敲入该控件的文件器。VC 提供了一个叫做 Test Container 的工具,它所做实现的功能正像它的名字 所示的样,允许你调入并实验注册过的 ActiveX 控件而无需创建自己的包容器 应用程序。启动 Test Container 后,可以单击 Edit 菜单上的 OLE Control 命令或工具栏上的 Insert 按钮,然后 会弹出一个对话窗口,选择你需要测试的控件,调用 COleControl:SetInitialSize 函数建立其启动大小。要得到一个由 ActiveX 控件导出的方法列表,可单击 Edit 菜单上的 Invoke Methods ,或单击工具栏上的 Methods 按钮。这将出现 Invoke Control Method 对话框,在其中你可以激活控件中的方法以放置属性。 Test Container 的 View 菜单上的 Properties 命令给出 Properties 对话框, 它为设置控件的属 性提供了一种更为方便的办法:当你在 Property 文字框中键入一个属性名时,一般地,控件有自己的属性页。包容器和包容器和 ActiveXActiveX 控件之间的通讯控件之间的通讯事件事件通过事件来使包容器应用程序了解控件内部的活动,由某一控件所激发的事件 是如何一个控件开发者所认为的该控件应用程序可能需要知道的东西。控件可能会激发一个事件以响应控件窗口内的一个鼠标单击,或将控件窗口所 获得的信息传递给包容器。方法方法方法与事件处理函数相反,事件处理函数位于包容器中,被控件调用,而方法 则位于控件中,由包容器调用,包容器可以调用一个方法来了解一个条件或请 求控件完成某项功能。OLE 预定义了库存方法,分布是 Doclick,Refresh 和 AboutBox,它们没有参 数,也不返回值。其它由 ActiveX 控件导出的方法均称为自定义方法,是由控 件设计者设计。属性属性属性是包含在相互暴露给对方的包容器和控件之内的公共数据。 OLE 定义了 4 种属性,分别叫做库存 ( stock ),自定义( custom ),周围 ( ambient )和 扩展( extended )。库存和自定义属性属于控件,周围和扩展属性属于包容器。库存属性库存属性库存属性指明了由 OLE 标准定义的典型控件持征,如该控件的前景和背景颜色, 它窗口中显示的文字,以及文字所用的字体。包容器通过调用 MFC 中的 Get 和 Set 的方法来读写控件属性,一般地,ActiveX 中的每个属性都有相应地 Get/Set 方法,当然也不是必须的,例如控件仅提供 Get 方法,控件就可以让 包容器无法直接改变该控件属性。周围和扩展属性周围和扩展属性 周围和扩展属性是由客户属性提供的,而且不能被控件所改变。 扩展属性是与嵌入控件相关的数据,但却是由包容器实现和管理的。周围属性 描述了包容器自己,如它当前的背景颜色或字体。 ActiveX 控件编写方法如果利用 VC 开发 ActiveX 控件,微软给开发人员提供了 3 种工具帮助建立 ActiveX。 MFC 对 ActiveX 控件的支持 BaseCtl 框架结构 ActiveX 模板库(ATL)这 3 种方式各有利弊。MFC 提供了方便的通向一个有效和稳定的 ActiveX 控件的途径,但缺点是 OCX 文件相对大些。BaseCtl 框架结构,也叫 ActiveX 控件框架结构,是一个可替换 MFC 的简单 结构。BaseCtl 提供给开发人员的支持少,但也有更多的灵活性。用 BaseCtl 建立的 ActiveX 控件既不需要 MFC 也不需要 C 运行时间库。ActiveX 模板库( ATL ) 可生成最小的 OCX 文件。用 ATL 建立 ActivcX 控件 相对于其它两种方法需要更多的准备工作,但如果是要用于创建在 Internet 上的 ActiveX 控件,考虑到其文件的大小,采用 ATL 是一个好的选择。在在 VCVC 开发平台上利用开发平台上利用 MFCMFC 创建创建 ActiveXActiveX 控件方法:控件方法:在 Step2 时几个关键的选项和说明 Activates When Visible 决定包容器在控件可见时是否应该自动激活控件。 通常 ActiveX 控件需要立刻激活。 Invisible At Run-Time 如果选中这一选项,那么 ControlWizard 不把 OnDraw 函数 加到控件类中。对不需要与用户进行可视交互的控件,使用该选 项。 Available In Insent Object Dialog 与从 Test Container 工具到微软应 用程 序的许多包容器应用程序提供的 Insert Object 对话框(或其对等对话框)有 关。 Acts As Simple Frame Control 加入对 ISimpleFrameSite 接口的支持。 该选择将 控件设置为一个包含有包容器窗口中其它 ActiveX 控件的框,按视 觉将控件分组,允许它们一起被移动。Window Subclassing 将诸如编辑框或进度指示器之类的普通 Windows 控件 分成 子类,以此来设置控件项目。