ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:403.52KB ,
资源ID:3783056      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3783056.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(使用MFC开发ActiveX控件.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

使用MFC开发ActiveX控件.docx

1、使用MFC开发ActiveX控件摘要: 本文对COM组件中的ActiveX控件的MFC开发方法进行了介绍,讲述了用户自定义和库存属性、方法以及事件的添加方法和属性页的制作过程。使读者能够掌握基本的MFC ActiveX开发方法。前言ActiveX控件是一种实现了一系列特定接口而使其在使用和外观上更象一个控件的COM组件。ActiveX控件这种技术涉及到了几乎所有的COM和OLE的技术精华,如可链接对象、统一数据传输、OLE文档、属性页、永久存储以及OLE自动化等。ActiveX控件作为基本的界面单元,必须拥有自己的属性和方法以适合不同特点的程序和向包容器程序提供功能服务,其属性和方法均由自动化

2、服务的IDispatch接口来支持。除了属性和方法外,ActiveX控件还具有区别于自动化服务的一种特性-事件。事件指的是从控件发送给其包容程序的一种通知。与窗口控件通过发送消息通知其拥有者类似,ActiveX控件是通过触发事件来通知其包容器的。事件的触发通常是通过控件包容器提供的IDispatch接口来调用自动化对象的方法来实现的。在设计ActiveX控件时就应当考虑控件可能会发生哪些事件以及包容器程序将会对其中的哪些事件感兴趣并将这些事件包含进来。与自动化服务不同,ActiveX控件的方法、属性和事件均有自定义(custom)和库存(stock)两种不同的类型。自定义的方法和属性也就是是普

3、通的自动化方法和属性,自定义事件则是自己选取名字和Dispatch ID的事件。而所谓的库存方法、属性和事件则是使用了ActiveX控件规定了名字和Dispatch ID的标准方法、属性和事件。ActiveX控件可以使COM组件从外观和使用上能与普通的窗口控件一样,而且还提供了类似于设置Windows标准控件属性的属性页,使其能够在包容器程序的设计阶段对ActiveX控件的属性进行可视化设置。ActiveX控件提供的这些功能使得对其的使用将是非常方便的。本文下面即以MFC为工具对ActiveX控件的开发进行介绍。建立工程框架通过MFC ActiveX ControlWizard向导可以非常容易

4、的建立一个MFC ActiveX控件工程框架。按照默认的选项将建立如图1所示的工程结构:图1 使用缺省选项建立的ActiveX控件工程结构其中,_DSample68和_DSample68Events这两个接口将为客户程序提供本控件的属性、方法以及可能响应的事件。全局函数DllRegisterServer()和DllUnregisterServer()分别用于控件在注册表的注册和注销,一般不需要对其进行改动。应用程序类从COleControlModule继承。而COleControlModule有是从CWinApp派生,提供了初始化控件模块的功能。CSample68PropPage的基类是COl

5、ePropertyPage,CDialog类的派生类,主要负责对属性页中对图形界面下用户控件属性的显示。控件类CSample68Ctrl类是这几个类中比较重要的一个类,大部分实质性工作都在该类完成,其基类为COleControl,从CWnd和CCmdTarget继承,因此能够为控件对象提供与MFC窗口对象相同的功能同时也提供了一系列事件触发函数和一个分发映射表,使ActiveX控件能够同包容器程序有效地进行交互。该类的派生类将可以在满足特定的条件时向控件的包容器发送消息或是触发事件,以通知包容器程序在控件内有一些重要的事件发生。分发映射表是其中很重要的一个部分,负责向包容器程序暴露控件提供的方

6、法和属性。图2展示了COleControl类在控件与包容器通信中所起的作用。可以看出,ActiveX控件与其包容器之间的所有通信过程都是由COleControl来完成的:图2 COleControl在ActiveX控件与包容器通信中的作用控件类对基类COleControl的OnDraw()函数进行了重载,向导生成了如下缺省代码,其作用是在控件的客户区绘制一个椭圆。在编程过程中通常要对其进行替换:void CSample68Ctrl:OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)/ TODO: Replace the

