按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
随后又在更新版本上增加了OLE 架构、DAO 架构。。。。为了让你有一个最轻松的起点,
我把第一个程序简化到最小程度,舍弃Document…View 架构,使你能够尽快掌握
C++/MFC 程序的面貌。这个程序并不以AppWizard 制作出来,也不以ClassWizard 管
理维护,而是纯手工打造。毕竟Wizards 做出来的程序代码有一大堆批注,某些批注对
Wizards 有特殊意义,不能随便删除,却可能会混淆初学者的视听焦点;而且Wizards 所
产生的程序骨干已具备Document…View 架构,又有许多奇奇怪怪的宏,初学者暂避为
妙。我们目前最想知道的是一个最阳春的MFC 程序以什么面貌呈现,以及它如何开始
运作,如何结束生命。
SDK 程序设计的第一要务是了解最重要的数个API 函数的意义和用法, 像是
RegisterClass 、CreateWindow、GetMessage、DispatchMessage ,以及消息的获得与分配。
MFC 程序设计的第一要务则是熟记MFC 的类别阶层架构,并清楚知晓其中几个一定会
用到的类别。本书最后面有一张MFC 4。2 架构图,叠床架屋,令人畏惧,我将挑出单单
两个类别,组合成一个〃Hello MFC〃 程序。这两个类别在MFC 的地位如图6…1 所示。
346
…………………………………………………………Page 409……………………………………………………………
第6章 MFC 程式的生死因果
CObject
CObject
CCmdTarget
CCmdTarget
CWinThread
CWinThread
CWinApp
CWinApp
CMyWinApp
CMyWinApp
CWnd
CWnd
CFrameWnd
CMyFrameWnd
CMyFrameWnd
图6…1 本章范例程序所用到的MFC 类别
需要什么函数库?
开始写码之前,我们得先了解程序代码以外的外围环境。第一个必须知道的是,MFC 程序
需要什么函数库?SDK 程序联结时期所需的函数库已在第一章显示,MFC 程序一样需
要它们:
■ Windows C Runtime函数库(VC++ 5。0 )
文件名称 文件大小 说明
LIBC。LIB 898826 C Runtime 函数库的静态联结版本
MSVCRT。LIB 510000 C Runtime 函数库的动态联结版本
MSVCRTD。LIB 803418 'D' 表示使用于Debug 模式
* 这些函数库不再区分Large/Medium/Small 内存模式,因为32 位操作系统不再有记
忆体模式之分。这些函数库的多线程版本,请参考本书#38 页。
347
…………………………………………………………Page 410……………………………………………………………
第篇 湷觥 FC 程式設計
■
DLL Import 函数库(VC++ 5。0 )
文件名称 文件大小 说明
( )
GDI32。LIB 307520 for GDI32。DLL 136704 bytes in Win95
( )
USER32。LIB 517018 for USER32。DLL 45568 bytes in Win95
( )
KERNEL32。LIB 635638 for KERNEL32 DLL 413696 bytes in Win95
。。。
此外,应用程序还需要联结一个所谓的MFC 函数库,或称为AFX 函数库,它也就是MFC
这个application framework 的本体。你可以静态联结之,也可以动态联结之,AppWizard
给你选择权。本例使用动态联结方式,所以需要一个对应的MFC import 函数库:
■ MFC 函数库(AFX 函数库) (VC++ 5。0,MFC 4。2)
文件名称 文件大小 说明
( )的
MFC42。LIB 4200034 MFC42。DLL 941840 bytes import 函数库。
( )的
MFC42D。LIB 3003766 MFC42D。DLL 1393152 bytes import 函数库。
MFCS42。LIB 168364
MFCS42D。LIB 169284
MFCN42D。LIB 91134
MFCD42D。LIB 486334
MFCO42D。LIB 2173082
。。。
我们如何在联结器(link。exe ) 中设定选项,把这些函数库都联结起来? 稍后在
HELLO。MAK 中可以一窥全貌。
如果在Visual C++ 整合环境中工作,这些设定不劳你自己动手,整合环境会根据我们圈
选的项目自动做出一个合适的makefile 。这些makefile 的内容看起来非常诘屈聱牙,事
实上我们也不必太在意它,因为那是整合环境的工作。这一章我不打算依赖任何开发工
具,一切自己来,你会在稍后看到一个简洁清爽的makefile 。
348
…………………………………………………………Page 411……………………………………………………………
第6章 MFC 程式的生死因果
需要什么头文件?
SDK 程序只要包含WINDOWS。H 就好,所有API 的函数声明、消息定义、常数定义、
宏定义、都在WINDOWS。H 档中。除非程序另调用了操作系统提供的新模块(如
mDlg、ToolHelp 、DDEML。。。 ),才需要再各别包含对应的。H 档。
WINDOWS。H 过去是一个巨大文件,大约在5000 行上下。现在已拆分内容为数十个较小
的。H 档,再由WINDOWS。H 包含进来。也就是说它变成一个〃Master included file for
Windows applications〃 。
MFC 程序不这么单纯,下面是它常常需要面对的另外一些。H 档:
■
STDAFX。H 这个文件用来做为Prepiled header file (请看稍后的方块说
明),其内只是包含其它的MFC 头文件。应用程序通常会准备自己的
■ STDAFX。H,例如本章的Hello 程序就在STDAFX。H 中包含AFXWIN。H 。
AFXWIN。H 每一个Windows MFC 程序都必须包含它,因为它以及它所包含
■
的文件声明了所有的MFC 类别。此档内含AFX。H ,后者又包含AFXVER_。H ,
后者又包含AFXV_W32。H ,后者又包含WINDOWS。H (啊呼,终于现身)。
■
AFXEXT。H 凡使用工具栏、状态列之程序必须包含这个文件。
■
AFXDLGS。H 凡使用通用型对话框(mon Dialog)之MFC 程序需包含此
档,其内部包含MDLG。H 。
AFXCMN。H 凡使用Windows 95 新增之通用型控制组件(mon Control )
■
之MFC 程序需包含此文件。
AFXCOLL。H 凡使用Collections Classes (用以处理数据结构如数组、串行)
■
之程序必须包含此文件。
■
AFXDLLX。H 凡MFC extension DLLs 均需包含此档。
AFXRES。H MFC 程序的RC 文件必须包含此档。MFC 对于标准资源(例如
■
File、Edit 等菜单项目)的ID 都有默认值,定义于此文件中,例如:
349
…………………………………………………………Page 412……………………………………………………………
第篇 湷觥 FC 程式設計
// File mands
#define ID_FILE_NEW 0xE100
#define ID_FILE_OPEN 0xE101
#define ID_FILE_CLOSE 0xE102
#define ID_FILE_SAVE 0xE103
#define ID_FILE_SAVE_AS 0xE104
。。。
// Edit mands
#define ID_EDIT_COPY 0xE122
#define ID_EDIT_CUT 0xE123
。。。
这些菜单项目都有预设的说明文字(将出现在状态列中),但说明文字并不会事先定义
于此文件,AppWizard 为我们制作骨干程序时才把说明文字加到应用程序的RC 文件中。第
4章的骨干程序Scribble step0 的RC 档中就有这样的字符串表格: