友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
深入浅出MFC第2版(PDF格式)-第43部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
IDD_ABOUTBOX DIALOG DISCARDABLE 0; 0; 217; 55
CAPTION 〃About Scribble〃
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
FONT 8; 〃MS Sans Serif〃
BEGIN
ICON IDR_MAINFRAME;IDC_STATIC;11;17;20;20
LTEXT 〃Scribble Version 1。0〃;IDC_STATIC;40;10;119;8;SS_NOPREFIX
LTEXT 〃Copyright 251 1996〃;IDC_STATIC;40;25;119;8
DEFPUSHBUTTON 〃OK〃;IDOK;178;7;32;14;WS_GROUP
END
Console 程序的项目管理
MFC AppWizard 会自动帮我们做出一个骨干程序的所有必须文件,建立起一个项目。但
如果你想写一个「血统单纯」的纯粹C++ 程序呢?第1章曾经介绍过所谓的console 程
式。第3章的所有范例程序也都是console 程序。
架构单纯的程序,如果文件只有一两个,直接使用命令列就可以了:
CL xxx。CPP
如果组织架构比较复杂一点,文件有好几个,可以寻求项目管理员的协助。在Visual C++
整合环境中建立一个conole 程序项目的步骤如下:
1。 选按整合环境的【File/New 】,然后选择【Projects 】附页,选按〃Win32 Console
Application〃 ,并填写画面右端的项目名称和位置:
305
…………………………………………………………Page 368……………………………………………………………
第篇 欲善工事先利其器
2。 按下【OK 】钮,回到整合环境主画面,你可以选按【File/New 】并选择【Files 】
附页,然后选按〃C/C++ Header File〃 或〃C++ Source File〃 以开启文件并撰写
程序代码。开启的文件会自动加入此项目中。
306
…………………………………………………………Page 369……………………………………………………………
第4章 Visual C++ 整合性軟體開發環境
3。 你可以选按整合环境的【Project/Setting】菜单项目,从中获得并修改整个项目
的环境设定。我曾经在第1章提过, console 程序必须在编译时指定
/D_CONSOLE 常数,并在联结时指定subsystem:console,这在以下两个画面中
都可以看到(那是项目管理员自动为我们设定好的):
307
…………………………………………………………Page 370……………………………………………………………
第篇 欲善工事先利其器
第1章讨论console 程序时,我曾经说过,程序使用MFC 与否,关系到C runtime library
的单线程版或多线程版。是的,这项设定放在【General 】附页之中:
你在这里所做的设定,会自动影响项目所联结的C runtime library 的版本。
308
…………………………………………………………Page 371……………………………………………………………
3
浅出 MFC 程序设计
深入湷觥FC
2nd Edition
309
…………………………………………………………Page 372……………………………………………………………
MFC
第篇 湷觥 〕淌皆O計
310
…………………………………………………………Page 373……………………………………………………………
第5章 總觀Application Framework
第5章
总观 Application Framework
带艺术气息的软件创作行为将在Application Framework出现后逐渐成为工匠技术,
而我们都将成为软件IC装配厂里的男工女工。
但,不是亨利福特,我们又如何能够享受大众化的汽车?
或许以后会出现「纯手工精制」的软件,可我自己从来不嫌机器馒头难吃。
什么是 Application Framework?
还没有学习任何一套Application Framework 的使用之前,就给你近乎学术性的定义,我
可以想象对你而言绝对是「形而上的」(超物质的无形哲理),尤其如果你对对象导向
(Object Oriented )也还没有深刻体会的话。形而上者谓之道,形而下者谓之器,我想能
够舍器而直接近道者,几稀!但是,「定义」这种东西又似乎宜开宗明义摆在前头。我
诚挚地希望你在阅读后续的技术章节时能够时而回来看看这些形而上的叙述。当你有所
感受,技术面应该也进入某个层次了。
311
…………………………………………………………Page 374……………………………………………………………
第篇 湷觥 FC 程式設計
侯捷怎么说
首先我们看看侯捷在其无责任书评中是怎么说的:
演化(revolution)永远在进行,但这个世界却不是每天都有革命性 (revolution)的事物
发生。动不动宣称自己(或自己的产品)是划时代的革命性的,带来的影响就像时下满
街跑的大师一样使我们渐渐无动于衷( 大师不可能满街跑) ! 但是Application
Framework 的的确确在我们软件界称得上具有革命精神。
什么是Application Framework?Framework 这个字眼有组织、框架、体制的意思,
Application Framework不仅是一般性的泛称,它其实还是对象导向领域中的一个专有名
词。
基本上你可以说;Application Framework是一个完整的程序模型,具备标准应用软件所
需的一切基本功能,像是文件存取、打印预视、资料交换。。。,以及这些功能的使用接口
(工具栏、状态列、菜单、对话框)。如果更以术语来说,Application Framework 就是
由一整组合作无间的「对象」架构起来的大模型。喔不不,当它还没有与你的程序产生
火花的时候,它还只是有形无体,应该说是一组合作无间的「类别」架构起来的大模型。
这带来什么好处呢?程序员只要带个购物袋到「类别超级市场」采买,随你要买MDI 或
OLE 或 ODBC 或Printing Preview,回家后就可以轻易拼凑出一个色香味俱全的大餐。
「类别超级市场」就是C++ 类别库,以产品而言,在Microsoft 是MFC,在Borland
是OWL,在IBM 则是OpenClass。这个类别库不只是类别库而已,传统的函数库(C
Runtime 或Windows API)乃至于一般类别库提供的是生鲜超市中的一条鱼一支葱一颗
大白菜,彼此之间没有什么关联,主掌中馈的你必须自己选材自己调理。能够称得上
Application Framework 者,提供的是火锅拼盘(就是那种带回家通通丢下锅就好的那
种),依你要的是白菜火锅鱼头火锅或是麻辣火锅,菜色带调理包都给你配好。当然这
样的火锅拼盘是不能够就地吃的,你得给它加点能量。放把火烧它吧,这火就是所谓的
application object (在MFC 程序中就是衍生自CWinApp 的一个全域性对象)。是这
312
…………………………………………………………Page 375……………………………………………………………
第5章 總觀Application Framework
个对象引起了连锁反应(一连串的 'new'),使每一个形(类别)有了真正的体(对象),
把应用程序以及Application Framework 整个带动起来。一切因缘全由是起。
Application Framework 带来的革命精神是,程序模型已经存在,程序员只要依个人需求
加料就好:在衍生类别中改写虚拟函数,或在衍生类别中加上新的成员函数。这很像你
在火锅拼盘中依个人口味加盐添醋。
由于程序代码的初期规模十分一致(什么样风格的程序应该使用什么类别,是一成不变
的),而修改程序以符合私人需要的基本动作也很一致(我是指像「开辟一个空的骨干
函数」这种事情),你动不了Application Framework 的大架构,也不需要动。这是福利
不是约束。
应用程序代码骨干一致化的结果,使优越的软件开发工具如CASE (puter Aid
Software Engineering)tool 容易开发出来。你的程序代码大架构掌握在Application
Framework 设计者手上, 于是他们就有能力制作出整合开发环境( Integrated
Development Environment,IDE)了。这也是为什么Microsoft、Borland、Symantec、
Wat、IBM 等公司的整合开发环境进步得如此令人咋舌的原因了。
有人说工学院中唯一保有人文气息的只剩建筑系,我总觉得信息系也勉强可以算上。带
艺术气息的软件创作行为(我一直是这么认为的)将在Application Framework 出现后
逐渐成为工匠技术,而我们都将只是软件IC 装配厂里的男工女工。其实也没什么好顾
影自怜,功成名就的冠冕从来也不曾落在程序员头上;我们可能像纽约街头的普普
(
POP)工作者,自认为艺术家,可别人怎么看呢?不得而知!话说回来,把开发软件
这件事情从艺术降格到工技,对人类只有好处没有坏处。不是亨利福特,我们又如何能
够享受大众化的汽车?或许以后会出现「纯手工精制」的软件,谁感兴趣不得而知,我
自己嘛。。。唔。。。倒是从来不嫌机器馒头难吃。
如果要三言两语点出Application Framework 的特质,我会这么说:我们挖出别人早写
好的一整套模块(MFC 或OWL 或OpenClass)之中的一部份,给个引子(application
object)使它们一一具象化动起来,并被允许修改其中某些零件使这程序更符合私人需
313
…………………………………………………………Page 376……………………………………………………………
第篇 湷觥 FC 程式設計
求,如是而已。
我怎么说
侯捷的这一段话实在已经点出Application Framework 的精神。凝聚性强、组织化强的类
别库就是Application Framework 。一组合作无间的对象,彼此藉消息的流动而沟通,并
且互相调用对方的函数以求完成任务,这就是Application Framework 。对象存在哪里?
在MFC 中?! 这样的说法不是十分完善,因为MFC 的各个类别只是「对象属性(行
为)的定义」而已,我们不能够说MFC 中有实际的对象存在。唯有当程序被application
object (这是一个衍生自MFC CWinApp 的全域对象)引爆了,才将我们选用的类别一一
具象化起来,产生实体并开始动作。图5…1 是一个说明。
这样子说吧,静态情况下MFC 是一组类别库,但在程序执行时期它就生出了一群有活
动力的对象组。最重要的一点是,这些对象之间的关系早已建立好,不必我们(程序员)
操心。好比说当使用者按下菜单的【File/Open 】项,开文件对话框就会打开;使用者选好
档名后,Application Framework 就开始对着你的资料类别,唤起一个名为Serialize 的特
殊函数。这整个机制都埋好了,你只要把心力放在那个叫作Serialize 的函数上即可。
选用标准的类别,做出来的产品当然就没有什么特色,因为别人的零件和你的相同,兜
起来的成品也就一样。我指的是使用者接口(UI )对象。但你要知道,软件工业发展到
现阶段这个世代,着重的已不再是UI 的争奇斗艳,取巧哗众;UI 已经渐渐走上标准化
了。软件一决胜负的关键在资料的处理。事实上,在「真正做事」这一点,整个application
framework 是无能为力的,也就是说对于数据结构的安排,数据的处理,数据的显示,
Application Framework 所能提供的,无一不是单单一个空壳而已…在C++ 语言来讲就
是个虚拟函数。软件开发人员必须想办法改造(override )这些虚拟函数,才能符合个人
所需。基于C++ 语言的特性,我们很容易继承既有之类别并加上自己的特色,这就是物
件导向程序设计的主要精神。也因此,C++ 语言中有关于「继承」性质的份量,在MFC
程序设计里头占有很重的比例,在学习使用MFC 的同时,你应该对C++ 的继承性质和
虚拟函数有相当的认识。第2章有我个人对C++ 这两个性质的心得。
314
…………………………………………………………Page 377……………………………………………………………
第5章 總觀Application Framework
CMyWinApp theApp; // global object
。。。
这些对象之间的 BOOL CMyWinApp::InitInstance()
关联性非常强烈 {
CMultiDocTemplate* pDocTemplate;
,才有资格被称 pDocTemplate = new CMultiDocTemplate ( 应用程序挑选MFC 中的
为application IDR_MYTYPE;
RUNTIME_CLASS(CMyDoc); 类别,依序产生各对象。
framework。 RUNTIME_CLASS(CMyMDIChildWnd);
RUNTIME_CLASS(CMyView));
AddDocTemplate(pDocTemplate);
CMyMDIFrameWnd* pMyMainFrame = new CMyMDIFrameWnd;
。。。
}
CObject
CCmdTarget
MDIChildWnd
object CWinThread
CWinApp
CMyWinApp
Application Document
View object CWnd
object object
CView
CMyView
MDIFrameWnd CFrameWnd
object
CMDIFrameWnd CMyMDIFrameWnd
Application object 是全域对象,其它对象以'new' 动态产生。 CMDIChildWnd CMyMDIChildWnd
MFC 是一个零组件超级市场,所贩卖之零组件的 CDocument
功能以及零组件彼此之间的关系都已定义好;我 CMyDoc
们选择适当的零组件,兜出一个应用程序。 CDocTemplate
CMultiDocTemplate
图5…1 MFC 是一个零组件超级市场,所贩卖的零组件功能以及零组件彼此之
间的关系都已定义好;我们选择自己喜欢的零件,兜出一个应用程序。
Application Framework 究竟能提供我们多么实用的类别呢?或者我们这么问:哪些工作
已经被处理掉了,哪些工作必须由程序员扛下来?比方说一个标准的MFC 程序应该有
一个可以读写文件资料的功能,然而应用程序本身有它独特的数据结构,从MFC 得来的
零件可能与我的个人需求搭配吗?
我以另一个比喻做回答。
315
…………………………………………………………Page 378……………………………………………………………
第篇 湷觥 FC 程式設計
假设你买了一个整厂整线计划,包括仓贮、物料、MIS、生管,各个部门之间的搭配也
都建立起来了,包含在整厂整线计划内。这个厂原先是为了生产葡萄酒,现在改变主意
要生产白兰地,难道整个厂都不能用了吗?不!只要把进货原料改一改、发酵程序改一
改、瓶装程序改一改、整个厂的其它设备以及设备与设备之间的联机配合(这是顶顶重
要的)都可以再利用。物料之后到生管,装瓶之后到仓贮,仓贮之后到出货,再加上MIS
监控全厂,这些程序都是不必改变的。
一个整厂整线计划,每一单元之间的联机沟通,合作关系,都已经建立起来,是一种建
构好的运作模式。抽换某个单元的性质或部份性质,并不影响整体操作。「整厂整线」
最重要最有价值的是各单元之间的流程与控制。
反映到对象导向程序设计里头,Application Framework 就是「整厂整线规划」,Application
Framework 提供的类别就是上述工厂中一个一个的单元。最具价值的就是各类别之间的
交互运作模式。
虽然文件读写(此动作在MFC 称为Serialize)单元必须改写以符合个人所需,但是单
元与单元之间的关系依然存�
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!