ActiveX深入浅出(一)

active|activex

纲要

    可以这样说,Active平台代表了Microsoft的世界观。使用ActiveX控件,来构筑包括从与用户交互和适应COM的事务处理监视器,到Web服务器,全部实现自动化的机构,这就是Microsoft的打算了。桌面用的、基于COM的组件叫做ActiveX控件。所谓ActiveX控件不过是遵从一定的标准、与客户端交互的COM对象而已。基于组件的应用开发,其方法和组装电子装置一样,可以用已制作好的组件部件来构筑应用。这确实是一项很令人神往的技术。虽然说起来高深,但随着ActiveX的广泛应用,越来越多的编程工具都支持创建ActiveX控件了。这其中就包括了VB。在VB中设计一个ActiveX并不比一个普通的VB应用程序难上许多。这篇文章,就是一步步教你如何在VB中创建一个ActiveX控件。

ActiveX深入浅出(一)
作 者 : 扬眉

   什么是ActiveX控件?

   一个简单的回答就是:拥有图形界面的类。你可能曾经用过类来编程,那是一种实现代码重用的的好方法。当然,它也提供了很多其它的好处,这儿并不打算一一列举出来。ActiveX 控件将这个概念近一步的深化了,能够让你编写一个窗口小部件(widget),然后把它打包起来,在以后的程序里用到它,或者作为特定的问题的解决方法,给程序员提供更简便的编程方法。 用ActiveX你可以建造“复合式”控件,由其它的几种控件组合而成。也就是说,在ActiveX控件中你不但可以使用VB中诸如文本框,图片框之类的普通控件,你还可以用其它的ActiveX控件来构成你自己的控件,实现你想要的功能,并把它打包以背后用。

   ActiveX控件的组成

   一个ActiveX控件由它的一些成员组成:属性,方法以及事件。它们之间有什么样的逻辑关联呢?还是用我们的身体来做个例子吧,将身体就看成一个ActiveX控件。 这个控件首先应该有一些属性,比如:眼是否睁开属性。显然,这个属性值应该有两种情况:开或则闭。使用的时候能够告诉“身体控件”让这个属性换一个新的值,以决定睁眼或者闭眼,或者得到当前的属性值,以知道目前的身体状况。

   方法是控件中过程和函数的统称,同其它任何的VB函数和过程并没有什么不同,你同样可以向它们传递参数,并返回想要的值。假设有一个类描叙了身体这个对象,它应该有“Look”这个方法,并且应该能接受“Direction”这个参数,那么,这个方法就应该写成这样:

   Public Sub Look(Direction As Integer)
   Select Case Direction
   Case 0
   '向左看
   Case 1
   '向右看
   Case 2
   '向前看
   Case 3
   '向后看
   End Select
   End Sub

   若要求返回值,我们就举一个“读”的例子吧。这时你必须把“Read”这个方法声明成函数而不是过程   :
   Public Function Read() As String
   '读的一些操作
   Read = "Hello from the World"
   End Function

   在身体控件中,我们用的还是“Look”这个方法。当调用这个方法的时候,就是指定眼睛应该去“看”了。同样,我们还指定了另外一个方法,“Read”。这一个方法将用来返回看到的东西。

   “方法”这个概念是不是很简单呢?如果你还不能够理解,也可以这样来想:你的控件就像是一台机器,你拨动控制开关(输入参数),转动把手(调用方法),然后机器的灯闪动,运行起来(执行方法),最后从机器里蹦出一些东西(返回值),就是这样了。但等等……如果你的机器想告诉你什么事情,它该怎么做呢?这时就该是“事件”出场了。

   最后,身体控件还会提供一个“眨眼”的事件,用来在进行眨眼这个动作的时候,通知开发者发生了这个事件,但是不必知道身体内部的工作方式和为什么这个事件会被触发。

   来动手吧,作一个控件。不要以为作一个控件是非常难的事,虽然它和一般应用程序的编写是有一点不同的地方。在上面我们已经知道,一个ActiveX控件是由属性,方法和事件组成的,我们先看看如何在程序中实现这些东西,然后再把它们联系起来,组合成一个右机的整体。属性最简单的形式是用public声明的公用变量。例如,如果把下面这段代码放到你的控件工程的声明部分:

   Public EyeOpen As Boolean

   这样,你就可以在后边的代码中使用这个属性了。但是,这种属性所能够做的事实在太少了。它几乎是不能够正常工作的。因为在程序的设计期间,属性值的任何变化都必须通知Visual Basic,以便把控件实例标记为需要保存。而又因为属性值可能显示在多个地方,因此当属性值发生改变时必须通知开发环境,以便使它能够同步显示“属性”窗口、“属性页”对话框等位置上的属性值。

   上面说的是不是有点难理解呢?要是不明白说的什么,不要急,你先打开一个工程,添加一个控件,试着改改这个控件的一些属性,在来看看上面的话,是不是明白了呢?我们现在的任务,就是要作一个这样的控件啊。由此可以看出,控件编程和一般的编程还是有一些区别的。那么,该怎么实现数行呢?这要使用到属性过程。

   当一个属性值被引用或者设置的时候,属性过程自动的被调用。下面我们就来添加一个这样的属性:打开代码窗口,再点击“工具”菜单,选择“添加过程”子菜单,弹出的对话框中,填入过程名“EyeOpen”,然后再把类型设置为“属性”。当你点了确定之后,VB自动的为你创建了一个属性过程的原型,代码会被添加到代码窗口中:

   Public Property Get EyeOpen() As Variant

   End Property

   Public Property Let EyeOpen(ByVal vNewValue As Variant)

   End Property

   剩下的你要做的,是写入属性处理代码,把这个骨架填满。

   你可以看到,VB实际上为你写了两个,“Get”和“Let”属性过程,有点疑惑吗?实际上很简单:“Get”是当属性值被引用的时候调用的过程,而“Let”则是当属性值被写入的时候调用的。(事实上还有第三种类型的过程,我们将在后面遇到,这里先提个醒)要让一个属性过程能够正确的工作,必须还要有一个变量来保存真正的属性值。把下面这一行添加到声明部分:

   Private m_EyeOpen As Boolean

   注意到那个'm_'前缀,一般是放在用户控件的内部变量之前。 现在该是填充过程框架的时候了。先看看Let过程,这个过程带有一个参数:缺省的是名字是vNewValue,variant类型。但我们想要一个布尔类型的变量而不是variant,因为眼睛在我们的模型中只有开和闭两种状态。所以把这个参数改成“New_EyeOpen As Boolean”。如果你想要这个属性作为只读属性出现,那么就不要再改动Let过程,让过程体空在那儿。否则,当想要设置这个属性值的时候,应该执行这样的代码:

   Public Property Let EyeOpen(New_EyeOpen As Boolean)

   m_EyeOpen = New_EyeOpen

   PropertyChanged "EyeOpen"

   '后面还可以写一些相关的代码,对属性的设置做出反应

   End Property

   当要在程序中写入属性值的时候,就会调用这个函数,先把属性值保存在一个私有变量里面,然后执行PropertyChanged这个内部方法,它用来告诉Visual Basic属性值有了变化,并触发一个WriteProperties事件。关于这一点的具体的内容,在后面还会提到。

   而Get过程更为简单!它和标准函数没有两样:

   Public Property Get EyeOpen() As Boolean

   EyeOpen = m_EyeOpen

   End Property

   做完这些就完了吗?不!忘了前面说的属性值是需要保存的,因此当编程会话发生转换的时候,它们能够保持下来。那么怎么样来保存和取出属性值呢?这时就要用到PropertyBag对象了。

   使用PropertyBag

   PropertyBag对象包含两个方法:一个用来读出,一个用来写入。前面提到了,当任何的属性发生变化得时候,会触发控件的WriteProperties事件。这时就可以把属性值保存在属性包中了。下面的代码实现这个功能:

   PropBag.WriteProperty "EyeOpen", m_EyeOpen, True

   PropBag是PropertyBag对象的一个实例。WriteProperty函数包含三个参数,第一格是属性名称,后面的是要保存的值,最后的参数是在无用户定义属性的情况下,将写入的默认值。把这个和ReadPropertiy方法的默认值设置结合起来,就可以为属性值设置缺省值了。如果属性值和缺省值相同,那么属性值就不会真正的别保存。当要读出的时候,ReadProperty函数发现在属性包中没有内容,就会返回缺省值。这样可以节省一些系统开销。要注意的是:必须将一个成员属性的名称作为字符串传递。当你将控件作国际化处理时,不要改变这一字符串的名称,它必须与该属性的申明的名称相匹配。

   当控件被重启动后,你必须重载如所有保存的属性值。当每次读取PropertyBag中的数据时, ReadProperties事件被触发。在这个事件的处理过程中,你要做的任务就是载入保存在属性包中的属性值,调用ReadProperty函数来实现值一点。要注意的是:在读和写两个函数中的缺省值设置要一样。例如:

   m_EyeOpen = PropB

