2022年VC++控件开发教程 .pdf





《2022年VC++控件开发教程 .pdf》由会员分享,可在线阅读,更多相关《2022年VC++控件开发教程 .pdf(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、摘要:本文对 COM 组件中的 ActiveX 控件的 MFC开发方法进行了介绍,讲述了用户自定义和库存属性、 方法以及事件的添加方法和属性页的制作过程。使读者能够掌握基本的MFC ActiveX 开发方法。关键词:MFC;ActiveX 控件; COM 阅读目录:一、前言二、建立工程框架三、属性、方法以及事件的添加四、实现属性表五、在包容程序中使用ActiveX 控件六、小结前言ActiveX 控件是一种实现了一系列特定接口而使其在使用和外观上更象一个控件的COM组件。 ActiveX 控件这种技术涉及到了几乎所有的COM 和 OLE的技术精华,如可链接对象、统一数据传输、OLE文档、属性页
2、、永久存储以及OLE自动化等。ActiveX 控件作为基本的界面单元,必须拥有自己的属性和方法以适合不同特点的程序和向包容器程序提供功能服务,其属性和方法均由自动化服务的IDispatch 接口来支持。除了属性和方法外,ActiveX 控件还具有区别于自动化服务的一种特性-事件。 事件指的是从控件发送给其包容程序的一种通知。与窗口控件通过发送消息通知其拥有者类似,ActiveX 控件是通过触发事件来通知其包容器的。事件的触发通常是通过控件包容器提供的IDispatch接口来调用自动化对象的方法来实现的。在设计ActiveX 控件时就应当考虑控件可能会发生哪些事件以及包容器程序将会对其中的哪些事
3、件感兴趣并将这些事件包含进来。与自动化服务不同, ActiveX 控件的方法、属性和事件均有自定义(custom)和库存( stock)两种不同名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 17 页 - - - - - - - - - 的类型。 自定义的方法和属性也就是是普通的自动化方法和属性,自定义事件则是自己选取名字和 Dispatch ID 的事件。而所谓的库存方法、属性和事件则是使用了ActiveX 控件规定了名字和 Dispatch ID 的标准 方法、属性和
4、事件。ActiveX 控件可以使COM 组件从外观和使用上能与普通的窗口控件一样,而且还提供了类似于设置Windows 标准控件属性的属性页,使其能够在包容器程序的设计阶段对ActiveX控件的属性进行可视化设置。ActiveX 控件提供的这些功能使得对其的使用将是非常方便的。本文下面即以MFC 为工具对ActiveX 控件的开发进行介绍。建立工程框架通过 MFC ActiveX ControlWizard向导可以非常容易的建立一个MFC ActiveX 控件工程框架。按照默认的选项将建立如图1 所示的工程结构:图 1 使用缺省选项建立的ActiveX控件工程结构其中, _DSample68和
5、_DSample68Events 这两个接口将为客户程序提供本控件的属性、方法以及可能响应的事件。全局函数DllRegisterServer()和 DllUnregisterServer()名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 17 页 - - - - - - - - - 分别用于控件在注册表的注册和注销,一般不需要对其进行改动。应用程序类从COleControlModule继承。而COleControlModule有是从 CWinApp派生,提供了初始化控件模
6、块的功能。CSample68PropPage的基类是COlePropertyPage ,CDialog类的派生类,主要负责对属性页中对图形界面下用户控件属性的显示。控件类CSample68Ctrl类是这几个类中比较重要的一个类,大部分实质性工作都在该类完成,其基类为 COleControl ,从 CWnd 和 CCmdTarget 继承,因此能够为控件对象提供与MFC窗口对象相同的功能同时也提供了一系列事件触发函数和一个分发映射表,使 ActiveX控件能够同包容器程序有效地进行交互。该类的派生类将可以在满足特定的条件时向控件的包容器发送消息或是触发事件, 以通知包容器程序在控件内有一些重要的
7、事件发生。分发映射表是其中很重要的一个部分,负责向包容器程序暴露控件提供的方法和属性。图2 展示了 COleControl类在控件与包容器通信中所起的作用。可以看出,ActiveX控件与其包容器之间的所有通信过程都是由COleControl来完成的:图 2 COleControl在 ActiveX控件与包容器通信中的作用控件类对基类COleControl的 OnDraw ()函数进行了重载,向导生成了如下缺省代码,其作用是在控件的客户区绘制一个椭圆。在编程过程中通常要对其进行替换:void CSample68Ctrl:OnDraw( CDC* pdc, const CRect& rcBound
8、s, 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); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 17 页 - - - - - - - - - 图
9、 3 插入 ActiveX控件图 4 插入的待测试控件对向导生成的代码进行编译后,将产生扩展名为ocx 的 ActiveX控件。 ActiveX控件并不能独立运行,只能在包容器程序中才能够运行。通常,为了调试方便而多使用VC+ 附带的 ActiveX Control Test Container工具以在测试阶段对ActiveX控件进行调试。在测试工具的客户区点击鼠标右键,并选中弹出菜单的Insert New Control 菜单项,将弹出图3 所示的对话框,左侧的列表框中列出了当前系统中所有注册的ActiveX控件,选中要测试的控件并将其插入到测试程序即可通过Control菜单下的各菜单项对控
10、件的方法、属性以及事件等进行测试。在位于下方的分割视图中将跟踪显示出调试记录(参见图4)。属性、方法以及事件的添加名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 17 页 - - - - - - - - - 图 5 属性的添加名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 17 页 - - - - - - - - - 图 6 方法的添加对 Activ
11、eX控件属性、 方法和事件的添加均有库存和自定义两种。其中对属性和方法的添加在 MFC ClassWizard 对话框的Automation页中通过按钮 Add Property 和Add Method弹出如图 5 和图 6 所示的添加属性和添加方法的对话框来完成。对于库存属性和方法,可以直接从External name组合框的下拉列表中选取,Implementation项将自动设置为 Stock 。对于自定义属性和方法的添加与在自动化对象中为接口添加属性和方法的过程一样,ClassWizard将在 .odl文件和控件类生成相应的代码,下面给出的是在控件类中实现的部分分发映射代码:/ Disp
12、atch maps /AFX_DISPATCH(CSample68Ctrl) CString m_message; afx_msg void OnMessageChanged(); afx_msg short GetXPos(); afx_msg void SetXPos(short nNewValue); afx_msg short GetYPos(); afx_msg void SetYPos(short nNewValue); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6
13、 页,共 17 页 - - - - - - - - - afx_msg short MessageLen(); /AFX_DISPATCH DECLARE_DISPATCH_MAP() / Dispatch and event IDs public: enum /AFX_DISP_ID(CSample68Ctrl) dispidMessage = 1L, dispidXPos = 2L, dispidYPos = 3L, dispidMessageLen = 4L, /AFX_DISP_ID ; BEGIN_DISPATCH_MAP(CSample68Ctrl, COleControl) /A
14、FX_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, VT_I2) DISP_FUNCTION(CSample68Ctrl, MessageLen, MessageLen, VT_I2,
15、VTS_NONE) DISP_STOCKPROP_BACKCOLOR() DISP_STOCKPROP_CAPTION() DISP_STOCKPROP_FORECOLOR() /AFX_DISPATCH_MAP END_DISPATCH_MAP() 在这里共添加了一个自定义方法MessageLen()和三种库存属性BackColor 、Caption和 ForeColor (分别表示控件的背景色、标题和前台色)、两个以Get/Set方式获取的自定义属性 XPos、YPos和一个以成员变量方式实现的自定义属性Message。这几个自定义属性分别表示要显示字符串的x、y 坐标和要显示的内容。对于
16、采取Get/Set方式获取的属性,应当在控件类中为其添加相应的成员函数,并修改其Get、Set 成员函数的实现过程:short m_nYPos; short m_nXPos; short CSample68Ctrl:GetXPos() return m_nXPos; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 17 页 - - - - - - - - - void CSample68Ctrl:SetXPos(short nNewValue) m_nXPos = nNe
17、wValue; SetModifiedFlag(); short CSample68Ctrl:GetYPos() return m_nYPos; void CSample68Ctrl:SetYPos(short nNewValue) m_nYPos = nNewValue; SetModifiedFlag(); 对于以成员变量方式创建的属性Message,向导还为其生成了一个消息响应函数:void CSample68Ctrl:OnMessageChanged() SetModifiedFlag(); 只要该属性的值被更改,OnMessageChanged ()函数即会被调用。为了使上述属性设置
18、如背景色、前景色等能够与控件实际联系起来,需要替换控件类OnDraw ()函数中由向导生成的那部分代码。例如,下面这段代码即以前面添加的属性设置作为参数值,在控件中显示一串字符:/ 用背景色设置画刷CBrush Brush(TranslateColor(GetBackColor(); / 用前台色设置字体颜色pdc-SetTextColor(TranslateColor(GetForeColor(); / 绘制背景pdc-FillRect(rcBounds, &Brush); / 设置字体背景透明pdc-SetBkMode(TRANSPARENT); / 显示字符pdc-TextOut(m_n
19、XPos, m_nYPos, m_message); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 17 页 - - - - - - - - - 为了使属性设置更改后,其效果能够立即在控件上显示出来,应当在与属性设置相关的函数实现中调用InvalidateControl()以更新控件的显示。可以编译程序并在ActiveX Control Test Container工具中对其进行测试。在插入控件后,通过 Invoke Methods 菜单项弹出如图7 所示的对话框。在M
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年VC+控件开发教程 2022 VC 控件 开发 教程

限制150内