深入浅出MFC第2版(PDF格式)-第162部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
之于VBX ,以及Borland C++ Builder 和Delphi 之于VCL,都提供了整合开发环境
(IDE)与PME 接口之间的极密切结合,使得程序设计更进一步到达「以拖拉、填单等
简易动作就能够完成」的可视化境界。也因此没有人会反对把Visual Basic 和Delphi 和
C++ Builder 归类为RAD (Rapid Application Development ,快速软件开发工具)的行列。
但是Visual C++ 之于OCX ,还没能够有这么好的整合。
我怎么会谈到OCX 呢?本节不是ActiveX Control 吗?噢,OCX 就是ActiveX
Control !由于微软把它所有的Internet 技术都称为ActiveX ,所以OLE Controls 就变成
了ActiveX Controls 。
我不打算讨论ActiveX Control 的撰写,我打算把全部篇幅用到ActiveX Control 的使用
上。
如果对ActiveX Control 的开发感兴趣,Adam Denning 的ActiveX Control Inside Out 是
一本很不错的书(ActiveX 控制组件彻底研究,侯俊杰译/ 松岗)
822
…………………………………………………………Page 885……………………………………………………………
16 ponents & ActiveX Controls
第 章 站眾的肩膀 使用
ActiveX Control 基础观念:Properties 、Methods、Event
你必须了解ActiveX Control 三种接口的意义,并且充份了解你打算使用的某个ActiveX
Control 有些什么特殊的接口,然后才能够使用它。
基本上你可以拿你已经很熟悉的C++ 类别来比较ActiveX control 。类别也是一个包装良
好的组件,有它自己的成员变量,以及处理这些成员变量的所谓成员函数,是个自给自
足的体系。ActiveX control 的三个接口也有类似性质:
■ property 相当于C++ 类别的成员变量
■ method 相当于C++ 类别的成员函数
■ event 相当于Windows 控制组件发出的notification 消息
ActiveX Control 规格中定有一些标准的(库存的)接口,例如BackColor 和FontName
等properties ,AddItem 和Move 和Refresh 等methods ,以及CLICK 和KEYDOWN 等
events 。也就是说,任何一个ActiveX Control 大致上都会有一些必备的、基础的性质和
能力。
以下针对ActiveX Control 的三种接口与C++ 类别做个比较。至于它们的具体展现以及
如何使用,稍后在实例中可以看到。
CObject
CObject
CCmdTarget
CCmdTarget
CWnd
CWnd
CButton
CButton
CEdit
CEdit
CListBox
CListBox
COleControl
COleControl
。。。
823
…………………………………………………………Page 886……………………………………………………………
第篇 深入 MFC 程式設計
methods
设计自己的C++ 类别,你当然可以在其中设计成员函数。此一函数之调用者必须在编
译时期知道这一函数的功能以及它的参数。搭配Windows 内建之控制组件(如Edit 、
Button )而设计的类别(如CEdit、CButton),内部固定会设计一些成员函数。某些成
员函数(如CEdit::GetLineCount)只适用于特定类别,但某些根类别的成员函数(例如
CWnd::GetDlgItemText)则适用于所有的子类别。
ActiveX Control 的method 极类似C++ 类别中的成员函数。但它们被限制在一个有限
的集合之中,集合内的名单包括AddItem 、RemoveItem 、Move 和Refresh 等等。并不是
所有的ActiveX Controls 都对每一个method 产生反应,例如Move 就不能够在每一个
ActiveX Control 中运作自如。
properties
基本上properties 用来表达ActiveX Control 的属性或数据。一个名为Date 的组件可能
会定义一个所谓的DateValue ,内放日期,这就表现了组件的资料。它还可能定义一个
所谓的DateFormat ,允许使用者取得或设定日期表现形式,这就表现了组件的属性。
你可以说ActiveX Control 的properties 相当于C++ 类别的成员变量。每一个ActiveX
Control 可以定义属于它自己的properties ,可以是一个字符串,可以是一个长整数,也可
以是一个浮点数。有一组所谓的properties 标准集合(被称为stock properties ),内含
BackColor 、FontName、Caption 等等properties ,是每个ActiveX control 都会拥有的。
一般而言properties 可分为四种类型:
■ Ambient properties
■ Extended properties
■ Stock properties
■ Custom properties
824
…………………………………………………………Page 887……………………………………………………………
16 ponents & ActiveX Controls
第 章 站眾的肩膀 使用
events
Windows 控制组件以所谓的notification (通告)消息送给其父窗口(通常是对话窗),
例如按钮组件可能传送出一个BN_CLICKED 。ActiveX Control 使用完全相同的方法,不
过现在notification 消息被称为event ,用来表示某种状况发生了。Events 的发射可以使
ActiveX Control 有能力通知其宿主(container,也就是VB 或VC 程序),于是对方有
机会处理。大部份ActiveX Controls 送出标准的events,例如CLICK、KEYDOWN 、KEYUP
等等,某些ActiveX Controls 会送出独一无二的消息(例如ROWCOLCHANGE )。
一般而言events 可分为两种类型:
■ Stock events
■ Custom events
ActiveX Controls的五大使用步骤
欲在程序中加上ActiveX Controls ,基本上需要五个步骤:
1。 建立新项目时,在AppWizard 的步骤3中选择【ActiveX Controls 】。这会
使程序代码多出一行:
BOOL COcxTestApp::InitInstance()
{
AfxEnableControlContainer();
。。。
}
2。 进入ponent Gallery ,把ActiveX Controls 安插到你的程序中。
3。 使用ActiveX Controls 。通常我们在对话窗中使用它。我们可以把资源编辑器
的工具箱里头的ActiveX Controls 拖放到目标对话窗中。
4。 利用ClassWizard 产生对话窗类别,并处理相关的Message Maps、消息处理
例程、变量定义、对话框函数等等。
5。 编译联结。
825
…………………………………………………………Page 888……………………………………………………………
第篇 深入 MFC 程式設計
我将以系统内建(已注册过)的Grid ActiveX Control 做为示范的对象。Grid 具有小型
电子表格能力,当然它远比不上Excel (不然Excel 怎么卖),不过你至少可以获得一个
中规中矩的7x14 电子表格,并且有基本的编辑和运算功能。
容我先解释我的目标。图16…1 是我期望的结果,这个电子表格完全为了家庭记账而量身
设计,假设你有五种收入(真让人羡慕),这个表格可以让你登录每个月的每一种收入,
并计算月总收入和年总收入,以及各分项总收入。
图16…1 在对话窗中使用Grid ActiveX control。每一横列或纵行的最后一
栏都是总和。
由于Grid 本身并不提供编辑能力,我们以电子表格右侧的一个edit 字段做为编辑区域。
使用者所选择的方格的内容会显示在这edit 字段中,并且允许被编辑内容。数值填入后
必须按下 键,或是在【Update Value 】钮上按一下,电子表格内容才会更新。如果
要直接在电子表格字段上做编辑动作,并不是不可以,把edit 不偏不倚贴到字段也就是
了!
826
…………………………………………………………Page 889……………………………………………………………
16 ponents & ActiveX Controls
第 章 站眾的肩膀 使用
本书进行到这里,我想你对于工具的使用应该已经娴熟了,我将假设你对于像「利用
ClassWizard 为CMainFrame 拦截一个ID_GridTest 命令, 并指名其处理例程为
OnGridTest」这样的叙述,知道该怎么去动手。
使用Grid ActiveX Control:OcxTest程序
首先利用MFC AppWizard 做出一个OcxTest 项目。记得在步骤3选择【ActiveX
Controls 】:
然后进入ponent Gallery ,将Grid 安插到项目中:
827
…………………………………………………………Page 890……………………………………………………………
第篇 深入 MFC 程式設計
你必须回答一个对话窗:
828
…………………………………………………………Page 891……………………………………………………………
16 ponents & ActiveX Controls
第 章 站眾的肩膀 使用
对话窗的设计
产生一个崭新的对话窗。这个动作与你在第10 章为Scribble 加上〃Pen Width〃 对话窗的
步骤完全一样。请把新对话窗的ID 从IDD_DIALOG1 改变为IDD_GRID。
从工具箱中抓出控制组件来,把对话窗布置如下。
虽然你把Grid 拉大,它却总是只有2x2 个方格。你必须使用右键把它的Control
Properties 引出来(如下),进入Control 附页,这时候会出现各个properties :
! §Control! ¨ 附页在中文Windows 中竟然变成「一般」。这是否也算是一只臭虫?
829
…………………………………………………………Page 892……………………………………………………………
第篇 深入 MFC 程式設計
现在选择Rows ,设定为14,再选择Cols ,设定为7 。你还可以设定行的宽度和列的高
度,以及方格初值。。。。噢,记得给这个Grid 组件一个ID ,叫做IDC_GRID 好了。
整个对话窗的设计规格如下: