📄 105157.html
字号:
<img src="105157_files/20061021231356903.JPG" height="250" width="658"><br>
属性页上已有了10个标准的单选按钮,现在让它们完成一些任务。用右键单击其中一个单选按钮,从上下文
菜单中选择Properties(属性),系统显示RadioButton Properties(单选按钮属性)对话框,如下图所示。<br>
<img src="105157_files/20061021231356380.JPG" height="208" width="655"><br>
为了使单选按钮看起来与如图10.4所示的外观相同,要对它们作些小的改动。首先,在 Radio
Button
Properties(单选按钮属性)对话框选择Style(风格)页,并为每个按钮选中Push-like复选框。还需把这些单选按钮放入一个组,使得
当你选择一个新按钮时,当前选择能消除掉。为了完成这个任务,先对使用IDC_RADIO1缺省ID的组中的第一个单选按钮,复选Group及
Tabstop复选框,而对(该组中)其它的单选按钮都只复选Tabstop复选框。否则,最后得到的是每组只有一个按钮的10个组而不是有10个按钮的
一个组。Visual C++把它看到的第一个选择了Group
复选框的按钮作为组的起点,顺序下去,在VisualC++看到选择了Group复选框的下一个按钮之前,所有按钮都归为这一个组。<br>
技巧
大多数Microsoft产品推荐使用尺寸为250×62或250×110对话框单元的属性页,但你可以按照需要使用任意尺寸的属性页,
当你试图访问这个属性页时,你就会看到一条消息,说你没使用标准尺寸。清除这一消息,则属性按通常那样显示出来。<br>
在这个对话框中,我们要对单选按钮再做一件事。为了在单选按钮和OCX
控件之间建立OLE连接,要对它们的输出赋以OLE属性。按下CTRL键并双击该组中第一个单选按钮(None),系统显示Add Member
Variable(添加成员变量)对话框,如下图所示:<br>
<img src="105157_files/20061021231357246.JPG" height="335" width="584"><br>
技巧 键入CTRL-W显示MFC ClassWizard对话框,选择Member
Variable(成员变量)页,再单击Add Variable(添加变量)按钮,也可以访问这个对话框。<br>
这儿定制的各个项目都是十分关键的,原因在于Visual
C++不检查它们的对错,并且也不能从列表中选择它们。在Member Variable
Name(成员变量名)域,键入m_stdButtorType,这是前面我们创建的定制属性之一的内部名称。保持Category(范畴)域及
Variable Type (变量类型)域不变。在 Optional PropertyName
(可选属性名称)域中,键入StdButtonType,这是把属性页链接到你的OCX控件的一个项。记住C++是区分大小写的,所以大写很重要。<br>
技巧 Optional Property Name(可选属性名称)域的下拉列表中通常包含了从控件基类继承来的属性的完整列表。<br>
<strong>添加代码 </strong><br>
直到现在,我们还没有向我们的应用程序中添加一行代码。因为我们一直在忙于建立代码框架。现在该向
OCX中添加代码了。首先要添加一些代码,使得我们的控件能与使用这个控件的用户交换数据,例如,当看到控件属性对话框时,通常想看到这些属性的当前值,
类似地,当改变了一个属性值时,就想确信实际控件也随之改变。程序列表10.1是需要添加的代码。<br>
<img src="105157_files/20061021231358710.JPG" height="180" width="603"><br>
<img src="105157_files/20061021231359278.JPG" height="144" width="530"><br>
现在假定你不喜欢按钮的缺省大小,并且想在用户把按钮插入到Web
页或其它框架中时,显示一个具体的标题。可以在OnReset()函数中改变这两个属性。程序列表10.2
中显示了需要修改的代码。请注意,我们使用COleControl
类的函数来完成所需的修改。SetText()函数修改按钮的标题。每当用户插入这一控件时,标题“Button”就会显示在该控件上。
SetControlSize()函数把控件大小变成75×25个像素。显然,可以按你自己的意愿设置这些属性,甚至能够选择其中一个按钮作为缺省按钮。<br>
<img src="105157_files/20061021231359972.JPG" height="244" width="674"><br>
<img src="105157_files/2006102123140458.JPG" height="24" width="53"><br>
现在我们有了交换信息的方法,并且把控件按我们的要求进行了设置。下面来实现我们创建的三个定制属性。
是的,每当你创建一个定制属性时,就需要定义一些代码,使得这种属性能完成一些任务。否则,它就只能呆在那里干不成事。程序列表 10.3
列出了用以实现ModalResult、OnOff和StdButtonType属性所需添加的代码。下一节我来解释一下这些代码的内部操作方式。在目
前,你只要知道这些代码实现了我们创建的属性就够了。<br>
<img src="105157_files/2006102123140875.JPG" height="394" width="635"><br>
<img src="105157_files/2006102123141573.JPG" height="614" width="654"><br>
<img src="105157_files/2006102123143450.JPG" height="614" width="394"><br>
<img src="105157_files/2006102123144343.JPG" height="614" width="613"><br>
<img src="105157_files/2006102123145192.JPG" height="87" width="269"><br>
我们现在需要在OCXEXMPLCtl.cpp文件中做最后的一些编码工作。当用户单击按钮时怎么办?
如果他使用的是标准按钮类型之一,OnOff控件将返回一个标准的模式结果值。但是,OnOff控件还有一个特殊行为。如果你把OnOff属性设置为
True,按钮则随着用户的单击而在On和Off之间切换。我们需要添加一些特殊的事件代码来处理这种情况。使用View(视图)
|ClassWizard(类向导)命令显示出MFC ClassWizard(MFC类向导)对话框,选取Message
Maps(消息映射)页,选择 Class Name
(类名)域中的COCXExmplCtrl项,在Messages(消息)列表中选中OnClick,单击Add
Function(添加函数)向类中添加一个函数框架,这时MFC ClassWizard(MFC类向导)对话框如下图所示:<br>
<img src="105157_files/2006102123145254.JPG" height="407" width="687"><br>
现在向OnClick()函数中添加代码。单击Edit Code(编辑代码)按钮,VisualC++就把你带入到新函数中。程序列表10.4列出了需要添加的代码。<br>
<img src="105157_files/2006102123146429.JPG" height="124" width="594"><br>
<img src="105157_files/2006102123147789.JPG" height="588" width="604"><br>
现在我们已经实现了函数编码部分,但我们还需要向
OCXEXMPLCtl.h文件中添加两个支持项。第一个项是枚举类型,其唯一目的是使源代码容易阅读。每个元素对应一个标准按钮类型。第二个项是一个特
殊变量。如果注意一下代码,就会看到我们一直引用一个名为m_SetOn的成员变量,但这个变量现在还不是类的一部分。程序列表10.5显示了如何向头文
件中添加所需的枚举类型及特殊变量──就在Event maps和Dispatch and event IDs项之间添加。<br>
<img src="105157_files/2006102123148273.JPG" height="476" width="480"><br>
<img src="105157_files/2006102123149576.JPG" height="470" width="421"><br>
详细解析代码<br>
你对上述代码作出的最初反应肯定是觉得太可怕了,但是,如果每次处理一个函数,这实际上又相当容易。事
实上,作为ActiveX控件定义处理过程的一部分,Visual
C++已为你写出了大部分的代码,所以你写出的代码并没有比为一个标准应用程序所写的代码多多少。我们添加的函数,只不过是定义我们要求这个控件所要完成
的特殊任务。<br>
让我们把代码分解开来看一下。你修改的第一个函数是DoPropExchange()。这个函数在这个
例子中只完成一种服务──把你的定制属性变成持久属性。实际上,PX_
系列函数调用允许把一个特定属性的值,从一个会话期存贮到下一个会话期。对你定义的每一个变量类型都调用一次该类型的函数。每次调用都接受类似于下文所述
的四个变量:<br>
PX_Bool (pPX,"OnOff", m_OnOff,FALSE);<br>
第一个变量是指向属*换结构的一个指针,Visual
C++自动定义这一结构,你只管使用就是了。第二个参数包含了属性的外部名,用户在PropertyInspector中可以看到它。(对于
Property Inspector,Visual
C++称之为属性对话框,Delphi称为对象观察器,等等)。第三个参数是属性的内部名。使用它在整个程序中确定该属性。最后的参数是定义属性的缺省值
(除非你想让用户在Properties(属性)对话框中看到一个空白域)。<br>
你修改的下一个函数是OnResetState()。这个函数提供的是,当用户把组件添加到窗体上时,
用户看到的一些美学细节。在这儿,我们给予组件一个缺省标题,并改变其尺寸使之与能在Web页上正常工作的定制尺寸相匹配。如果你设计一个ActiveX
控件用于其它目的,就需要改变这一设置,以满足你使用最多的程序设计语言的需要。要记住重要的是OnResetState()函数允许你对使用控件所需要
的任何设置进行操作。 <br>
技巧
Microsoft使用的组件缺省尺寸差不多是Borland产品(如DelPhi)的两倍。Internet控件的尺寸可变,但本例中使用的75×25
(宽×高)规格在绝大多数情况下都能工作。<br>
在代码的消息处理程序 ( handler)
部分,三个修改过的函数中有两个需要进一步修改。ModalResultChanged()函数不需作修改,所以这里就不讨论它了。与
ModalResultChange()函数相关的属性ModalResult由其它两个函数进行修改。先看一看OnOffChange()函数。我们要
做的是设置内部标题标志和初始标题。如果程序员设置OnOff属性为True,我们通过设置它的标题为On把控件设置为一个on/off开关按钮。当按钮
用作on/off开关时,还提供了不同的模式结果值。请留意,内部属性变量m_onOff追踪着标志的状态,而内部属性m_SetOn追踪着OnOff控
件的当前状态(on或off),因为这个按钮初始时为On,所以一开始设置m_SetOn标志为True。<br>
现在看一下这个OCX 的Property
Page(属性页)中功能所需的处理过程。OnStdButtonTypeChanged函数只不过是一个case语句,它按照创建各种缺省按钮类型的需
要来改变按钮的Caption和ModalResult属性。请留意,如果用户选择了缺省的按钮类型,我们还不得不关闭OnOff的按钮处理过程。<br>
OnClick()消息处理函数在运行期间是激活的,这里有两个层次的动作。第一,需要确定程序员是不
是把这个按钮定义为
on/off开关,如果是,我们就改变内部状态变量(m_SetOn)和按钮标题。该函数让按钮状态在On和Off之间按需要切换。一旦我们完成了使按钮
工作所需的内部处理,我们就调用缺省的OnClick处理例程。如调用失败,则导致OCX跳过你为按钮事件附加的专用于程序设计环境的代码。例如,如果你
在Visual C++应用程序中使用这个控件,附加于Visual C++中exposed事件的任何代码都会被忽略。<br>
在能够使用这个组件之前,还得在 Visual
C++中建立它。建立过程的一部分是用Windows自动为你注册OCX。我确实喜欢这一特色,因为在测试OCX
时它为我节省了不少时间。唯一的缺憾是,预先注册污染了工作环境,从Internet上使用ActiveX控件的角度来看,你必须到另一台机器上去测试这
一组件。<br>
<strong>测试控件 </strong><br>
一旦创建了一个任意种类的ActiveX控件(不论是否你的编译器是否将它称为OCX),都要进行一些
测试,从而保证它按预期的方式工作。对于想用于Internet的ActiveX控件来说,其测试工作最好分为四个阶段:三个层次的内部测试和第四层次的
外部测试。下述列表说明了各个阶段的重要性。<br>
内部测试阶段1
在标准环境中使用这个控件。在将控件从标准程序设计平台移走之前,看一下它是否能够工作正常。这样做的理由很简单:在浏览器内测试ActiveX
控件时没有调试程序可用。在把它从C++(或其它OCX/ActiveX)程序设计环境中移走之前测试ActiveX控件的基本功能,使你拥有调试程序,
从而能随时找出真正严重的问题。<br>
内部测试阶段2
在浏览器内进行本地测试。在你的本地机器上建立简短测试,看一看ActiveX控件能否装入到一个HTML页中,这样可以使后面的工作节省一些时间,你还
应该验证一下,是否有足够多的属性在实际使用控件时可用,并且在你浏览测试页时它能否工作。<br>
内部测试阶段3 使用网络连接测试整个Web页。一旦你对ActiveX
控件的基本功能完成了测试工作,并验证了它能在浏览器中正常使用,就要确定它是否能够在一整页HTML标记中正常工作。总之,不能与同在一页上的其它控件
一起工作的控件有什么用呢?
控件间的相互作用能引起一些真正奇怪的问题。可以在应用程序中使用标准窗体来测试相互作用问题,但也帮不了多少忙,问题是浏览器并不是像你所喜爱的编译器
那样来处理ActiveX控件。<br>
外部测试
在未被污染的机器上核查控件功能。你遇到的最大问题是污染。请记住,大部编译器总是自动地对你所创建的OCX或ActiveX控件进行注册。而进入你的
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -