| | 首页 | 文章中心 | 下载中心 | 本站特供 | 软硬件结合论坛 | | |
![]() | |
| 您现在的位置: 中国软硬件结合技术网 >> 文章中心 >> 软件技术 >> C++程序设计 >> 正文 |
|
|||||
| VC6开发环境的一般使用(下) | |||||
| 作者:quancheng 文章来源: 点击数: 更新时间:2005-10-16 | |||||
使用ActiveX控件上一讲中我们了解了VC6的组件库,并学习了在自己的工程中添加VC组件的方法。我们知道,VC组件实际上是进行源代码重用的方式之一,除了源代码级的重用外,还有二进制级的代码重用,即要重用的目标代码实际上是经过了编译和连接后形成的机器指令,通常情况下我们不知道这些代码的内部是如何实现的,也不能对它们进行修改,但我们能够按照一定的规则来调用它们。在Windows平台之上,最为常见的二进制级代码重用方式就是使用ActiveX控件了,由于Schedule没有用到ActiveX控件,所以我准备在本讲座的最后一讲中介绍一下在VC6中使用ActiveX控件的方法。 l 什么是ActiveX控件? 说起ActiveX控件,就不能不提到COM,COM是Component Object Model的缩写,即组件对象模型,这是由微软开发的跨平台组件编程技术,它定义了一种统一的接口调用方式,从而使得COM组件(注意,这与上一讲介绍的VC组件可是不同的概念了)能够独立于编程语言和操作系统平台,并解决了长期困扰软件开发的版本冲突问题。COM技术非常基础,微软在它的上面开发出了一系列的编程技术,这些编程技术被统称为OLE,现在已改称为ActiveX技术了。ActiveX控件就是ActiveX技术的一种,以前也叫做OLE控件,在VC中还常被称为OCX控件,这是因为它一般都存放在扩展名为.OCX的文件中。 ActiveX控件本质上是一种小型的OLE自动化服务器,它提供了(正式的术语称为Expose,即暴露)一些函数和数据供客户程序来使用,这些函数和数据也就是常说的方法(Methods)和属性(Properties),客户程序通过调用方法,设置属性来控制和使用ActiveX控件,这些客户程序一般被称为自动化控制器,或者容器应用程序。ActiveX控件在特定条件下还会产生事件(Events,相当于Windows编程中的通知消息),以便通知客户程序当前发生了什么事情,对ActiveX控件进行编程实际上就归结成如何使用它的方法、属性和事件。 相对于整套ActiveX技术而言,ActiveX控件使用起来要简单得多,我们可以非常轻松地把一个ActiveX控件添加到自己的程序中,免去了自己重新实现该控件已经实现的一些功能,从而可以大大缩短软件开发的周期,另外,微软已把Windows系统的很多功能封装成了ActiveX控件,Visual Studio 6也提供了数十个ActiveX控件,在使用VC6进行数据库编程时,要使用的远程数据控件也是一个ActiveX控件,因此我们有必要学会如何使用ActiveX控件。 l 向工程添加ActiveX控件 由于ActiveX控件具有很多优点,目前在Windows编程和Internet应用中,ActiveX控件得到了越来越广泛的应用。VC、VB、Delphi等可视化编程工具均支持ActiveX控件,但相对于VB和Delphi而言,在VC中使用ActiveX控件要稍微复杂一些。 为了在MFC工程之中使用ActiveX控件,我们在利用AppWizard生成程序框架时,应在第二步(基于对话框的程序)或第三步(单文档或多文档程序)中选中“ActiveX Control”。如果在生成工程时没有选择该项,过后又需要使用ActiveX控件,那么可以在APP类的InitInstance()成员函数中调用一次AfxEnableControlContainer()函数,并在StdAfx.h中包含头文件afxdisp.h,以便让程序能够容纳并控制ActiveX控件。 多数情况下,我们把ActiveX控件放入到一个对话框模板之中来使用,另外也可以在程序运行过程之中动态创建ActiveX控件的实例,这两种方法都需要首先把ActiveX控件添加到工程之中。添加ActiveX控件与添加VC组件是类似的,同样从Project\Add to Project菜单下面选择“Components and Controls”,然后在弹出来的对话框中双击文件列表中的“Registered ActiveX Controls”子目录,就会看到许多指向已在系统中注册了的ActiveX控件的快捷方式,我的机器上大概有140个左右,这些快捷方式也都是由VC6临时生成的,其中名字里包含有Microsoft和Version 6.0字样的就是由Visual Studio 6引入的ActiveX控件。 图20-1:为ActiveX控件选择类 在一般情况下我们都接受所有的类,并根据需要改变存放这些类的头文件和CPP文件的名字。如果我们对某些ActiveX控件相当熟悉了,并且明确知道不会用到其中一些C++类,那么可以选择不生成它们,以减少部分源代码,如果以后又需要使用这些类,仍然可以通过上面的步骤将之添加进来。 添加完毕之后,类视图中就会显示出所有新添加的类,查看这些类的定义可以发现,其中绝大多数成员函数都只是简单地调用了InvokeHelper()函数,该函数的作用就是帮助调用ActiveX控件的方法和属性,我们还可以注意到,ActiveX控件的每一个方法和属性都是用一个数值dwDispID来标识。从这些类的定义中可以看出,VC6为ActiveX控件生成的C++类把调用该控件的方法与属性的底层细节封装起来了,让我们不必去使用复杂的COM接口,而只需调用C++类的成员函数便可以很方便地使用ActiveX控件。 在为某个ActiveX控件生成的所有C++类中,一般情况下都有一个类是从CWnd类派生出来的,它代表着ActiveX控件所占据的窗口,例如列表视图控件的CListView1,这个类往往有一到两个Create()成员函数,它们在内部调用了CWnd::CreateControl()函数来创建ActiveX控件,除了这个类外,其它C++类通常代表着ActiveX控件内部的一些对象或属性。 图20-2:新加入的控件按钮 l 在对话框中使用ActiveX控件 向工程中添加了一个ActiveX控件后,在资源编辑器中打开一个对话框,此时我们会发现Controls工具栏中多了一个代表该控件的按钮,如图20-2所示。与使用普通控件一样,按下这个按钮,然后在对话框内合适的地方放置一个ActiveX控件,用鼠标右键单击该控件,从关联菜单中选择“Properties ListViewCtrl Object”或“Properties”命令,就会调出这个控件的属性窗口。 ActiveX控件的属性要比普通控件多,其中“General”属性页中列出的各个属性与普通控件是类似的,含义上也没有大的区别,其它属性页则是ActiveX控件自有的各种属性,其中“All”属性页(见图20-3)中罗列了ActiveX控件的所有可以在设计时调整的属性,学过VB的朋友会发觉它与VB中的属性窗口很相似。 与使用普通控件一样,我们设置好ActiveX控件的属性后,同样可以调用ClassWizard在对话框类中为该控件添加一个Control型的成员变量,有了这个成员变量之后,我们就可以在对话框类的成员函数中控制ActiveX控件。如果不想添加成员变量,也可在需要使用ActiveX控件时利用对话框类的GetDlgItem()函数来取得该控件的一个CWnd *指针,并将这个指针强制转换成控件类的指针就可以使用了。 图20-3:ActiveX控件的属性窗口 每一个ActiveX控件都有自己的方法、属性和事件,如果我们查看MSDN库,就会发现VC的帮助下面并没有介绍具体的ActiveX控件,这些控件的帮助实际上放在了“VB文档\参考\控件参考\ActiveX控件”下面,并且都是以VB为例来讲解的,这主要是因为无论是在VC中还是在VB中,ActiveX控件的形为表现都是一致的,使用方法也很类似。 在向工程中添加ActiveX控件时,VC6自动生成了很多C++类,这些类都有很多函数,其中一些函数对应着ActiveX控件的方法,其函数名与方法名是一样的,有的用来获取与设置ActiveX控件的属性,其函数名为属性名前面加上“Get/Set”前缀,当然,也有少数方法的名字前面本身就含有“Get”或“Set”字符,这就要求我们在使用ActiveX控件时应该仔细查阅帮助文件,了解清楚C++类的某个函数到底对应的是方法还是属性。 ActiveX控件的很多属性本身又是一个对象,或对象集合,因此在VC中这个属性就由另外一个C++类来表示,例如ListView等很多ActiveX控件都有一个Font属性,用来确定控件的字体,它实际上对应着一个Font对象,因此用来获取Font属性的CListView1::GetFont()函数就返回了一个COleFont对象,如下所示: COleFont CListView1::GetFont() { LPDISPATCH pDispatch; InvokeHelper( DISPID_FONT, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&pDispatch, NULL); return COleFont(pDispatch); } 如果我们要改变ListView控件的字体,那么就可以通过控制返回的COleFont对象来进行。从这里可以看出,在VB中仅用“ListView1.Font”就能表示的属性,在VC中还需要用另外一个C++类来处理,这就是为什么在向工程添加ActiveX控件时会生成那么多C++类的原因。 为了处理ActiveX控件发出的事件,我们可以利用ClassWizard来为对话框类添加事件处理函数。在ClassWizard的“Message Maps”一栏内选择ActiveX控件的ID,然后在“Messages”列表框中双击要处理的事件,ClassWizard就会在对话框类中添加一个事件处理函数,这与我们在前面学习过的处理通知消息的方法很相似。 在使用一个具体的ActiveX控件时,我们还会遇到很多问题,例如该控件到底有哪些方法和属性,其含义是什么,如何在设计时修改某些属性,函数中出现的VARIANT类型的变量又是什么回事等等诸如此类的问题,我在此无法详细地介绍这些内容,建议朋友们在使用ActiveX控件时要多参考MSDN库,有时候可以在VB中做试验。 l 结束语 到本讲为止,VC6讲座就要结束了,VC6讲座虽然结束了,但讲座的内容相当初级,只涉及到VC编程知识中极少的一部分,我愿意继续与朋友们共同学习,共同进步,一起提高我们的VC编程水平。 |
|||||
| 文章录入:Polylove 责任编辑:Polylove | |||||
| 【发表评论】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | | |
![]() |
Copyright ©2004 - 2006 中国软硬件结合技术网 91tech.net 91tech.net.cn 91tech.org 91tech.org.cn 1y11.net 站长:Polylove |