MFC ActiveX 控件

ActiveX 控件是基于组件对象模型 (COM) 的可重用软件组件,支持各种 OLE 功能,并且可以进行自定义来满足多种软件所需。

重要

ActiveX 是旧技术,不应用于新开发。 有关详细信息,请参阅 ActiveX 控件

在普通的 ActiveX 控件容器中和万维网页面中的 Internet 上均可使用 ActiveX 控件。 可以使用此处所述的 MFC 或活动模板库 (ATL) 来创建 ActiveX 控件。

ActiveX 控件可以在自己的窗口中绘制自身,响应事件(如鼠标单击),并通过包含类似于自动化对象中的属性和方法的接口进行管理。

可以针对许多用途(例如数据库访问、数据监视或绘图)开发这些控件。 除了可移植性之外,ActiveX 控件还支持以前 ActiveX 控件所不具备的功能,例如与现有 OLE 容器的兼容性,以及将其菜单与 OLE 容器菜单集成的功能。 此外,ActiveX 控件完全支持自动化,使控件能够公开读/写属性和一组可由控件用户调用的方法。

你可以创建无窗口 ActiveX 控件,以及只在处于活动状态时创建窗口的控件。 无窗口控件可加快应用程序的显示速度,并使透明和非矩形控件成为可能。 你还可以异步加载 ActiveX 控件属性。

ActiveX 控件被实现为一个进程中服务器(通常是一个小型对象),可以在任何 OLE 容器中使用。 请注意,只有在设计为能够感知 ActiveX 控件的 OLE 容器中使用时,ActiveX 控件的完整功能才可用。 有关支持 ActiveX 控件的容器列表,请参阅将 ActiveX 控件移植到其他应用程序。 此容器类型(以下称为“控件容器”)可以使用控件的属性和方法来操作 ActiveX 控件,并从 ActiveX 控件接收事件形式的通知。 下图演示了这种交互。

Interplay of ActiveX control container and control.
ActiveX 控件容器与有窗口的 ActiveX 控件之间的交互

有关优化 ActiveX 控件的一些最新信息,请参阅 MFC ActiveX 控件:优化

若要创建 MFC ActiveX 控件,请参阅创建 ActiveX 控件项目

有关详细信息,请参阅:

ActiveX 控件的基本组件

ActiveX 控件使用一些编程元素与控件容器和用户进行高效交互。 它们是类 COleControl、一组事件触发的函数和一个调度映射。

你开发的每个 ActiveX 控件对象都会从其 MFC 基类 COleControl 继承一组强大的功能。 这些功能包括就地激活和自动化逻辑。 COleControl 可以为控件对象提供与 MFC 窗口对象相同的功能,以及触发事件的功能。 COleControl 还可以提供无窗口控件,这些控件依赖于其容器来帮助实现窗口提供的一些功能(鼠标捕获、键盘焦点、滚动),但提供更快的显示。

由于控件类派生自 COleControl,它继承了在满足某些条件时向控制容器发送(或触发)消息的功能,这些消息被称为事件。 这些事件被用来在控件中发生重要的事情时通知控件容器。 通过将参数附加到事件,你可以将有关事件的更多信息发送到控件容器。 有关 ActiveX 控件事件的详细信息,请参阅 MFC ActiveX 控件:事件一文。

最后一个元素是调度映射,它用于向控件用户公开一组函数(称为方法)和特性(称为属性)。 属性让控件容器或控件用户能够以各种方式操作控件。 用户可以更改控件的外观、更改控件的某些值或发出控件请求,例如访问控件维护的特定数据。 此接口由控件开发人员确定,是使用“类视图”定义的。 有关 ActiveX 控件方法和属性的详细信息,请参阅文章 MFC ActiveX 控件:方法属性

控件与 Windows 和 ActiveX 控件容器之间的交互

当控件在控件容器中使用时,它使用两种机制进行通信:公开属性和方法,以及触发事件。 下图演示了这两种机制是如何实现的。

ActiveX control communicates with its container.
ActiveX 控件容器与 ActiveX 控件之间的通信

上图还说明了其他 OLE 接口(除自动化和事件以外)是如何由控件处理的。

控件与容器的所有通信都由 COleControl 容器执行。 为了处理容器的一些请求,COleControl 将调用在控件类中实现的成员函数。 所有方法和某些属性以这种方式处理。 控件的类还可以通过调用 COleControl 的成员函数来启动与容器的通信。 事件以这种方式触发。

ActiveX 控件的活动和非活动状态

控件有两种基本状态:活动状态和非活动状态。 传统上,通过查看控件是否有窗口来区分这两种状态。 活动控件有一个窗口;非活动控件没有窗口。 引入无窗口激活功能后,这种区分方式不再通用,但仍适用于许多控件。

无窗口控件处于活动状态时,它会从其容器调用鼠标捕获、键盘焦点、滚动和其他窗口服务。 此外,你还可以向非活动控件提供鼠标交互,以及创建等待激活以创建窗口的控件。

当具有窗口的控件变为活动状态时,它可以与控件容器、用户和 Windows 完全交互。 下图演示了 ActiveX 控件、控件容器和操作系统之间的通信路径。

Msg processing in active windowed ActiveX control.
有窗口的 ActiveX 控件中的 Windows 消息处理(活动时)

序列化

序列化数据(有时称为持久性)的功能允许控件将其属性的值写入持久性存储。 然后,可以通过从存储中读取对象的状态来重新创建控件。

请注意,控件不负责获取对存储介质的访问权限。 相反,控件的容器负责为控件提供要在适当的时间使用的存储介质。 有关序列化的详细信息,请参阅 MFC ActiveX 控件:序列化一文。 有关优化序列化的信息,请参阅“ActiveX 控件:优化”中的优化持久性和初始化

安装 ActiveX 控件类和工具

当你安装 Visual C++ 时,如果安装程序中选择了 ActiveX 控件(默认情况下会选择),则会自动安装 MFC ActiveX 控件类以及零售和调试 ActiveX 控件运行时 DLL。

默认情况下,ActiveX 控件类和工具安装在 \Program Files\Microsoft Visual Studio .NET 下的以下子目录中:

  • \Common7\Tools

    包含测试容器文件(TstCon32.exe 及其帮助文件)。

  • \Vc7\atlmfc\include

    包含使用 MFC 开发 ActiveX 控件所需的 include 文件

  • \Vc7\atlmfc\src\mfc

    包含 MFC 中特定 ActiveX 控件类的源代码

  • \Vc7\atlmfc\lib

    包含使用 MFC 开发 ActiveX 控件所需的库

另外,还有 MFC ActiveX 控件的一些示例。 有关这些示例的详细信息,请参阅控件示例:基于 MFC 的 ActiveX 控件

另请参阅

用户界面元素