时间: 2024-08-02 22:35:33

ActiveX深入浅出(一)的相关文章

ActiveX深入浅出(二)

active|activex What an Event 事件是用来通知使用控件的程序员,某件事情发生了,好让程序员可以相应的处理.事件在VB编程中比比皆是,例如,当鼠标点击控件事会发生Click事件,文本框内容改变了会发生Change事件,等等.但这儿要讲的不同于这些东西,也不同于InitProperties, ReadProperties, WriteProperties前面提到过的事件,那些是系统已经定义好了的.我们要做的是定义自己的事件.自定义的事件必须声明在模块的声明部分,然后就能够在

深入浅出VC++串口编程之第三方类

串口类 从本系列文章可以看出,与通过WIN32 API进行串口访问相比,通过MScomm这个Activex控 件进行串口访问要来的方便许多,它基本上可以向用户屏蔽多线程的细节,以事件(发出 OnComm消息)方式实现串口的异步访问. 尽管如此,MScomm控件的使用仍有诸多不便,譬如其发送和接收数据都要进行VARIANT类 型对象与字符串的转化等.因此,国内外许多优秀的程序员自己编写了一些串口类,使用这 些类,我们将可以更方便的操作串口.在笔者的<深入浅出Win32多线程程序设计之综合实例 >

