第0章 你一定要知道(导读)

这本书适合谁

深入浅出MFC是一本介绍MFC(Microsoft Foundation Classes)程序设计技术的书籍。对于Windows 应用软件的开发感到兴趣,并欲使用Visual C++ 整合环境的视觉开发工具,以MFC为程序基础的人,都可以从此书获得最根本最重要的知识与实例。

如果你是一位对Application Framework和面向对象(Object Oriented)观念感兴趣的技术狂热份子,想知道神秘的Runtime Type Information、Dynamic Creation、Persistence、Message Mapping 以及Command Routing 如何实现,本书能够充分满足你。事实上,依我之见,这些核心技术与彻底学会操控MFC乃同一件事情。

全书分为四篇:

第一篇【勿在浮砂筑高台】提供进入 MFC 核心技术以及应用技术之前的所有技术基础,包括:

Win32 程序观念 :message based,event driven,multitasking, multithreading, console programming。

  • C++ 重要技术:类与对象、this 指针与继承、静态成员、虚函数与多态、模板(template)类、异常处理(exception handling)。

  • MFC 六大技术之简化仿真(Console 程序)

第二篇【欲善工事先利其器】提供给对Visual C++ 整合环境全然陌生的朋友一个导引。这一篇当然不能取代 Visual C++ User's Guide 的地位,但对整个软件开发环境有全盘以及概观性的介绍,可以让初学者迅速了解手上掌握的工具,以及它们的主要功能。

第三篇【浅出 MFC 程序设计】介绍一个 MFC 程序的生死因果。已经有 MFC 程序经验的朋友,不见得不会对本篇感到惊艳。根据我的了解,太多人使用 MFC 是「只知道这么做,不知道为什么」;本篇详细解释 MFC 程序之来龙去脉,为初入 MFC 领域的读者奠定扎实的基础。说不定本篇会让你有醍醐灌顶之感。

第四篇【深入 MFC 程序设计】介绍各式各样 MFC 技术。「只知其然 不知其所以然」的不良副作用,在程序设计的企图进一步开展之后,愈来愈严重,最终会行不得也!那些最困扰我们的 MFC 宏、MFC 常数定义,不得一窥堂奥的 MFC 黑箱作业,在本篇陆续曝光。本篇将使您高喊:Eureka!

阿基米得在洗澡时发现浮力原理,高兴得来不及穿上裤子,跑到街上大喊:Eureka(我找到了)。

范例程序方面,第三章有数个Console程序(DOS-like 程序,在Windows系统的DOS Box 中执行),模拟并简化Application Framework 六大核心技术。另外,全书以一个循序渐进的Scribble 程序(Visual C++ 所附范例),从第七章开始,分章探讨每一个MFC应用技术主题。第13章另有三个程序,示范 Multi-View 和 Multi-Document 的情况。

14章~16 章是第二版新增内容,主题分别是MFC 多线程程序设计、Custom AppWizard、以及如何使用Component Gallery 提供的ActiveX controls 和components。

你需要什么技术基础

从什么技术层面切入Windows软件开发领域?C/SDK?抑或C++/MFC?这一直是个引起争议的论题。就我个人观点,C++/MFC 程序设计必须跨越四大技术障碍:

1. 面向对象观念与C++ 语言。

2. Windows 程序基本观念(程序进入点、消息流动、窗口函数、callback...)。

3. Microsoft Foundation Classes(MFC)本身。

4. Visual C++ 整合环境与各种开发工具(难度不高,但需熟练)。

换言之,如果你从未接触C++,千万不要阅读本书,那只会打击你学习新技术的信心而已。如果已接触过C++ 但不十分熟悉,你可以一边复习C++ 一边学习MFC,这也是我所鼓励的方式(很多人是为了使用MFC 而去学习C++ 的)。C++ 语言的继承(inheritance)特性对于我们使用MFC尤为重要,因为使用MFC 就是要继承各个类并为己用。所以,你应该对C++ 的继承特质(以及虚函数,当然)多加体会。我在第2章安排了一些C++ 的必要基础。我所挑选的题目都是本书会用到的技术,而其深度你不见得能够在一般 C++ 书籍中发现。

如果你有C++ 语言基础,但从未接触过Win16 或 Win32 程序设计,只在 DOS 环境下开发过软件,我在第1章为你安排了一些 Win32 程序设计基础。这个基础至为重要,只会在各个 Wizards上按来按去,却不懂所谓 message loop 与 window procedure 的人,不可能搞定 Windows 程序设计——不管你用的是MFC或OWL或Open Class Library,不管你用的是Visual C++或Borland C++或VisualAge C++。

