📄 105157.html
字号:
入探讨一下。在开始讨论第一个程序设计例子之前,我们快速地看一下,定义一个具体的ActiveX控件必须记住哪些规则。下列的建议可以加深你对创建
ActiveX控件必须遵守的一些特殊约束的理解。<br>
技巧 尽管使用能生成 OCX 的编译器就能创建ActiveX
控件,但你会发现使用Microsoft Visual
C++(4.2版以上)产品将会为你节约许多时间。你在本章还会看到,要使OCX像ActiveX控件那样正确地工作,哪怕在最好的环境中,也需要一些额
外的步骤。使用旧版编译器意味着你需要用DOS命令行工具来处理额外的步骤。Microsoft Visual
C++编译器的4.2及5.x都把这些工具作为软件包的一部分,而且将它们的使用自动化了。<br>
保持代码小型化
经验告诉我们,应该保持ActiveX控件的体积在40KB以下。通常用户不想下载庞大的、仅能用于对页面图形作动画处理的控件。实在没办法时,把一个大
的组件分成几个小的功能块来实施。<br>
技巧 还可以像第8章讨论过的那样,把控件压缩进CAB文件也能够减少下载规模。<br>
使用最少的持久数据
一些OCX要求大量的持久数据来完成任务。例如,你可能会把一个电子表格控件粘贴到窗体上,而没想到它所包含的持久数据的数量。ActiveX控件没有这
般奢侈,因为你不能对客户机有太多的假设。持久数据不仅增加装入时间和内存需求,而且扩大了控件自身的规模。<br>
将功能特色限制在最低限度
众多的功能的确能为屏幕演示增光添彩。为本地机器编写OCX时,几个额外特色不会增加什么问题。事实上,如果不包括它们就会使多数程序员感到吃惊。但传输
时间的确是Internet的一大问题。向控件中每增加一个不是真正必需的图形或其它特殊声音效果,都要增加装入时间,并且降低控件的价值。
ActiveX 控件甚至不能假定一些特殊效果是否能够在客户机上正确工作(举例来说,客户机可能没有声卡)。<br>
功能单一是关键
建库的原始动机之一是,用容易访问的形式,存贮大量预编译过的函数调用。作为OCX的前辈,DLL存在的理由正在于此。你会发现市场上的许多OCX
(如DLL)都不止包含一个对象(如按钮)。事实上它们包含了一簇对象。这一策略对于桌面系统来说当然很不错,但到了Internet上就行不通了。要保
证在一个控件中保持一个对象。遵循这样的原理去模块化控件,确保了用户不必下载他们绝对需要功能以外的东西。<br>
注释
本章中还将对对象进行相当多的讨论。本章中每个对象都是Windows对象(或COM使用的特殊形式)。一些C++程序员可能认为Windows对象就是
C++
对象。因为COM使用一种特殊形式的Windows对象,这些程序员就认为,使用手边的C++对象写OCX不会出问题。越过真理一步就是谬误。尽管可以用
C++对象创建Windows对象,但存在一些限制。本章篇幅不足以全面讨论C++程序设计中对象的种种复杂性──这个题目,一些作者要用一章或两章的篇
幅来作综述性讨论──但是,了解一下对于用C++写OCX时能做些什么以及应做些什么、有哪些限制,都是很重要的。最好按照本章例子中的方法去写OCX,
这样才不会出问题。<br>
测试、测试、再测试
仅仅在本地或仅仅在网络上测试ActiveX控件都是不够的。应该使用不同的连接,在多种情况下进行测试。本章最后会看到三个层次的本地测试以及一个层次
的针对Internet的测试。可能你想再加进几个层次的测试,根本上说,你对一个ActiveX测试永远不嫌多。(在发布控件之前测试它是重要的,但在
出问题后一定要去查出缺陷,所以要使ActiveX控件正常工作,维护精确的问题日志也很重要的。)<br> <strong>编写代码</strong><br>
现在到了看一下简单编码示例的时候了。本章使用Microsoft Visual
C++6.0(尽管你能够使用4.2以上版本),这在前面已提到过。让我们开始创建一个C++新工程。但是,与你创建过的其它工程不一样,现在要用MFC
ActiveX ControlWizard(MFC
ActiveX控件生成向导)来创建工作区。现在开始吧,使用Flie(文件)|New(新建)命令,系统显示New(新建)对话框,选择Project
Tab(工程页),则会看到如下所示的对话框。<br>
<img src="105157_files/20061021231343604.JPG" height="398" width="682"><br>
该对话框中的MFC ActiveX Control Wizard(MFC
ActiveX控件生成向导)就是开始创建本工程的那个选项。这个向导提供了一个OCX框架,通过建立这个框架来创建本例的最后版本。<br>
注释 本例中我使用了新的Microsoft Developer
Studio(开发人员工作室)。看到的所有的屏幕图像都是Windows
95下的。如选择使用老的界面,你的屏幕图像就会与这儿的图像不一样。即便你也在使用Developer
Studio接口,因为这一产品提供的配置选项可以修改,因此,仍可能产生一些小的差别。<br>
工程开始时,在Project
Name(工程名)域中键入工程名。本例用OCXExmpl作为工程名。在工程列表框中单击MFC ActiveX Control
Wizard(MFC ActiveX控件生成向导),然后单击OK。Microsoft Visual
C++自动选择了Win32选项,它还创建了一个工程目录。<br>
接下来你看到的是MFC ActiveX Control Wizard(MFC ActiveX
控件生成向导)屏幕的两个对话框。我采用了这两个对话框的缺省设置,但对第二个对话框的subclass(子类)域作了选择,如果你也想创建像这个例子一
样的控件,那么,在这个域中选择BUTTON类。否则,可以浏览可用类的列表框以确定用什么作为你的控件的基础。还要注意到 Visual
C++允许创建自己的基类。<br>
在第二个向导屏幕上单击Finish(完成)按钮后,则会看到如下的New ProjectInformation(新工程信息)对话框。<br>
<img src="105157_files/20061021231345699.JPG" height="407" width="590"><br>
浏览一下所提供的功能列表,确认工程中包含了你所需要的一切内容。核对工程建立无误后,单击OK,则启动了工程。Visual C++将使硬盘转动一会儿,然后就会看到工程框架。<br>
<strong>修改缺省的About对话框 </strong><br>
现在已有了一个框架,我们把它填充好。我总是先处理简单的事情(谁不是这样呢?)。首先修改About
对话框。Visual C++
自动为你创建这个对话框,你需要做的事就是定制它。访问About框很容易,使用View(视图)|ResourceSymbols(资源符号)命令则显
示出如下图所示的Resource Symbols(资源符号)对话框。<br>
<img src="105157_files/20061021231346711.JPG" height="345" width="615"> <br>
选择IDD_ABOUTBOX-OCXEXMPL项,单击View
Use按钮显示该对话框。图10.1
显示了修改示例中About对话框的一种方法。也许你想把版权信息以及公司信息也包含到About对话框中。请留意Microsoft为对话框提供了多种
工具,其中之一是定制控件按钮,你能够把另一个OCX贴到About对话框或其它你创建的对话框中。 <br>
技巧 用右键单击一个控件,然后从上下文相关菜单中选择Properties(属性)
,于是Properties(属性)对话框显示出来。通过改变Properties(属性)对话框中
General(普通的)属性页上的Caption(标题)属性,可以改变静态文本控件的文本。用右键单击Visual
C++的大部分对象,都会显示一个上下文相关菜单──大部分这样的菜单中都包含Properties(属性)选项。用右键单击Visual
C++中某个对象的目的,就在于让你看到能够对这个特定对象做些什么。请记住,对象不仅仅指控件,它也可以是代码行、工具栏、甚至可以是各种窗口。<br>
Visual C++的最新版本可能要求你对
About对话框做一些过去不必做的事。你可能需要为About对话框创建一个类──Visual
C++的老版本只是假定你会创建新类。双击About对话框,则看到Adding a
Class(添加类)对话框,如下图所示(若没看到该对话框,则说明已有一个类赋给了About对话框,你不必再往下继续做了)。<br>
<img src="105157_files/20061021231347612.JPG" height="489" width="704"><br>
图10.1 该对话框编辑器看起来和Visual Basic的一样,区别在于你必须在主编辑器屏幕中单独访问它<br>
<img src="105157_files/20061021231349795.JPG" height="216" width="590"><br>
选择Creat a New Class(创建新类)选项,单击OK。Visual C+ + 则显示如下的 New Class(新类)对话框。<br>
<img src="105157_files/20061021231349342.JPG" height="414" width="625"><br>
我们这儿用CAboutBox作为类名,把它键入到Name(名称)域。这时这个例子所需的一切都准备
好了。单击OK,则创建所需的类。这时,就会看到在MFC ClassWizard
(类向导)对话框中出现了一个新项,如下图所示(如果屏幕显示不是这样,那么选一下ClassInfo选项卡即可)。<br>
<img src="105157_files/20061021231350895.JPG" height="413" width="694"><br>
这个对话框把新类的有关信息都显示出来。Header(头文件)及Source(源码)两项是与这个类
相关的文件的存放位置。你还会看到,这个类的对话框资源是IDD_ABOUTBOX_OCXEXMPL。单击OK,关闭MFC
ClassWizard(类向导)对话框。<br>
<strong>添加属性及事件 </strong><br>
定制对话框的工作很有趣,现在就让我们继续创建OCX吧。首先要完成的工作是使按钮控件的某些属性和事
件让使用该OCX控件的人能够访问(即可见)。例如,在用户单击按钮时要能检测到这个事件。肯定你想改变缺省的属性,如按钮正面上显示的标题等。第一次创
建这个按钮时,没有多少属性是可见的。为了使这些元素成为可见状态,需要使用Class
Wizard(类向导)。使用View(视图)|ClassWizard(类向导)命令,系统显示MFC ClassWizard
(类向导)对话框。选取Automation(自动化)这一页,然后在Class Name(类名)域选择OCXExmplCtrl。<br>
注 Visual C++对你创建的控件作的假设非常少,甚至于使用什么属性和方法使控件可见也不做任何假定。<br>
在这个例子中,使用了两类不同的属性(实际上Microsoft提供了许多供你使用的属性)。第一种是
常备(Stock)属性。你会发现,第一次创建OCX时,就连我们都认为是理所当然的Caption(标题)属性等等一类事物都是不可见的。常备属性(在
图10.2中用S表示)是由父类缺省支持的一种属性。另一种是定制属性(在图10.2中用C表示)。定制属性是把一个特定类作为子类时你向它添加的属性,
其中之一是我们将用于创建一个 OnOff控件的OnOff属性。本章下面来讨论做这些事的过程。图10.2 显示了创建我们例子时所有属性的完整列表。<br>
注 常备属性是基类的一部分,定制属性是把控件作成子类时创建的属性。<br>
<img src="105157_files/20061021231352828.JPG" height="438" width="709"><br>
创建新属性的过程很简单。只要单击一个Add Property(添加属性)按钮就可以显示出下图所示的Add Property对话框。<br>
<img src="105157_files/20061021231353552.JPG" height="352" width="621"><br>
Add
Property(添加属性)对话框中包含一些以前我们未曾见到过的重要特性。External Name 组合框包含了创建 OCX
时选择的基类的全部缺省属性,在我们的例子中,就可见到Caption属性等。为了创建常备属性,从这个列表中选一项并单击OK即可,Visual
C++将处理细节。现在接着创建出本例子程序中的全部常备属性(参见图10.2)。<br>
我们还需要三个定制属性:ModalResult、OnOff及StdButtonType。为了创建
它们,把它们键入到刚才提到的External Name(外部名称)域中。然后需要在Type
(类型)字段中为它们选择数据类型。在我们例子中,ModalResult和StdButtonType属性是long型,而OnOff是BOOL型。
(在这里,你可能要先关闭MFC ClassWizard(类向导)对话框,然后再打开它,否则在有些时候,你选择的属性可能没记录下来。)<br>
这个例子中我们使用的事件都是常备的,他们来自于按钮基类的一部分。要做的是单击ActiveX
Events(事件)页,系统显示如图10.3所示。添加常备事件的做法与添加一个常备属性的方法一样,只需单击Add
Event(添加事件)按钮显示出Add Event(添加事件)对话框,从Extenal
Name(外部名称)组合框中选取一个常备的名称,然后单击OK即可。图10.3显示了需要为这个例子选择的全部常备事件。<br>
<strong>定义属性页 </strong><br>
现在该向属性页中添加一些功能了,访问属性页的方法与访问About对话框的方法相同,就是使用
View(视图)|Resource Symbols(资源符号)命令。在 Resource
Symbols(资源符号)对话框选择IDD_PROPPAGE_OCXEXMPL项。属性页用途广泛,其中绝大多数是面向配置的。<br>
Visual
C++支持两种标准规格的属性页,OCX的缺省选择是250×62的小号规格。这种规格对我们的目的说来太小了,所以需要把它变成250×110的大号属
性页。创建一个控件时一定要确定用这一种还是另一种。你不用标准尺寸时也不会发生什么坏事,但用户可能会收到警告信息,说你没使用标准尺寸的属性页。<br>
<img src="105157_files/20061021231354578.JPG" height="475" width="703"><br>
现在要完成的工作是,为向页中定义标准的按钮类型来添加一种方法,如图10.4所示。它们是单选按钮,
你需要10个按钮(现在不必担心如何配置它们,下述段落中会进行讲解)。每个单选按钮应有不同的ID,以便于能检测出用户单击的是哪一个。(参见
Radio Button Properties(单选按钮属性)对话框中General页上的ID域)。<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -