什么是ActiveX控件:一个进程内服务器,支持多种的COM接口。(可以理解为,一个COM接口是一个纯抽象基类,你实现了它,并且它支持自注册,就是一个ActiveX控件了)
可以把ActiveX控件看做是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一起运行。
容器应用程序是可以嵌入或链接对象的应用程序。
服务器应用程序是创建对象并且当对象被双击时,可以被启动的应用程序。
我们常用的word就是一个容器应用程序,例如,若在word文档中可以嵌入或链接一个Excel表格对象,则这时的word就是服务器应用程序。 在双击word文档中嵌入或链接的这个Excel表格对象后,将启动Excel程序来完成对这个表格的编辑工作。Excel就是拥有这个表格对象的服务器应用程序,而word程序则是可以容纳这个表格对象的容器应用程序。另外,我们也可以在word文档中嵌入或链接一个 word文档对象,因此对word来说,它不仅仅只是一个容器应用程序,同时它也是一个服务器应用程序。
ocx是ActiveX控件文件的一种后缀名,但应该注意的是,ActiveX控件对应的文件也可以是其他后缀名,例如DLL 。
一个典型的ActiveX控件有三种特性:方法、属性、事件。
控件的宿主程序应该就是appWizard里可选择的三种类型,DLL,EXE,Service就是一什么形式发布。
自注册:向注册表中添加一系列注册表项和值的过程。(都是在HKEY_CLASSES_ROOT里)
属性页:属性页是控件的一个重要的功能。(实现属性页有明显的好处,试想在MFC里设计一个控件的属性时属性页多么的方便)属性页也是一个COM组件,由容器应用程序单独实例化。
属性的持续性:容器中的每个控件都有自己的属性值,如果容器关闭后还想维持属性的状态值,则这个控件要支持持续性。目前用于属性持续性的主要接口有:IPersistStream, IPersistStreamInit, IPersistPropertyBag三个。
控件容器有2种模式:设计时模式和运行时模式。它也是一个基于COM的组件。
(目前,ATL是写ActiveX控件的首选开发工具,开发任何COM应用都是如此)
可通过ActiveX控件的属性、事件和方法与ActiveX控件进行交互:
1:属性是指与控件相关的特性。
2:事件是由控件向容器传递的通知信息。
3:方法是指可通过IDispatch使用控件的一类函数。
属性
属性是由ActiveX控件和控件所在的客户端展示提供的。共有四种基本属性:
1、Ambient属性是由容器向控件提供的。为了适应需要,控件必须使用这些属性。常用的ambient属性有容器的背景颜色、默认字体以及前景色等。
2、extended属性是由容器实现的,但看起来是由控件生成的。例如,容器中各种各样控件的制表顺序便属于extended属性。
3、stock属性是由ActiveX控件开发工具实现的控件属性。Stock属性的例子有控件的字体、标题文本和前景色及背景色等。
4、custom属性是由用户实现的控件属性。
事件
事件是用于向控件的容器发送通知信息的。例如当点击鼠标或发生其他事件时,控件用事件通知容器。共有两种基本类型的事件:
1、 stock事件是由ActiveX控件开发工具实现的,可以像调用fireError等函数那样调用stock事件。
2、 custom事件是由用户实现的,尽管在实现过程中MFC和ATL类库以及Visual C++做了大量的工作。
方法
由ActiveX控件实现的方法类似于自动化中所述的自动化实现的方法。实际上,方法主要是使用IDispatch接口通过自动化来实现的。
用MFC构件的ActiveX控件总是通过IDispatch来提供它的方法,而用ATL构建的控件为了提供组件的方法,既可以使用双工接口,也可以使用定制接口。