ActiveX控件(MFC篇)

Posted hanford

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ActiveX控件(MFC篇)相关的知识,希望对你有一定的参考价值。

1 VC++6.0创建控件    1

1.1 目标    1

1.1.1 方法    1

1.1.2 属性    1

1.1.3 事件    1

1.2 创建项目    2

1.3 项目结构    6

1.3.1 COM接口    6

1.3.2 COM    7

1.3.3 属性页    7

1.3.4 应用程序类    8

1.3.5 注册与注销    8

1.4 方法    9

1.4.1 增加    9

1.4.2 删除    11

1.5 属性    12

1.5.1 Text属性    14

1.5.2 Font属性    15

1.5.3 ColorText属性    16

1.5.4 LDownCount属性    17

1.6 事件    18

1.6.1 增加    18

1.6.2 删除    20

1.7 编码    20

1.7.1 COcxMFCCtrl添加三个成员变量    20

1.7.2 初始化成员变量    21

1.7.3 实现Show方法    21

1.7.4 实现属性存取    21

1.7.5 绘制控件    22

1.7.6 实现LDown事件    23

1.7.7 保存、恢复属性值    24

1.7.8 属性页    26

1.8 类型库    31

1.8.1 VC++6.0的一个BUG    32

1.9 控件注册与注销    32

1.9.1 命令    32

1.9.2 注册表    33

1.10 ProgID    37

1.10.1 处理重复    37

1.11 控件位图    38

1.12 AfxOleRegisterControlClass    39

2 VC++2010创建控件    41

2.1 创建项目    41

2.2 项目结构    44

2.3 增加方法    44

2.4 增加属性    47

2.5 增加事件    48

2.6 删除方法、属性、事件    50

3 VC++6.0使用控件    51

3.1 增加控件的操作    51

3.2 增加控件的实质    53

3.3 控件名称重复    54

4 VC++2010使用控件    56

4.1 增加控件    56

4.1.1 增加到对话框    56

4.1.2 增加到Toolbox    57

4.1.3 Toolbox里删除控件    58

4.2 生成包装类    59

4.2.1 直接生成    59

4.2.2 间接生成    60

4.2.3 包装类BUG    62

5 VB6.0使用控件    63

6 Office使用控件    64

 

 

1 VC++6.0创建控件

1.1 目标

本章的目标是使用MFC创建一个下图所示的ActiveX控件。

图1.1 ActiveX控件

1.1.1 方法

将给此控件增加一个方法:

void Show(BOOL bShow);

bShowTRUE 时,显示控件;

bShowFALSE 时,隐藏控件。

1.1.2 属性

属性名

Text

控件显示的文本

Font

控件显示文本的字体

ColorText

控件显示文本的颜色

ColorInner

椭圆内的颜色

ColorOuter

椭圆外的颜色

LDownCount

控件内,鼠标左键按下的次数

1.1.3 事件

鼠标左键在控件内部按下时,会产生LDown事件:

void LDown(BOOL bInner)

bInnerTRUE 时,表示鼠标在椭圆内;

bInnerFALSE 时,表示鼠标在椭圆外。

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"如果希望WordExcel……这些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 _DOcxMFCdispinterface _DOcxMFCEvents。前者用于客户端程序访问ActiveX控件;后者用于将控件内部的事件通知给客户端。

1.3.2 COM

COcxMFCCtrl是实现控件功能最重要的一个类,其基类依次为COleControlCWndCCmdTarget。它对应的是ocxMFC.odl文件中的coclass OcxMFC,其定义如下:

[ uuid(091AEC6D-3B16-4F1A-95FA-94E8C48E3366),

helpstring("OcxMFC Control"), control ]

coclass OcxMFC

{

[default] dispinterface _DOcxMFC;

[default, source] dispinterface _DOcxMFCEvents;

};

也就是说COMOcxMFC实现了COM接口_DOcxMFC_DOcxMFCEvents

客户端创建控件,首先要创建COMOcxMFC,其实就是实例化一个COcxMFCCtrl对象。获得COM接口_DOcxMFC之后,就可以访问控件了。控件产生的事件可以通过COM接口_DOcxMFCEvents传递给客户端。

1.3.3 属性页

下图是在Word文档中插入了一个日历控件,要想修改它的属性,如:显示的字体。可以鼠标右键单击控件,然后单击【日历对象】【属性】菜单项

图1.9 Word中修改ActiveX控件属性

Word将显示日历控件的属性页。可在此修改控件的属性。

图1.10 日历控件属性页

在图1.8中,COcxMFCPropPage可以实现属性页的一个页面。它的基类依次为COlePropertyPageCDialogCWnd

1.3.4 应用程序类

在图1.8中,应用程序类COcxMFCApp的基类依次为:COleControlModuleCWinApp。它提供了初始化控件模块的功能。

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::SetTextCOcxMFCCtrl::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属性的改变及控件显示的更新。

ColorInnerColorOuter属性与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 控件?

如何使用 MFC 以编程方式更改 ActiveX 控件的属性?

MFC设计器中的“无法访问ActiveX控件类型库”错误

如何使用 MFC 为 ActiveX 控件添加任何可重用接口?

如何在 MFC 对话框中替换/更新 ActiveX 控件

我可以编辑具有 x64 ActiveX 控件的 MFC 对话框吗?