7、 following code with your own drawing code.pdc-FillRect(rcBounds, CBrush:FromHandle(HBRUSH)GetStockObject(WHITE_BRUSH);pdc-Ellipse(rcBounds); 图3 插入ActiveX控件图4 插入的待测试控件对向导生成的代码进行编译后,将产生扩展名为ocx的ActiveX控件。ActiveX控件并不能独立运行,只能在包容器程序中才能够运行。通常,为了调试方便而多使用VC+附带的ActiveX Control Test Container工具以在测试阶段对ActiveX控

8、件进行调试。在测试工具的客户区点击鼠标右键,并选中弹出菜单的Insert New Control菜单项,将弹出图3所示的对话框,左侧的列表框中列出了当前系统中所有注册的ActiveX控件,选中要测试的控件并将其插入到测试程序即可通过Control菜单下的各菜单项对控件的方法、属性以及事件等进行测试。在位于下方的分割视图中将跟踪显示出调试记录(参见图4)。 属性、方法以及事件的添加图5 属性的添加图6 方法的添加对ActiveX控件属性、方法和事件的添加均有库存和自定义两种。其中对属性和方法的添加在MFC ClassWizard对话框的Automation页中通过按钮Add Property和A

9、dd Method弹出如图5和图6所示的添加属性和添加方法的对话框来完成。对于库存属性和方法,可以直接从External name组合框的下拉列表中选取,Implementation项将自动设置为Stock。对于自定义属性和方法的添加与在自动化对象中为接口添加属性和方法的过程一样,ClassWizard将在.odl文件和控件类生成相应的代码,下面给出的是在控件类中实现的部分分发映射代码:/ Dispatch maps/AFX_DISPATCH(CSample68Ctrl)CString m_message;afx_msg void OnMessageChanged();afx_msg shor

10、t GetXPos();afx_msg void SetXPos(short nNewValue);afx_msg short GetYPos();afx_msg void SetYPos(short nNewValue);afx_msg short MessageLen();/AFX_DISPATCHDECLARE_DISPATCH_MAP()/ Dispatch and event IDspublic:enum /AFX_DISP_ID(CSample68Ctrl)dispidMessage = 1L,dispidXPos = 2L,dispidYPos = 3L,dispidMessag

11、eLen = 4L,/AFX_DISP_ID;BEGIN_DISPATCH_MAP(CSample68Ctrl, COleControl)/AFX_DISPATCH_MAP(CSample68Ctrl)DISP_PROPERTY_NOTIFY(CSample68Ctrl, Message, m_message, OnMessageChanged, VT_BSTR)DISP_PROPERTY_EX(CSample68Ctrl, XPos, GetXPos, SetXPos, VT_I2)DISP_PROPERTY_EX(CSample68Ctrl, YPos, GetYPos, SetYPos,

12、 VT_I2)DISP_FUNCTION(CSample68Ctrl, MessageLen, MessageLen, VT_I2, VTS_NONE)DISP_STOCKPROP_BACKCOLOR()DISP_STOCKPROP_CAPTION()DISP_STOCKPROP_FORECOLOR()/AFX_DISPATCH_MAPEND_DISPATCH_MAP() 在这里共添加了一个自定义方法MessageLen()和三种库存属性BackColor、Caption和ForeColor(分别表示控件的背景色、标题和前台色)、两个以Get/Set方式获取的自定义属性XPos、YPos和一个

13、以成员变量方式实现的自定义属性Message。这几个自定义属性分别表示要显示字符串的x、y坐标和要显示的内容。对于采取Get/Set方式获取的属性,应当在控件类中为其添加相应的成员函数,并修改其Get、Set成员函数的实现过程:short m_nYPos;short m_nXPos;short CSample68Ctrl:GetXPos() return m_nXPos;void CSample68Ctrl:SetXPos(short nNewValue) m_nXPos = nNewValue;SetModifiedFlag();short CSample68Ctrl:GetYPos() r

14、eturn m_nYPos;void CSample68Ctrl:SetYPos(short nNewValue) m_nYPos = nNewValue;SetModifiedFlag(); 对于以成员变量方式创建的属性Message,向导还为其生成了一个消息响应函数:void CSample68Ctrl:OnMessageChanged() SetModifiedFlag(); 只要该属性的值被更改,OnMessageChanged()函数即会被调用。为了使上述属性设置如背景色、前景色等能够与控件实际联系起来,需要替换控件类OnDraw()函数中由向导生成的那部分代码。例如,下面这段代码即

15、以前面添加的属性设置作为参数值,在控件中显示一串字符:/ 用背景色设置画刷CBrush Brush(TranslateColor(GetBackColor();/ 用前台色设置字体颜色pdc-SetTextColor(TranslateColor(GetForeColor();/ 绘制背景pdc-FillRect(rcBounds, &Brush);/ 设置字体背景透明pdc-SetBkMode(TRANSPARENT);/ 显示字符pdc-TextOut(m_nXPos, m_nYPos, m_message); 为了使属性设置更改后,其效果能够立即在控件上显示出来,应当在与属性设置相关的函

16、数实现中调用InvalidateControl()以更新控件的显示。可以编译程序并在ActiveX Control Test Container工具中对其进行测试。在插入控件后,通过Invoke Methods菜单项弹出如图7所示的对话框。在Method Name组合框中可以选择要测试的属性和方法。其中,对于属性的测试分别有ProgGet和ProgSet的说明以指出是对属性值的获取与设置。在Parameter编辑框中输入要设置的参数及其对应的参数类型,点击SetValue按钮将把该参数值添加到参数列表框,最后点击Invoke按钮将在控件应用设置的属性并执行指定的方法。对于有返回值的方法,其执行

17、结果将在Return编辑框中显示。如果出现了异常操作,在Exception编辑框中将会显示出相应的异常错误信息。图8给出了经过属性设置的控件界面。图7 对属性、方法的测试图8 设置了属性后的控件对于控件事件的添加,在MFC ClassWizard对话框的ActiveX Events页中通过Add Event按钮弹出如图9所示的Add Event事件添加对话框。与方法、属性的添加类似,在External name组合框中可以输入要添加的自定义事件名称,也可以从下拉列表选择库存事件。Implementation项将根据所要添加的事件类型而自动设置Stock或Custom选项。ActiveX控件将通

18、过添加的事件来通知容器程序有特定的事件发生,库存事件多为键盘、鼠标事件,将由COleControl自动进行处理。对于自定义事件,则只是在.odl文件和控件类中添加了事件映射表等必要的代码(代码附下),至于应当在何种条件下触发该事件须由开发人员自行编写代码。图9 事件的添加dispinterface _DSample68Eventsproperties:/ Event interface has no propertiesmethods:/ NOTE - ClassWizard will maintain event information here./ Use extreme caution

19、when editing this section./AFX_ODL_EVENT(CSample68Ctrl)id(1) void MsgOut();/AFX_ODL_EVENT;/ Event maps/AFX_EVENT(CSample68Ctrl)void FireMsgOut()FireEvent(eventidMsgOut,EVENT_PARAM(VTS_NONE);/AFX_EVENTDECLARE_EVENT_MAP()/ Dispatch and event IDspublic:enum /AFX_DISP_ID(CSample68Ctrl)eventidMsgOut = 1L

20、,/AFX_DISP_ID;BEGIN_EVENT_MAP(CSample68Ctrl, COleControl)/AFX_EVENT_MAP(CSample68Ctrl)EVENT_CUSTOM(MsgOut, FireMsgOut, VTS_NONE)/AFX_EVENT_MAPEND_EVENT_MAP() 上述代码添加了一个MsgOut的自定义事件,可以在通过调用FireMsgOut()来激发。下面对Message属性的OnMessageChanged()消息响应函数进行修改,每当Message属性内容被更改都会调用该函数,在该函数中调用此前添加的MessageLen()方法以确定更改

21、后的Message属性的字符串长度,在长度大于10时调用FireMsgOut()触发MsgOut事件:void CSample68Ctrl:OnMessageChanged() InvalidateControl();if (MessageLen() = 10)FireMsgOut();SetModifiedFlag(); 图10 选择要记录的事件在用ActiveX Control Test Container对刚添加的事件进行测试时,首先通过Control菜单下的Logging菜单项弹出如图10所示的对话框,并从Events属性页中选中要跟踪记录的事件。当通过Invoke Methods对话

22、框设置Message属性的内容超过10个字符后,位于程序框架下方的分割视图将记录控件所触发的MsgOut事件(如图11所示)。图11 对事件的测试实现属性表属性表是ActiveX控件所特有的一种技术,可以在包容器程序处于设计阶段时为其提供一个可视化的人机交互界面,并可以通过其对控件的自定义属性和库存属性进行设置。在用向导生成程序框架的同时即已经生成了一个空的用于管理自定义属性的属性页。在代码上通过控件类实现文件中的属性页ID表对其进行维护:BEGIN_PROPPAGEIDS(CSample68Ctrl, 1)PROPPAGEID(CSample68PropPage:guid)END_PROPP

23、AGEIDS(CSample68Ctrl)这里的CSample68PropPage类是从COlePropertyPage派生出来的,而COlePropertyPage的基类又是CDialog,因此不难发现CSample68PropPage与通常的对话框类是比较相似的。可以象处理对话框一样在资源视图中为缺省的属性页添加与自定义属性相关的交互用控件,并通过ClassWizard将这些控件与类成员变量建立绑定关系。但是有一点不同,就是在绑定成员变量时还要与控件中的相应属性建立起对应关系。如图12所示,在Optional property name组合框中输入自定义属性名或是直接从下拉列表选择库存属性

24、名,ClassWizard向导将在属性页类的DoDataExchange()函数中添加控件、变量和属性的绑定代码:void CSample68PropPage:DoDataExchange(CDataExchange* pDX)/AFX_DATA_MAP(CSample68PropPage)DDP_Text(pDX, IDC_MESSAGE, m_sMessage, _T(Message) );DDX_Text(pDX, IDC_MESSAGE, m_sMessage);DDP_Text(pDX, IDC_TITLE, m_sCaption, _T(Caption) );DDX_Text(pD

25、X, IDC_TITLE, m_sCaption);DDP_Text(pDX, IDC_XPOS, m_nXPos, _T(XPos) );DDX_Text(pDX, IDC_XPOS, m_nXPos);DDP_Text(pDX, IDC_YPOS, m_nYPos, _T(YPos) );DDX_Text(pDX, IDC_YPOS, m_nYPos);/AFX_DATA_MAPDDP_PostProcessing(pDX);图12 成员变量、控件与属性的绑定这里只是在向导生成的缺省属性页中实现了自定义属性的可视化设置。虽然也可以用相同的方法为库存属性进行设置,但是更多的还是采用添加库存属

26、性页ID的方法来直接使用库存属性页来对其进行维护。例如,对于库存属性BackColor和ForeColor,可以通过ID号为CLSID_CcolorPropPage的库存属性页来进行设置,在将其添加到属性页ID表的同时一定要注意修改BEGIN_PROPPAGEIDS()宏的属性页计数,否则将会引起系统的崩溃:BEGIN_PROPPAGEIDS(CSample68Ctrl, 2)PROPPAGEID(CSample68PropPage:guid)PROPPAGEID(CLSID_CColorPropPage)END_PROPPAGEIDS(CSample68Ctrl)继续在ActiveX Con

27、trol Test Container中测试控件,将其插入后选择Edit菜单的Properties菜单项,将弹出入图13所示的属性表。该属性表共有三个属性页,其中第一个属性页为刚才编辑的自定义属性页,第二个属性页(如图14所示)即为CLSID_CcolorPropPage所指定的颜色属性页(为库存属性页),最后一个属性页则是向导自动添加的扩展属性页。在属性表中设置了相应的属性后,点击应用按钮即可让控件使用新的属性。这与在Invoke Methods对话框中所完成的功能一样,但显然要方便的多。而且在包容器程序的设计阶段,也是通过该属性表来完成控件与客户的属性设置交互的。图13 控件的属性表图14

28、 颜色属性页在包容程序中使用ActiveX控件对于ActiveX控件的包容器程序,并不需要象使用OLE文档服务器或ActiveX文档服务器对象那样编写特定的包容器程序框架,直接将控件添加到工程并在对话框上创建即可对其进行使用。通过Project菜单下的Add To Project菜单项弹出的Components and Controls子菜单项打开一个Components and Controls Gallery对话框,进入到Registered ActiveX Controls目录下,选取前面创建的ActiveX控件,并将其添加到工程。向导将会在工程中添加一个关于此ActiveX控件的包装类

29、,并在Controls工具栏中添加一个表示此控件的图标。可以象使用其他的标准控件一样将其放置到对话框资源中,并修改其缺省属性。除此之外,还可以在程序中通过对控件包装类成员函数的使用来动态更改控件的属性设置。例如,下面这段代码通过包装类对象m_ctrlTest在程序运行期间动态设置了控件的XPos、YPos 以及Message属性:/ 更新显示UpdateData();/ 动态更改控件的Message属性m_ctrlTest.SetMessage(m_sInput);/ 设置显示坐标m_ctrlTest.SetXPos(10);m_ctrlTest.SetYPos(10); 图15 添加事件响应

30、函数在资源视图中用鼠标右键点击放置于对话框上的ActiveX控件,并从弹出菜单中选择Events菜单项,将弹出如图15所示的对话框,在左边的列表框中显示了控件提供的事件,双击事件将在包容器程序中添加相应的事件处理函数和事件映射表,并可以在响应控件发出的事件后进行相应的处理:BEGIN_EVENTSINK_MAP(CSample69Dlg, CDialog)/AFX_EVENTSINK_MAP(CSample69Dlg)ON_EVENT(CSample69Dlg, IDC_SAMPLE68CTRL1, 1 /* MsgOut */, OnMsgOutSample68ctrl1, VTS_NONE)/AFX_EVENTSINK_MAPEND_EVENTSINK_MAP()void CSample69Dlg:OnMsgOutSample68ctrl1() / 得到输入字符数int nNum = m_ctrlTest.MessageLen();/ 回显信息m_sInput.Format(输入字符太多,共输入了%d个字符, nNum); / 显示信息UpdateData(FALSE);从

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

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