VC++(十八)ActiveX控件

服务器应用程序
容器应用程序

ActiveX控件可以看成是一个极小的服务器应用程序

OCX是ActiveX控件的一种后缀名
典型的ActiveX控件,具有方法、属性、事件这三种特性
一个文件可以包含多个ActiveX控件.

我们常用的word就是一个容器应用程序,例如,若在word文档中可以嵌入或链接一个Excel表格对象,则这时的Excel就是服务器应用程序。 在双击word文档中嵌入或链接的这个Excel表格对象后,将启动Excel程序来完成对这个表格的编辑工作。Excel就是拥有这个表格对象的服务器应用程序,而word程序则是可以容纳这个表格对象的容器应用程序。另外,我们也可以在word文档中嵌入或链接一个Excel文档对象,因此对word来说,它不仅仅只是一个容器应用程序,同时它也是一个服务器应用程序。

MFC ActiveX ControlWizard生成3个类
CClockApp
CClockCtrl 消息映射、调度映射、事件映射
CClockPropPage

调度映射是指DISPATCH_MAP
这个是把你的成员方法映射到Invoke,使得脚本语言也能够使用你的接口。
事件映射是指EVENT_MAP
这个是自动生成一个连接点事件的方法(该方法是给你调用,由COM客户来实现),并发布该事件,是COM客户可以使用连接点订阅你的事件以得到相关通知

两个映射都可以用类向导生成

另外,读者可以看到在该工程中还有两项内容:_DClock和_DClockEvents,前面都有一个像平放着小勺一样的图标(),该图标表示对应的项是接口,接口是控件与外部程序进行通信的协议。
可以把接口看作是函数的集合,外部程序通过这个接口所暴露出来的方法去访问控件的属性和方法。
实际上,可以把接口看作是一个抽象基类,在此接口中定义的所有函数都是纯虚函数,这些函数的实现是在CClockCtrl类中完成的。MFC通过底层的封装,让CClockCtrl类继承自接口:_DClock,所以通过该接口调用的函数实际上是调用CClockCtrl类中真正实现的函数。
ActiveX控件中的接口与计算机机硬件的接口是类似的,例如,在计算机硬件中,主板与显卡间的通信是通过主板上的插槽完成的,这个插槽就是主板与显卡进行通信的接口,一旦我们制定了这个接口,就可以任意地选择一块主板与一块显卡进行通信。因为该接口是标准的,所以选择任一厂商生产的主板,任一厂商生产的显示都是可以的,只要它们的接口遵从共同的标准。主板通过该接口所暴露出来的方法去调用显卡的显示功能,而显卡需要实现该接口所暴露出来的方法。
显卡就相当于这里的ActiveX控件,而主板就相当于与控件通信的外部容器。如果两个通信实体要通过接口进行通信,那么肯定是其中的一个实体实现该接口所暴露出来的方法,而另一个实体通过接口调用这些方法。这里,就是ActiveX控件实现接口所暴露出来的方法,而容器调用这些方法。

这里,我们利用Build(F7)命令生成Clock控件程序,然后在该工程所在目录的Debug目录下,可以看到生成了一个Clock.ocx文件,这就是程序生成的ActiveX控件文件。在使用时,只需要将这个文件传递给使用方,经过注册后就可以使用该控件了。

ActiveX控件不能独立运行,它必须嵌入到一个容器中运行。
所有的ActiveX控件必须在注册后才能使用
生成ActiveX控件时,VC++编译器会调用regsvr32程序去注册clock控件。将该控件的所有信息,包括其所在路径,都写入注册表中。

invalidate函数,使窗口无效,这样就可以使窗口重绘。

属性
属性是由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构建的控件为了提供组件的方法,既可以使用双工接口,也可以使用定制接口。

事件前面多了一个source,这表明事件是一个源接口,这表明控件将用这个源接口向容器来发送通知事件,这个接口中实现的代码需要用户在容器上编写,而不是在控件内部。

控件上子定义属性设置的长期有效性:

对于自定义属性值,如果在VB程序中设置好了值后,关闭工程,当再次打开工程的时候,发现原先设置好的属性值没有被保存下来。

在CCtrl类中的DoPropExchange方法中提供了属性值保存的长期有效性,在其中可以调用以PX打头大方法让用户自定义的属性值长期有效。调用哪种PX打头的方法取决于自定义属性所对应的内部成员变量的类型,这里以PX_SHORT举例,第一个参数是DoPropExchange方法中参数指针,第二个参数是属性的外部名称,第三个是属性所对应的内部成员变量名称。第四个是属性的默认填充值。

还有一个问题,对于自定义的属性,发现如果在属性页中对属性值进行了修改,但在容器的对应属性框中该值没有相应的改变,但系统属性是可以的。在属性通知方法OnIntervalChanged内调用BoundPropertyChanged方法即可,参数是属性ID,可以在类视图中双击属性名称即可看到(id(XXX),XXX即为属性ID)。

检测容器的环境属性:

检测控件是在容器的运行模式

还是在设计模式下可调用方法:AmbientUserMode。关于ActiveX的详细学习可以参考MSDN中COleControl页,点击页面下方的ActiveX链接。

VC调用ActiveX控件:

方法一:直接在对话框上右键选择Insert ActiveX Control

方法二:菜单project->add to project->component and controls,选择已经注册的ActiveX控件。向导会自动添加一个关于控件的类,在该类中有ActiveX控件定义好的属性和方法,它Create方法可以动态创建一个ActiveX控件,其操作过程很动态创建button很类似。至于给控件添加事件,可以在控件上右键选择Event即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,852评论 6 13
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • 1、窗体 1、常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体。 ...
    Moment__格调阅读 4,477评论 0 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 今天去星宿喝了一杯水果茶,水果茶里面有西瓜苹果葡萄金桔。喝完好想上厕所˃̣̣̥᷄⌓˂̣̣̥᷅而且等等我要背着吉他回...
    XD8阅读 326评论 0 0