使用MFC开发ActiveX控件(2)
建立工程框架
通过"MFC ActiveX ControlWizard"向导可以非常容易的建立一个MFC ActiveX控件工程框架。按照默认的选项将建立如图1所示的工程结构:

图1 使用缺省选项建立的ActiveX控件工程结构
其中,_DSample68和_DSample68Events这两个接口将为客户程序提供本控件的属性、方法以及可能响应的事件。全局函数DllRegisterServer()和DllUnregisterServer()分别用于控件在注册表的注册和注销,一般不需要对其进行改动。
应用程序类从COleControlModule继承。而COleControlModule有是从CWinApp派生,提供了初始化控件模块的功能。CSample68PropPage的基类是COlePropertyPage,CDialog类的派生类,主要负责对属性页中对图形界面下用户控件属性的显示。控件类CSample68Ctrl类是这几个类中比较重要的一个类,大部分实质性工作都在该类完成,其基类为COleControl,从CWnd和CCmdTarget继承,因此能够为控件对象提供与MFC窗口对象相同的功能同时也提供了一系列事件触发函数和一个分发映射表,使ActiveX控件能够同包容器程序有效地进行交互。该类的派生类将可以在满足特定的条件时向控件的包容器发送消息或是触发事件,以通知包容器程序在控件内有一些重要的事件发生。分发映射表是其中很重要的一个部分,负责向包容器程序暴露控件提供的方法和属性。图2展示了COleControl类在控件与包容器通信中所起的作用。可以看出,ActiveX控件与其包容器之间的所有通信过程都是由COleControl来完成的:

图2 COleControl在ActiveX控件与包容器通信中的作用
控件类对基类COleControl的OnDraw()函数进行了重载,向导生成了如下缺省代码,其作用是在控件的客户区绘制一个椭圆。在编程过程中通常要对其进行替换:

图3 插入ActiveX控件

图4 插入的待测试控件
对向导生成的代码进行编译后,将产生扩展名为ocx的ActiveX控件。ActiveX控件并不能独立运行,只能在包容器程序中才能够运行。通常,为了调试方便而多使用VC++附带的ActiveX Control Test Container工具以在测试阶段对ActiveX控件进行调试。在测试工具的客户区点击鼠标右键,并选中弹出菜单的"Insert New Control…"菜单项,将弹出图3所示的对话框,左侧的列表框中列出了当前系统中所有注册的ActiveX控件,选中要测试的控件并将其插入到测试程序即可通过"Control"菜单下的各菜单项对控件的方法、属性以及事件等进行测试。在位于下方的分割视图中将跟踪显示出调试记录(参见图4)。
通过"MFC ActiveX ControlWizard"向导可以非常容易的建立一个MFC ActiveX控件工程框架。按照默认的选项将建立如图1所示的工程结构:

图1 使用缺省选项建立的ActiveX控件工程结构
其中,_DSample68和_DSample68Events这两个接口将为客户程序提供本控件的属性、方法以及可能响应的事件。全局函数DllRegisterServer()和DllUnregisterServer()分别用于控件在注册表的注册和注销,一般不需要对其进行改动。
应用程序类从COleControlModule继承。而COleControlModule有是从CWinApp派生,提供了初始化控件模块的功能。CSample68PropPage的基类是COlePropertyPage,CDialog类的派生类,主要负责对属性页中对图形界面下用户控件属性的显示。控件类CSample68Ctrl类是这几个类中比较重要的一个类,大部分实质性工作都在该类完成,其基类为COleControl,从CWnd和CCmdTarget继承,因此能够为控件对象提供与MFC窗口对象相同的功能同时也提供了一系列事件触发函数和一个分发映射表,使ActiveX控件能够同包容器程序有效地进行交互。该类的派生类将可以在满足特定的条件时向控件的包容器发送消息或是触发事件,以通知包容器程序在控件内有一些重要的事件发生。分发映射表是其中很重要的一个部分,负责向包容器程序暴露控件提供的方法和属性。图2展示了COleControl类在控件与包容器通信中所起的作用。可以看出,ActiveX控件与其包容器之间的所有通信过程都是由COleControl来完成的:

图2 COleControl在ActiveX控件与包容器通信中的作用
控件类对基类COleControl的OnDraw()函数进行了重载,向导生成了如下缺省代码,其作用是在控件的客户区绘制一个椭圆。在编程过程中通常要对其进行替换:
void CSample68Ctrl::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); } |

图3 插入ActiveX控件

图4 插入的待测试控件
对向导生成的代码进行编译后,将产生扩展名为ocx的ActiveX控件。ActiveX控件并不能独立运行,只能在包容器程序中才能够运行。通常,为了调试方便而多使用VC++附带的ActiveX Control Test Container工具以在测试阶段对ActiveX控件进行调试。在测试工具的客户区点击鼠标右键,并选中弹出菜单的"Insert New Control…"菜单项,将弹出图3所示的对话框,左侧的列表框中列出了当前系统中所有注册的ActiveX控件,选中要测试的控件并将其插入到测试程序即可通过"Control"菜单下的各菜单项对控件的方法、属性以及事件等进行测试。在位于下方的分割视图中将跟踪显示出调试记录(参见图4)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了