如何在ActiveX控件中使用字体

字体的使用是ActiveX控件制作过程中不可缺少的部分.本文将深入浅出地介绍在ActiveX控件中制作过程中如何使用字体.本文所提及的ActiveX控件制作是指利用VC++6.0的MFC ActiveX ControlWizard 工具,用其它方法制作 ActiveX 控件本文不作讨论. 本文专门设置了一些例程,以便您能够更好地掌握这些内容.这些例程都是完整的ActiveX控件制作源代码.为了突出重点,本文仅对字体使用相关部分的源代码作较详细的介绍,其余部分的代码本文不作过多讨论.字体作为一种属

使用回调接口实现ActiveX控件和它的容器程序的通讯

本文阅读基础:有一定的C++基础知识(了解继承.回调函数),对MFC的消息机制有一定了解,对COM的基础知识有一定了解,对ActiveX控件有一定了解. 一. 前言      ActiveX控件和它的容器程序如何通讯是一个值得研究的问题,因为这涉及到ActiveX控件和它的容器程序如何交互的问题.VC知识库的杨老师写了一系列博客介绍了一些通讯方式.链接如下: COM 组件设计与应用(十三)--事件和通知(VC6.0) COM 组件设计与应用(十四)--事件和通知(vc.net) COM 组件设计

深入浅出Win32多线程设计之MFC的多线程-线程与消息队列(经典)

1.创建和终止线程 在MFC程序中创建一个线程,宜调用AfxBeginThread函数.该函数因参数不同而具有两种重载版本,分别对应工作者线程和用户接口(UI)线程. 工作者线程 CWinThread *AfxBeginThread( AFX_THREADPROC pfnThreadProc, //控制函数 LPVOID pParam, //传递给控制函数的参数 int nPriority = THREAD_PRIORITY_NORMAL, //线程的优先级 UINT nStackSize =

如何用c#来制作一个activeX控件或类似的东西

active|activex|控件 Q cat: 操作系统: 2000/xp 编程工具: vs.net 2003 /c# 问题: 我想制作一个activeX控件或类似的东西,有用户界面的,然后想在ie中使用,通过Vbscript与其进行数据交换,在以前好像可以使用vb就能做到,但是现在是vs.net 2003企业版,好像已经进化了,activeX成了老的技术,那vs.net如何解决这种类似的问题?如果要使用c#来编程的话,具体如何操作?还要有界面. A回答: 在C#中和ActiveX控件对应的是

ActiveX控件注册的几种方法

本文中的程序原为VC++所编写,略改动一些,将程序用C++Builder编写. ActiveX控件是一个动态链接库,是作为基于COM服务器进行操作的,并且可以嵌入在包容器宿主应用程序中,ActiveX控件的前身就是OLE控件.由于ActiveX控件与开发平台无关,因此,在一种编程语言上开发的ActiveX控件可以无须作任何修改,即可在另一种编程语言中使用,其效果如同使用Windows通用控件一样.如:在VC++中开发的ActiveX控件,不作任何修改即可应用于VB中.由此可见,通过使用Activ

在C++中用ActiveX控件显示PDF文件

PDF介绍 PDF是"Portable Document Format 可移植文档格式"的缩写,它是Adobe公司开发的一种电子文档格式,已经成为国际通用的电子文档交换事实标准.PDF文件可以在各种平台下阅读.编辑.发布.该文件格式支持字体.图像.甚至任何附件的嵌入. Adobe公司提供了两种软件用于处理PDF文档,分别是Acrobat及Acrobat Reader:前者功能强大,不仅能阅读,还可以创建或编辑PDF文档,但要收费:后者只具备阅读功能,为免费软件. 用ActiveX控件显

activex-JSP页面用js调用ActiveX使用摄像头

问题描述 JSP页面用js调用ActiveX使用摄像头 这是一个VB程序,调用了一个TesoSeeu.ocx打开摄像头拍照的程序http://pan.baidu.com/s/1sjyyo0H 现在我想在JSP页面上使用这个ocx,可以吗? 求各位大神给一个例子 这个ocx好像是拍照后把数据保存在内存,js没法调用了吧? 解决方案 可以,不过需要预先安装这个控件到客户端计算机,并且在浏览器的安全设置中允许.而且不是所有浏览器都支持ocx,只能用IE或者兼容的浏览器. 解决方案二: 控件有暴露接口给