ActiveX控件(MFC篇)
Posted hanford
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ActiveX控件(MFC篇)相关的知识,希望对你有一定的参考价值。
目录
1.12 AfxOleRegisterControlClass 39
第1章 VC++6.0创建控件
1.1 目标
本章的目标是使用MFC创建一个下图所示的ActiveX控件。
图1.1 ActiveX控件
1.1.1 方法
将给此控件增加一个方法:
void Show(BOOL bShow);
当bShow为TRUE 时,显示控件;
当bShow为FALSE 时,隐藏控件。
1.1.2 属性
属性名 |
说明 |
Text |
控件显示的文本 |
Font |
控件显示文本的字体 |
ColorText |
控件显示文本的颜色 |
ColorInner |
椭圆内的颜色 |
ColorOuter |
椭圆外的颜色 |
LDownCount |
控件内,鼠标左键按下的次数 |
1.1.3 事件
鼠标左键在控件内部按下时,会产生LDown事件:
void LDown(BOOL bInner)
当bInner为TRUE 时,表示鼠标在椭圆内;
当bInner为FALSE 时,表示鼠标在椭圆外。
1.2 创建项目
运行VC++6.0,新建"MFC ActiveX ControlWizard"项目,如下图所示。配置好项目名称、项目目录后,单击"OK"按钮。
图1.2 新建ActiveX项目
VC++6.0显示创建ActiveX控件的向导,界面如下图所示。
"How many controls would you like your project to have"用来设置本项目里有几个ActiveX控件。这里取默认值1。
"runtime license"表示运行时是否需要授权,这里取默认值"No runtime license",即运行时无需授权。
"Would you like source file comments to be generated?"表示代码里是否生成形如"//TODO"这样的注释。这里取默认值"Yes,please"。
"Would you like help files to be generated?"表示是否生成帮助文件,这里取默认值"NO help files"。
配置完成后,单击"Next"按钮。
图1.3 创建ActiveX控件——第一步
VC++6.0显示向导的第二步,界面如下图所示。
在OcxMFC这个下拉列表框内选择某个控件(上图有几个控件数,这里就有几个选项)。单击"Edit Names..."按钮,将显示图1.5所示的界面。用于编辑选中控件的名称。
"Activates when visible"表示控件显示时,将把焦点移到该控件上。
"Invisible at runtime"表示运行时,该控件不可见。
"Available in "Insert Object" dialog"如果希望Word、Excel……这些ActiveX容器能够插入该控件,请勾中此项。
"Has an "About" box"勾中此复选框,向导会给该控件增加AboutBox方法,客户端程序调用此方法时,将显示本控件的关于对话框。
"Acts as a simple frame control"设置控件为框架控件,亦即其它控件可以放在该控件内部。框架控件移动时,它内部的控件跟着一起移动。
"Which windows class,if any,should this control subclass"用于选择一个窗口类,控件将子类化这个窗口类。
单击"Advanced..."按钮,将显示图1.6所示的界面,用于配置高级选项。
这里不做任何改动,直接单击"Finish"按钮。
图1.4 创建ActiveX控件——第二步
图1.5 创建ActiveX控件——编辑名称
图1.6 创建ActiveX控件——高级选项
VC++6.0显示如下图所示。单击"OK"按钮,完成项目的创建。
图1.7 创建ActiveX控件确认界面
1.3 项目结构
下图是创建的项目结构
图1.8 项目结构
1.3.1 COM接口
_DOcxMFC和_DOcxMFCEvents这两个COM接口分别对应于ocxMFC.odl文件中的dispinterface _DOcxMFC和dispinterface _DOcxMFCEvents。前者用于客户端程序访问ActiveX控件;后者用于将控件内部的事件通知给客户端。
1.3.2 COM类
COcxMFCCtrl是实现控件功能最重要的一个类,其基类依次为COleControl、CWnd、CCmdTarget。它对应的是ocxMFC.odl文件中的coclass OcxMFC,其定义如下:
[ uuid(091AEC6D-3B16-4F1A-95FA-94E8C48E3366), helpstring("OcxMFC Control"), control ] coclass OcxMFC { [default] dispinterface _DOcxMFC; [default, source] dispinterface _DOcxMFCEvents; }; |
也就是说COM类OcxMFC实现了COM接口_DOcxMFC和_DOcxMFCEvents。
客户端创建控件,首先要创建COM类OcxMFC,其实就是实例化一个COcxMFCCtrl对象。获得COM接口_DOcxMFC之后,就可以访问控件了。控件产生的事件可以通过COM接口_DOcxMFCEvents传递给客户端。
1.3.3 属性页
下图是在Word文档中插入了一个日历控件,要想修改它的属性,如:显示的字体。可以鼠标右键单击控件,然后单击【日历对象】【属性】菜单项
图1.9 Word中修改ActiveX控件属性
Word将显示日历控件的属性页。可在此修改控件的属性。
图1.10 日历控件属性页
在图1.8中,COcxMFCPropPage可以实现属性页的一个页面。它的基类依次为COlePropertyPage、CDialog、CWnd。
1.3.4 应用程序类
在图1.8中,应用程序类COcxMFCApp的基类依次为:COleControlModule、CWinApp。它提供了初始化控件模块的功能。
1.3.5 注册与注销
在图1.8中,全局函数 DllRegisterServer 和DllUnregisterServer 分别用于控件的注册和注销。
当执行 regsvr32 ocxMFC.ocx 时将调用DllRegisterServer函数,往注册表里写入注册信息;当执行 regsvr32 /u ocxMFC.ocx 时将调用DllUnregisterServer函数,清除注册表里ocxMFC.ocx的注册信息。
这两个函数里,第一行代码均为:
AFX_MANAGE_STATE(_afxModuleAddrThis);
这说明:MFC创建的ActiveX控件,本质上是一个MFC Regular DLL。
1.4 方法
创建的项目中,已经有了一个方法AboutBox,调用此方法将显示该控件的关于对话框。其实现代码如下:
void COcxMFCCtrl::AboutBox() { CDialog dlgAbout(IDD_ABOUTBOX_OCXMFC); dlgAbout.DoModal(); } |
代码很简单,不过这里有意思的是:第一行代码不再是AFX_MANAGE_STATE(...);这说明:在调用此方法之前,MFC已经自动切换了模块状态。
1.4.1 增加
增加方法有两种途径:
1、鼠标右键单击"_DOcxMFC",然后鼠标左键单击弹出菜单中的【Add Method...】将显示图1.13所示的界面。注意:如果clw文件不存在,此方法会失败。请按下Ctrl+W创建clw文件之后再试一次。
图1.11
2、按下快捷键Ctrl+W,将显示类向导对话框。进入"Automation"页面,Class name请选择"COcxMFCCtrl",然后单击"Add Method..."按钮。也将显示图1.13所示的界面。
图1.12
下图就是"增加方法"的对话框:
External name 是客户端调用此方法时用到的名称;
Internal name 是本项目内部,此方法的名称;
Return type 是方法的返回值,这里选择void;
Parameter list 表示参数列表。这里只有一个参数 bShow
TRUE表示显示控件,FALSE表示隐藏控件。
方法有两种类型:Stock(库存)、Custom(自定义)。库存方法由COcxMFCCtrl的基类COleControl实现;自定义方法由COcxMFCCtrl编码实现。这里,Show是一个自定义方法。
图1.13 增加方法
1.4.2 删除
按下快捷键Ctrl+W,将显示类向导对话框。进入"Automation"页面。Class name请选择"COcxMFCCtrl"。然后在External names里选择要删除的方法或属性,单击"Delete"按钮即可删除选中项。最后请单击"OK"按钮。
下图中,External names列表中的"M"表示Method(方法);"C"表示Custom属性(自定义属性)、"S"表示Stock属性(库存属性)。
图1.14 删除方法
1.5 属性
删除属性与删除方法的操作相同,这里只说明如何增加属性。
增加属性有两种方法:
1、鼠标右键单击"_DOcxMFC",然后鼠标左键单击弹出菜单中的【Add Property...】将显示图1.17所示的界面。注意:此方法要求clw文件已存在。
图1.15
2、按下快捷键Ctrl+W,将显示类向导对话框。进入"Automation"页面,Class name请选择"COcxMFCCtrl",然后单击"Add Property..."按钮。也将显示图1.17所示的界面。
图1.16
下图就是"增加属性"的对话框。External name 是客户端调用此属性时用到的名称。
图1.17 增加属性
1.5.1 Text属性
下图是增加Text属性的界面。
注意:"Stock"单选框是可用的,说明COcxMFCCtrl的基类COleControl已经提供了Text属性。
选择"Stock"将表示Text是一个库存属性。它的存取完全由COleControl负责。
也可以选择"Get/Set methods",它将用COcxMFCCtrl::SetText和COcxMFCCtrl::GetText这两个函数,对Text属性进行存、取。也就是说,此时Text属性改由COcxMFCCtrl负责存取。
这里选择"Stock",单击"OK"按钮,完成Text属性的增加。这个Text属性就是一个库存属性。
图1.18 增加Text属性
1.5.2 Font属性
下图是增加Font属性的界面,它跟Text属性一样,也是库存属性。
图1.19 增加Font属性
1.5.3 ColorText属性
下图是增加ColorText属性的界面。关于它有几点需要说明:
1、"Stock"单选框不可用,意味着它不再是库存属性;
2、因为ColorText改变后,需要立即更新控件的显示,因此在这里选择了"Get/Set methods"。在COcxMFCCtrl::SetColorText函数里,完成ColorText属性的改变及控件显示的更新。
ColorInner、ColorOuter属性与ColorText属性的增加操作完全相同。
注意:下图虽然可以添加参数,但是添加参数后,属性将更改为方法。
图1.20 增加ColorText属性
1.5.4 LDownCount属性
下图是增加LDownCount属性的界面。改变这个属性,不用更新控件显示,因此没有必要再使用"Get/Set methods",可以使用"Member variable"。
注意:Notification function,它的默认名称为On*Changed,这里就是OnLDownCountChanged。客户端修改LDownCount属性时,将调用COcxMFCCtrl::OnLDownCountChanged函数。下图的Notification function为空,表示修改LDownCount属性时不会调用任何函数。
图1.21 增加LDownCount属性
1.6 事件
1.6.1 增加
增加事件有两种方法:
1、鼠标右键单击"_DOcxMFCEvents",然后鼠标左键单击弹出菜单中 以上是关于ActiveX控件(MFC篇)的主要内容,如果未能解决你的问题,请参考以下文章 如何使用 MFC 以编程方式更改 ActiveX 控件的属性?