MFC ActiveX (ocx)控件的开发

前言

ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。

ActiveX控件是一种实现了一系列特定接口而使其在使用和外观上更象一个控件的COM组件。ActiveX控件这种技术涉及到了几乎所有的COM和OLE的技术精华,如可链接对象、统一数据传输、OLE文档、属性页、永久存储以及OLE自动化等。

   ActiveX控件作为基本的界面单元,必须拥有自己的属性和方法以适合不同特点的程序和向包容器程序提供功能服务,其属性和方法均由自动化服务的 IDispatch接口来支持。除了属性和方法外,ActiveX控件还具有区别于自动化服务的一种特性--事件。事件指的是从控件发送给其包容程序的一 种通知。与窗口控件通过发送消息通知其拥有者类似,ActiveX控件是通过触发事件来通知其包容器的。事件的触发通常是通过控件包容器提供的IDispatch接口来调用自动化对象的方法来实现的。在设计ActiveX控件时就应当考虑控件可能会发生哪些事件以及包容器程序将会对其中的哪些事件感兴趣并将这些事件包含进来。与自动化服务不同,ActiveX控件的方法、属性和事件均有自定义(custom)和库存(stock)两种不同的类 型。自定义的方法和属性也就是是普通的自动化方法和属性,自定义事件则是自己选取名字和Dispatch ID的事件。而所谓的库存方法、属性和事件则是使用了ActiveX控件规定了名字和Dispatch ID的"标准"方法、属性和事件。

   ActiveX控件可以使COM组件从外观和使用上能与普通的窗口控件一样,而且还提供了类似于设置Windows标准控件属性的属性页,使其能够在包容器程序的设计阶段对ActiveX控件的属性进行可视化设置。ActiveX控件提供的这些功能使得对其的使用将是非常方便的。本文下面即以MFC为工 具对ActiveX控件的开发进行介绍。

一、创建项目

1.打开VS2008新建MFC项目。这里我们取名为“ActiveXDemo” 。

2.输入项目名称为“ActiveXDemo”和项目位置。

点击确定进行下一步。

3.运行时许可证默认不勾选。

如果勾上,生成时会多出一个文件.lic , 只有拥有许可的用户才可以调用ocx插件。继续下一步。

4.完成创建控件项目自动创建好MFC ActiveX程序框架。

其中 的 ACtiveXDemoApp 是 我 们 这 个 控 件 的 主 程 序 模 块 , 定 义 了 控 件的 注 册

( DllRegisterServer)、删除(DllUnregisterServer)等功能,一般不用动,如有需要我们可以

在其中的 InitInstance 和ExitInstance 中定义我们自己的初始化和终止操作代码,一般也就是一些资源的初始化和销毁工作。

CActiveXDemoCtrl 是控件类,我们要做的控件功能基本上就是要在这个类中实现。

需要提一下的是在这个类中重写了父类的 OnDraw 函数,有如下两句代码:

pdc->FillRect(rcBounds,

CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));

pdc->Ellipse(rcBounds);

也就是在控件上画了一个椭圆, 实际控件开发中可以根据功能需要修改重写这个函数来

绘制控件界面。

CActiveXDemoCtrlPropPage 是属性页类,这个类实现了一个在开发时设定控件属性的对话

框。

ActiveXDemoLib 是为客户程序提供本控件的属性、方法以及可能响应的事件的接口的。

二、添加属性,方法和事件

1.属性

属性是ACTIVEX控件想所有容器公开的数据成员。 如下图右键添加属性,属性变量类型我们选LONG,变量名为TimeStyle,其他默认。

2.方法 方法就是控件开放给用户使用的一些功能函数,类似于C++的类函数。开发人员可以提供自定义功能。 如下图所示我们添加一个方法Start(),其他默认。

如下图所示,我们可以从类视图清楚的看到我们添加的属性和方法名。

3.事件

ACTIVEX通过事件通知容器控件上发生了某些事情。将控件开发人员的某一特定操作识别为事件。 如下图所示,我们添加事件,添加事件顺序按照如图所示。事件名我们写OnSend ,内部名称习惯上修改为FIleOnSend.添加一个参数lpstrTime.

如下图,我们可以清楚地看到我们刚才添加的事件

在start 事件中我们调用showcurrenttime 函数,函数实现已经给出。接着我们回调事件函数。

三、注册与反注册

1.唯一标识ID 如下图Classid 是该控件的唯一标识,这个我们可以在注册表里找到。

2.注册

命令行输入regsvr32 控件路径XXX

3.反注册

反注册控件regsvr32  -u  控件路径XXX

到此我们OCX 控件制作就完成了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏蔡述雄的专栏

包学会之浅入浅出Vue.js:结业篇

本篇我们会详细分析下如何完成由多个组件组成一个复用组件的开发流程。

19.1K32
来自专栏前端达人

用 React 构建可复用的设计系统

React 让 web 开发简化了很多。原则上 React 基于组件的模式让代码分解和复用变得更加容易。 然而,开发者并不总是清楚如何跨项目分享他们的组件。在这...

1233
来自专栏河湾欢儿的专栏

React入门

React 是一个用于构建用户界面的 JAVASCRIPT 库。 起源: React 起源于 Facebook 的内部项目,因为该公司对市场上所有 Java...

1421
来自专栏搞前端的李蚊子

基于Vue.js的大型报告页项目实现过程及问题总结(二)

距离上一篇文章过去了二十多天了,期间一直想把第二部分写完,结果在测试过程中遇到了各种坑爹的问题,到今天才算基本完成,也许还有后续,但趁着今天有时间就写出来吧,也...

44210
来自专栏QQ会员技术团队的专栏

深入理解React(二) :数据流和事件原理

在React中,数据流是自上而下单向的从父节点传递到子节点,所以组件是简单且容易把握的,他们只需要从父节点提供的props中获取数据并渲染即可。如果顶层组件的某...

4.6K0
来自专栏用户2442861的专栏

Chrome开发者工具不完全指南:(三、性能篇)

 卤煮在前面已经向大家介绍了Chrome开发者工具的一些功能面板,其中包括Elements、Network、Resources基础功能部分和Sources进阶功...

1372
来自专栏Danny的专栏

&nbsp在IE和FireFox中显示不一致

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

973
来自专栏数据小魔方

动态图表9|组合框(名称管理器)

今天要跟大家分享的是动态图表9——组合框(名称管理器)! 其实看过最近8篇推送的小伙伴儿大概都能看出来了,我所讲的动态图表制作技巧是沿着这样的思路来的: 数据有...

3948
来自专栏前端说吧

CSS-自定义高度的元素背景图如何自适应以及after伪类在ie下的处理

3298
来自专栏Crossin的编程教室

Python的门面担当

在大多数时候,我们都在黑黢黢的控制台里执行 Python 脚本。这看起来很酷很 GEEK。但对于部分场景下的用户来说,这样就不大美观和人性化了:我们需要交互更方...

2114

扫码关注云+社区

领取腾讯云代金券