名词界定:

API**—Application Programming Interface** 系统开放出来,给程序员使用的接口,就是API。一般人的观念中API是指像 C 函数那样的东西,不尽然!DOS 的中断向量(interrupt vector)也可以说是一种API,OLE Interface(以 C++ 类的形式呈现)也可以说是一种 API。不是有人这么说吗:MFC 势将成为 Windows 环境上标准的 C++ API(我个人认为这句话已成为事实)。

SDK**—Software Development Kit** 原指软件开发工具。每一套环境都可能有自己的SDK,例如Phar Lap的386|DOS Extender 也有自己的SDK。在Windows这一领域,SDK原是指Microsoft 的软件开发工具,但现在已经变成一个一般性名词。凡以Windows raw API 撰写的程序我们通常也称为SDK程序。也有人把Windows API称为SDK API。Borland 公司的C++ 编译器也支持相同的SDK API(那当然,因为Windows只有一套)。本书如果出现「SDK 程序」这样的名词,指的就是以 Windows raw API 完成的程序。

MFC**—Microsoft Foundation Classes** 的缩写,这是一个架构在Windows API之上的C++ 类库(C++ Class Library),意图使 Windows 程序设计过程更有效率,更符合面向对象的精神。MFC 在争取成为「Windows 类库标准」的路上声势浩大。Symantec C++以及WATCOM C/C++已向微软取得授权,在它的软件开发平台上供应 MFC。Borland C++也可以吃进MFC程序代码——啊,OWL 的地位益形尴尬了。

OWL**—Object Windows Library** 的缩写,这也是一个具备Application Framework 架势的 C++ 类库,附含在 Borland C++ 之中。

Application Framework—在面向对象领域中,这是一个专有名词。关于它的意义,本书第5章有不少介绍。基本上它可以说是一个更有凝聚力,关联性更强的类库。并不是每一套C++类库都有资格称为Application Framework,不过MFC和OWL都可入列,IBM 的 Open Class Library 也是。Application Framework 当然不一定得是C++类库,Java和 Delphi 应该也都称得上。

为使全书文字流畅精简,我用了一些缩写字:

API - Application Programming Interface
DLL - Dynamic Link Library
GUI - Graphics User Interface
MDI - Multiple Document Interface
MFC - Microsoft Foundation Class
OLE - Object Linking & Embedded
OWL - Object Windows Library
SDK - Software Development Kit
SDI - Single Document Interface
UI  - User Interface
WinApp : Windows Application

以下是本书使用之中英文名词对照表:

Control          控制组件,如  Edit、ListBox、Button...。
drag & drop      拖放(鼠标左键按下,选中图示后拖动,然后放开)
Icon             图标(窗口缩小化后的小图样)
linked-list      串列
listbox          列表框、列表清单
notification     通告消息(发生于控制组件)
preemptive       强制性、先占式、优先权式
process          进程(一个执行起来的程序)
queue            队列
template        C++ 有所谓的class template,一般译为类模板;Windows 有所谓的dialog template,我把它译为对话框模板;MFC 有所谓的Document Template,我没有译它(其义请见第7章和第8章)
window class     窗口类(不是一种C++ 类)
window focus     窗口焦点(拥有焦点之窗口,将可以获得键盘输入)
class            类
object           对象
constructor      构造函数
destructor       析构函数
operator         运算符
override         改写
overloading      重载 ,亦有他书译为「过荷」
Encapsulation    封装
Inheritance      继承
Dynamic Binding  动态联编 ,亦即后期联编(late binding)
virtual function 虚函数
Polymorphism     多态 ,亦有他书译为「同名异式」
member function  成员函数
data member      成员变量,亦有他书译为「数据成员」
Base Class       基类,亦即父类
Derived Class    派生类,亦即子类

本书符号习惯

斜体字表示函数、常数、变量、语言保留字、宏、识别代码等等,例如:

CreateWindow              这是Win32 函数
Strtok                    这是C Runtime函数库的函数
WM_CREATE                 这是Windows消息
ID_FILE_OPEN              这是资源识别代码(ID)
CDocument::Serialize      这是MFC类的成员函数
m_pNewViewClass           这是MFC类的成员变量
BEGIN_MESSAGE_MAP         这是MFC宏
Public                    这是C++语言保留字