




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用MFC开发ActiveX控件全过程Visual C+是开发ActiveX控件的强大工具,它的特点是开发周期短、便于使用,因此它已经成为开发ActiveX控件的主要工具之一。Visual C+集成开发环境,使用了微软自己的类库MFC,MFC对开发ActiveX控件提供了全面的支持,本文讲述的过程均在Visual C+ 6.0(以下简称VC)中实现。1、 创建工程: 对于使用过VC的人,可以很容易地创建一个开发ActiveX控件的工程,没有使用过VC的人,按 照下面的操作步骤,也可以很快创建一个同样的工程出来。 第一步:“File”“New”“(Projects)MFC ActiveX ControlWizard”,在“Project Name”中输入合适的工程名(以test为例),在“Location”中选择工程文件存放路径,然后,“OK”进入下一步; 第二步:选择你想在这个工程中生成的ActiveX控件的个数(至少一个),其余选项决定是否生成一些辅助文件,通常按照默认设置即可,“Next”进入下一步; 第三步:编辑你的工程中各个类和文件的名称,配置一些辅助选项,可以全部选择默认设置,“Finish”进入下一步; 第四步:展示向导为你的工程生成的各种配置信息,“Cancel”重新设置不满意的选项,“OK”结束工程的创建。 2、 绘制控件: MFC将对ActiveX控件的支持封装在COleControl类中,所有ActiveX控件均从这个类 派生。绘制控件的全部操作则集中在一个虚函数中OnDraw(),其默认实现如下: void CTestCtrl: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); pdc-Ellipse(rcBounds); 可以看到,OnDraw()函数的默认实现是在矩形rcBounds中绘制一个椭圆,通过改写OnDraw()函数中的内容,就可以绘制自己想要的控件了。需要注意的一点,控件的绘制被限制在矩形rcBounds中,绘制范围不能超出这个矩形。 3、 添加属性: ActiveX控件提供了三种类型的属性供用户选择:公共属性、具有通知特性的属性和Get/Set 类型的属性。下面依次对三种类型属性的添加、初始化、新属性值的获取和属性的永久保存,分别进行介绍。 三种类型的属性的添加,都遵照相同的步骤:“View”“ClassWizard”“(Automation)Add Property”“Add Property”对话框。注意,“Class Name”中应是你想添加属性的控件类的名称(如CTestCtrl)。 . 公共属性: COleControl类提供了九种常用的属性作为公共属性,我们以“Caption”为例。在“Add Property”对话框中的“External Name”选择“Caption”,“Implementation”中选中“Stock”,然后“OK”即向控件添加了Caption公共属性。 COleControl类为每一个公共属性都提供了默认的设置和获取成员函数,对于Caption属性有SetText()和GetText()(或InternalGetText()。 COleControl类在函数DoPropExchange()中对于公共属性都有默认的初始化,但是我们可以在成员函数OnResetState()中,为公共属性设置我们自己想要的初始值。Caption默认的初始值为空,可以使用成员函数SetText( LPCTSTR pszText ),为其设置任意的字符串。 我们可以通过调用函数GetText()或InternalGetText()获得当前的Caption属性值。需要注意的是,对于GetText()函数,在调用之后,需要调用SysFreeString()函数以释放资源。此外,GetText()函数的返回值为BSTR类型,经常需要与大家常用的CString字符串类型进行变换:BSTR可以直接赋值CString,也可以调用API函数:SysAllocString(Cstring);但是将CString转换成BSTR,必须调用函数CString:AllocSysString()。InternalGetText()函数则无上述烦恼。 对于公共属性的永久保存,在COleControl类的成员函数DoPropExchange()有默认实现,就无需大家费心了。 . 具有通知特性的属性: 在“Add Property”对话框的“Implementation”中选中“Member variable”,即选择了向控 件添加具有通知特性的属性。在“External Name”中输入属性的名字(Shape),在“Type”中选择变量类型(BOOL),“Variable Name”和“Notification function”中会自动生成默认的变量名(m_shape)和通知函数名(OnShapeChanged),当然也可以手工输入自己习惯的名字。最后,“OK”便向控件添加了一个具有通知特性的属性。 对于属性的初始化和永久保存,只要在DoPropExchange()函数中调用PX_函数即可。按照上面添加的属性例子,可以如是调用:PX_Bool(pPX, _T(Shape), m_bShape, FALSE)。其中,“FALSE”为变量“m_bShape”即属性“Shape”的初始值。 至此,不得不先说一下控件的属性对话框了。MFC将控件的属性对话框封装在类COlePropertyPage中,所有控件的属性对话框都派生自这个类。控件的属性对话框,是控件开发者提供给控件用户、用于定制控件外观的通讯工具,控件用户可以通过它来修改控件的某些属性。COlePropertyPage类中最重要的成员当属DoDataExchange()函数了,控件开发者就是通过在其中调用DDP_函数把控件的属性与控件属性对话框中的各种控件联系起来的。对于控件的公共属性,在为属性对话框中的相应控件添加变量的时候,可以在“Optional property name”中选择相应的公共属性,则属性对话框类就会在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) ) 。 对于“Notification function”需要补充说明的是,虽然在相应的函数中,属性添加向导会自动添加函数SetModifiedFlag(),但是如果需要在属性被改变时,相应改变控件的显示,则需开发人员手工加入函数InvalidateControl()(它会激发OnDraw()函数的调用)。 . Get/Set类型的属性: 在“Add Property”对话框的“Implementation”中选中“Get/Set mothods”,即选择了向控 件添加“Get/Set类型的属性”。 在“External Name”中输入属性的名字(Color),在“Type”中选择变量类型(OLE_COLOR),“Get function”和“Set function”中会自动生成默认的函数名“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函数中返回当前的属性值(return m_clrInside);Set函数中设置新的属性值(m_clrInside = nNewValue),同样,如果需要在属性被改变时,改变控件的显示,需开发人员手工加入函数InvalidateControl()。 4、 添加事件: 事件是AcTiveX控件通知ActiveX控件容器的手段,一般事件是由一些交互操作激发的,如鼠 标操作、键盘操作等。ActiveX控件支持公共事件和自定义事件,两者添加方法相似,只是公共事件由COleControl类自动处理。 使用VC自带的ClassWizard添加事件:“View”“ClassWizard”“(ActiveX Events)Add Event.”,出现“Add Event”对话框。如果是添加公共事件,只要在“External Name”下拉列表中选择想要添加的事件,“OK”即可;添加自定义事件,则在“External Name”中输入自定义事件的名称(ClickIn),“Internal Name”中会自动生成事件激发函数的名称(FireClickIn),也可以输入自己习惯的名字,然后在“Parameter list”中输入需要的参数名称(Hit)和参数类型(BOOL),最后“OK”就完成了自定义事件的添加。 对于公共事件,COleControl类会自动激发,例如:当鼠标中的任意一个键在单击控件时,Click事件就会自动被激发,向控件容器发送通知;对于自定义事件,必须由开发人员在需要激发事件的时候,调用相应的成员函数,来激发事件,以上面的“ClickIn”自定义事件为例,在需要激发事件的地方,需要开发人员调用相应的事件激发函数“FireClickIn”来激发“ClickIn”事件。附带一提,事件携带的参数是控件容器判断事件类型的依据,例如上面的“Hit”参数,其值为“TRUE”或“FALSE”,就可以代表两种不同的情形。 5、 测试控件: 完成了控件的编码工作,接下来就需要对控件进行相关的测试了。测试控件,就需要一个控件 容器来装载控件,如果只是为了测试控件,而专门开发一个控件容器,根本就是本末倒置、得不偿失,开发一个ActiveX控件容器的工作量,是绝对不容小觑的!幸运的是,VC为我们提供了一个方便的ActiveX控件测试工具“ActiveX Control Test Container”(以下简称ACTC),这是VC为ActiveX控件开发人员,方便进行ActiveX控件的测试,而专门开发的一个ActiveX控件容器。 ACTC使用起来非常方面,可以通过两种方式打开它:一、在VC的主界面中,“Tools”“ActiveX Control Test Container”;二、“Execute Program”时,在跳出的“Executable For Debug Session”对话框的“Executable file name”中选择“ActiveX Control Test Container”,然后“OK”即可。 ACTC打开之后,“Edit”“Insert New Control”或在窗口空白处单击右键,然后选择“Insert New Control”,就会打开“Insert Control”对话框,最后在对话框左边的列表中找到自己的控件并选中,“OK”相应控件就会被添加到并显示在ACTC中。 测试控件的属性,可以“Edit”“Properties.”,就会打开控件的属性对话框;测试事件,事件的结果会在ACTC下面的窗口中显示。 MFC ActiveX 控件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 消息处理序列化序列化数据的能力(有时称为持久性)使控件得以将其属性值写入持久性存储。这样就可以通过从存储读取对象状态来重新创建控件。请注意,控件并不负责获取对存储媒体的访问。相反,控件的容器负责为控件提供存储媒体以便在适当的时候使用。有关序列化的更多信息,请参见文章 MFC ActiveX 控件:序列化。有关优化序列化的信息,请参见“ActiveX 控件:优化”中的优化持久性和初始化。安装 ActiveX 控件类和工具安装 Visual C+ 时,如果在安装过程中选择了 ActiveX 控件(默认情况下选择它们),则将自动安装 MFC ActiveX 控件类和发布及调试 ActiveX 控件运行时 DLL。默认情况下,ActiveX 控件类和工具安装在 Program FilesMicrosoft Visual Studio .NET 下的下列子目录中: Common7Tools 包含测试容器文件(TstCon32.exe 及其帮助文件)。 Vc7atlmfcinclude 包含使用 MFC 开发 ActiveX 控件所需的包含文件 Vc7atlmfcsrcmfc 包含 MFC 中特定 ActiveX 控件类的源代码 Vc7atlmfclib 包含使用 MFC 开发 ActiveX 控件所需的库 还有 MFC ActiveX 控件的示例。简单介绍 VC2003 使用 ATL 开发 ActiveX 控件第一步:创建ATL项目使用新建项目-VC+项目-ATL,选择 ATL 项目,输入项目名字,进入创建项目向导,选择好对应的属性(动态链接库),VC2003将自动生成一个框架,内含:项目代码(.c, .cpp),模块定义文件(.def),接口定义语言文件(.idl),注册脚本(.rgs),以及其他的资源文件等第二步:添加一个 ATL 对象(Class)在类视图中,在项目上点击右键,选择“添加-添加类”,在类选择框中,选择 VC+ -ATL 中的“ATL 控件”,出现 ATL 控件向导对话框,在向导的“名称”选项卡,“简称”(Short name)中,填写你的 ActiveX 控件的名字,如PolyCtl,这个名字就是控件注册后使用的名字。其他选项基本选择默认。如果想使用,可以用鼠标悬停在相应项上查看简单说明。在“选项”里面,选择支持“连接点”,可以让生成的控件调用外部实现接口,即执行特定页面函数的实现。VC6 中,需要手工选择支持 IError 等接口。第三步:设置控件的属性和实现例程的控件是实现绘出一个正多边形,多边形的边数可以调整。并能够响应鼠标左键点击事件,点击事件将判断鼠标点击的位置,并根据情况调用两个外部实现函数。在类视图的 IPolyCtl 上点击右键,选择“添加-添加属性”,添加一个 short 类型的属性,名字为 Sides,其他属性选默认,点击完成,向导将自动添加 get_Sides 和 put_Sides 的实现函数,这两个函数是外界取得 ActiveX 控件属性的时候被隐式调用的。为控件类添加一个成员变量 short m_nSides 来存储多边形的边数。在类构造函数中将其初始化为 3。在 get_Sides 和 put_Sides 中分别实现存取:STDMETHODIMP CPolyCtl:get_Sides(short *pVal) *pVal = m_nSides; return S_OK;STDMETHODIMP CPolyCtl:put_Sides(short newVal) if (newVal 2 & newVal 101) m_nSides = newVal; FireViewChange(); / 立即更新窗口 return S_OK; else return Error(_T(Shape must have between 3 and 100 sides);第四步:实现绘图为了实现绘出多边形,这里用到了 sin 和 cos 函数,这两个函数包含在 C 头文件 math.h 中,所以需要添加引用 #include 由于使用 Polygon 函数进行绘图,需要在类中添加一个点数组 POINT m_arrPoint100;在类中添加一个函数,用来计算指定矩形区域中多边形每个顶点的位置:void CalcPoints(const RECT& rc);void CPolyCtl:CalcPoints(const RECT& rc) const double pi = 3.14159265358979; POINT ptCenter; double dblRadiusx = (rc.right - rc.left) / 2; double dblRadiusy = (rc.bottom - rc.top) / 2; double dblAngle = 3 * pi / 2; / Start at the top double dblDiff = 2 * pi / m_nSides; / Angle each side will make ptCenter.x = (rc.left + rc.right) / 2; ptCenter.y = (rc.top + rc.bottom) / 2; / Calculate the points for each side for (int i = 0; i 支持 连接点”的话,类视图将有一个 _IPolyCtlEvent 接口,在上面点击右键,选择“添加-添加方法”,在添加方法向导中,将返回类型设置为 void,函数名设置为 ClickIn,参数设置为 inlong x 和 inlong y。用同样操作添加 ClickOut 方法。此时代码中的接口部分将类似如下代码:_interface _IPolyCtlEvents properties: methods: id(1), helpstring(方法 ClickIn) void ClickIn(inLONG x, in LONG y); id(2), helpstring(方法 ClickOut) void ClickOut(in LONG x, in LONG y);在 VC6 中,此时需要重新编译 i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商洛学院《生态哲学》2023-2024学年第一学期期末试卷
- 满洲里俄语职业学院《物流园区规划1》2023-2024学年第一学期期末试卷
- 福州理工学院《音乐基础Ⅱ》2023-2024学年第一学期期末试卷
- 河南护理职业学院《生物试验设计与统计分析》2023-2024学年第一学期期末试卷
- 石家庄幼儿师范高等专科学校《数字通信与计算机网络陈宇峰》2023-2024学年第一学期期末试卷
- 山东协和学院《写意基础》2023-2024学年第一学期期末试卷
- 西北农林科技大学《文化与翻译》2023-2024学年第一学期期末试卷
- 镇江市高等专科学校《环境医学与毒理学》2023-2024学年第一学期期末试卷
- 杭州万向职业技术学院《生物制药实训》2023-2024学年第一学期期末试卷
- 广东亚视演艺职业学院《牧草与草坪草种子学实验》2023-2024学年第一学期期末试卷
- 2024-2025学年人教版 2024小学数学一年级下册教学工作总结(共3套)
- 学生高层宿舍管理制度
- 薪资发放协议
- T/CAR 7-2021绿色高效自携式商用冷藏陈列柜技术要求和评价方法
- 合作账号合伙协议书
- 2025-2030年国内冷藏集装箱行业市场现状供需分析及投资评估规划分析研究报告
- 警务技能抓捕课件
- 广东省广州市南沙区2025届七下生物期末教学质量检测试题含解析
- DB13T 2700-2018 水工柔性生态防护结构设计规范
- 山东省济南市2025届高三三模生物试卷(含答案)
- 2025天津中考:语文必背知识点
评论
0/150
提交评论