本书分为四大篇。第一篇提出学习MFC程序设计之前的必要基础,包括Widnows程序的基本观念以及C++的高阶议题。“学前基础”是相当主观的认定,不过,甚于我个人的学习经验以及教学经验,我的挑选应该颇具说服力。第二篇介绍Visual C++整合环境开发工具。本篇只不过是提纲挈领而已,并不企图取代 Visual C++使用手册。然而对于软件使用的老手,此篇或已足以让您掌握Visual C++整合环境。工具的使用虽然谈不上学问,但在视觉化软件开发过程中扮演极重角色,切莫小觑它。 第三篇介绍application framework的观念,以及MFC骨干程序,所谓骨干程序,是指Visual C++的工具AppWizard所产生出来的程序码。当然,AppWizard会根据你的选项做出不同的程序码,我所据以解说的,是大众化选项下的产品。 第四篇以微软公司附于Visual C++光碟片上的一个范例程序Scribble为主轴,一步一步加上新的功能。并在其间深入介绍Runtime Type Information(RTTI)、Dynamic Creation、Persistence(Serialization)、Message Mapping、Command Routing等核心技术。这些技术正是其他书籍最缺乏的部分。此篇之最后数章则脱离Scribble程序,另成一格。 \r\n 本书内含光盘一片,书中所有原始码与可执行文件尽在其中。
第0章 你一定要知道(导读)\r\n这本书适合谁\r\n你需要什么技术基础\r\n你需要什么软硬件环境\r\n让我们使用同一种语言\r\n本书符号习惯\r\n本书例程的取得\r\n范例程序说明\r\n与前版本之差异\r\n如何联络作者\r\n\r\n第一篇 勿在浮砂筑高台\r\n第1章 Win32程序基本概念\r\nWin32程序开发流程\r\n需要什么函数库(.LIB)\r\n需要什么头文件(.H)\r\n以消息为基础,以事件驱动之(message based,event driven)\r\n一个具体而微的Win32程序\r\n程序进入点WinMain\r\n窗口类之注册与窗口之诞生\r\n消息循环\r\n窗口的生命中枢:窗口函数\r\n消息映射(Message Map)的雏形\r\n对话框的运行\r\n模块定义文件(.DEF)\r\n资源描述档(.RC)\r\nWidnows程序的生与死\r\n空闲时间的处理:OnIdle\r\nConsole程序\r\nConsole程序与DOS程序的差别\r\nConsole程序的编译链接\r\nJBACKUP:Win32 Console程序设计\r\nMFCCON:MFC Console程序设计\r\n行程与线程(Process and Thread)\r\n核心对象\r\n一个行程的诞生与死亡\r\n产生子行程\r\n一个线程的诞生与死亡\r\n以_beginthreadex取代CreateThread\r\n线程优先级(Priority)\r\n多线程程序设计实例\r\n\r\n第2章 C++的重要性质\r\n类及其成员——谈封装(encapsulation)\r\n基类与派生类:谈继承(Inheritance)\r\nthis指针\r\n虚拟函数与多态(Polymorphism)\r\n类与对象大解剖\r\nObject slicing与虚拟函数\r\n静态成员(变量与函数)\r\nC++程序的生与死:兼谈构造函数与解构函数\r\n四种不同的对象生存方式(in stack、in heap、global、local static)\r\n执行期类型信息(RTTI)\r\n动态生成(Dynamic Creation)\r\n异常处理(Exception Handling)\r\nTemplate\r\nTemplate Functions\r\nTemplate Classes\r\nTemplate的编译与链接\r\n\r\n第3章 MFC六大关键技术之仿真\r\nMFC类层次结构\r\nFrame 1范例程序\r\nMFC程序的初始化过程\r\nFrame 2范例程序\r\nRTTI(执行期类型识别)\r\n类别型录网与CRuntimeClass\r\nDECLARE_DYNAMIC/IMPLEMENT_DYNAMIC宏\r\nFrame 3范例程序\r\nIsKindOf(类型识别)\r\nFrame 4范例程序\r\nDynamic Creation(动态生成)\r\nDECLARE_DYNCREATE/IMPLEMENT_DYNCREATE宏\r\nFrame 6范例程序\r\nPersistence(永久保存)机制\r\nSerialize(数据读写)\r\nDECLARE_SERIAL/IMPLEMENT_SERIAL宏\r\n没有范例程序\r\nMessage Mapping(消息映射)\r\nFrame 7范例程序\r\nCommand Routing(命令传递)\r\nFrame 8范例程序\r\n本章回顾\r\n\r\n第二篇 欲善工事先利其器\r\n第4章 Visual C++集成开发环境\r\n安装与组成\r\n四个重要的工具\r\n内务府总管:Visual C++集成开发环境\r\n关于project\r\n关于工具设定\r\nSource Browser\r\nOnline Help\r\n调试工具\r\nVC++调试器\r\nException Handling\r\n程序代码产生器:AppWizard\r\n东圈西点完成MFC程序骨干\r\n威力强大的资源编辑器\r\nIcon编辑器\r\nCursor编辑器\r\nBitmap编辑器\r\n工具栏(Toolbar)编辑器\r\nVERSIONINFO资源编辑器\r\n字符串表格(Accelerator)编辑器\r\n菜单(Menu)编辑器\r\n加速键(Accelerator)编辑器\r\n对话框(Dialog)编辑器\r\nConsole程序的项目管理\r\n\r\n第三篇 浅出MFC程序设计\r\n第5章 总观Application Framework\r\n什么是Application Framework?\r\n侯捷怎么说\r\n我怎么说\r\n别人怎么说\r\n为什么使用Application Framework\r\nMicrosoft Foundation Classes(MFC)\r\n白头宫女话天宝:Visual C++与MFC\r\n纵览MFC\r\nGeneral Purpose classes\r\nCObject\r\n数据处理类(collection classes)\r\n杂项类\r\n异常处理类(exception handling classes)\r\nWindows API classes\r\nApplication framework classes\r\nHigh level Abstractions\r\nAfx全局函数\r\nMFC宏(macros)\r\nMFC数据类型(data types)\r\n\r\n第6章 MFC程序的生死因果\r\n不二法门:熟记MFC类的层次结构\r\n需要什么函数库?\r\n需要什么头文件?\r\n简化的MFC程序结构——以Hello MFC为例\r\nHello程序程序代码\r\nMFC程序的来龙去脉(causal relations)\r\n我只借用两个类:CWinApp和CFrameWnd\r\nCWinApp——取代WinMain的地位\r\nCFrameWnd——取代WndProc的地位\r\n引爆器——Application object\r\n隐晦不明的WinMain\r\nAfxWinInit——AFX内部初始化操作\r\nCWinApp::InitApplication\r\nCMyWinApp::InitInstance\r\nCFrameWnd::Create产生主窗口(并先注册窗口类)\r\n奇怪的窗口类名称Afx:b:14ae:6:3e8f\r\n窗口显示与更新\r\nCWinApp::Run——程序生命的活水源头\r\n把消息与处理函数连接在一起:Message Map机制\r\n来龙去脉总整理\r\nCallback函数\r\n空闲时间(idle time)的处理:OnIdle\r\nDialog与Control\r\n通用对话框(Common Dialogs)\r\n本章回顾\r\n\r\n第7章 简单而完整:MFC骨干程序\r\n不二法门:熟记MFC类层次结构\r\nMFC程序的UI新风貌\r\nDocument/View支撑你的应用程序\r\n利用Visual C++工具完成Scribble step0\r\n骨干程序使用哪些MFC类?\r\nDocument Template的意义\r\nScribble的Document/View设计\r\n主窗口的诞生\r\n工具栏和状态栏的诞生(Toolbar&Status bar)\r\n鼠标拖放(Drag and Drop)\r\n消息映射(Message Map)\r\n标准菜单File/Edit/View/Window/Help\r\n对话框\r\n改用CEditView\r\n\r\n第四篇 深入MFC程序设计\r\n第8章 Document-View深入探讨\r\n为什么需要Document-View(形而上)\r\nDocument\r\nView\r\nDocument Frame(View Frame)\r\nDocument Template\r\nCDocTemplate管理CDocument/CView/CFrameWnd\r\nScribble Step1的Document——数据结构设计\r\nMFC Collection Classes的选用\r\nCScribbleDoc的修改\r\n文件:一连串的线条\r\n线条与坐标点\r\nScribble Step 1的View:数据重绘与编辑\r\nCScribbleView的修改\r\nView的重绘操作:GetDocument和OnDraw\r\nClassWizard的辅佐\r\nWizardBar的辅佐\r\nSerialize:对象的档案读写\r\nSerialization以外的档案读写操作\r\n台面上的Serialize操作\r\n台面下的Serialize写档奥秘\r\n台面下的Serialize读档奥秘\r\nDYNAMIC/DYNCREATE/SERIAL三宏\r\nSerializable的必要条件\r\nCObject类\r\nIsKindOf\r\nIsSerializable\r\nCObject::Serialize\r\nCArchive类\r\noperator《和operator》\r\n效率考虑\r\n自定SERIAL宏给抽象类使用\r\n在CObList中加入CStroke以外的类\r\nDocument与View交流——为Step4做准备\r\n\r\n第9章 消息映射与命令传递\r\n到底要解决什么\r\n消息分类\r\n万流归宗Command Target(CCmdTarget)\r\n三个奇怪的宏,一张巨大的网\r\nDECLARE_MESSAGE_MAP宏\r\n消息映射网的形成:BEGIN…/ON…/END…宏\r\n米诺托斯(Minotauros)与西修斯(Theseus)\r\n二万五千里长征——消息的传递\r\n直线上溯(一般Windows消息)\r\n拐弯上溯(WM_COMMAND命令消息)\r\n罗塞达碑石:AfxSig_xx的奥秘\r\nScribble Step2:UI对象的变化\r\n改变菜单\r\n改变工具栏\r\n利用ClassWizard连接命令项识别码与命令处理函数\r\n维护UI对象状态(UPDATE_COMMAND_UI)\r\n本章回顾\r\n\r\n第10章 MFC与对话盒\r\n对话框编辑器\r\n利用ClassWizard连接对话框与其专用类\r\n对话框的消息处理函数\r\n对话框数据交换与校验(DDX&DDV)\r\n如何唤起对话框\r\n本章回顾\r\n\r\n第11章 View功能的加强与重绘效率的提高\r\n同时修改多个Views:UpdateAllViews和OnUpdate\r\n在View中定义一个hint\r\n把hint传给OnUpdate\r\n利用hint增加重绘效率\r\n可卷动的窗口:CScrollView\r\n大窗口中的小窗口:Splitter\r\n切分窗口的功能\r\n切分窗口的程序概念\r\n切分窗口的实现\r\n本章回顾\r\n\r\n第12章 打印与预览\r\n概述\r\n打印操作的后台原理\r\nMFC默认的打印机制\r\nScribble打印机制的增强\r\n打印机的页和文件的页\r\n配置GDI绘图工具\r\n尺寸与方向:关于映射方式(坐标系统)\r\n分页\r\n页眉与页脚\r\n动态计算页码\r\n打印预览(Print Preview)\r\n本章回顾\r\n\r\n第13章 多重文件与多重显示\r\nMDI和SDI\r\n多重显示(Multiple Views)\r\n窗口的动态切分\r\n窗口的静态切分\r\nCreateStatic和CreateView\r\n窗口的静态三叉切分\r\nGraph范例程序\r\n静态切分窗口之观念整理\r\n同源子窗口\r\nCMDIFrameWnd::OnWindowNew\r\nText范例程序\r\n非标准做法的缺点\r\n多重文件\r\n新的Cocument类\r\n新的Document Template\r\n新的UI系统\r\n新文件的档案读写操作\r\n\r\n第14章 MFC多线程程序设计\r\n从操作系统层面看线程\r\n三个观念:模块、行程和线程\r\n线程优先级(Priority)\r\n线程调度(Scheduling)\r\nThread Context\r\n从程序设计层面看线程\r\nWorker Threads和UI Threads\r\n错误观念\r\n正确态度\r\nMFC多线程程序设计\r\n探索CWinThread\r\n产生一个Worker Thread\r\n产生一个UI Thread\r\n线程的结束\r\n线程与同步控制\r\nMFC多线程程序例程\r\n\r\n第15章 定制一个AppWizard\r\n到底Wizard是什么?\r\nCustom AppWizard的基本操作\r\n剖析AppWizard Components\r\nDialog Templates和Dialog classes\r\nMacros\r\nDirectives\r\n动手修改Top Studio AppWizard\r\n利用资源编辑器修改IDD_CUSTOM1对话框画面\r\n利用ClassWizard修改IDD_CUSTOM1对话框的对应类CCustomlDlg\r\n改写OnDismiss虚拟函数,在其中定义macros\r\n修改text template\r\nTop Studio AppWizard执行结果\r\n更多的信息\r\n\r\n第16章 站上众人的肩膀——使用Components&activeX Controls\r\n什么是Component Gallery\r\n使用Components\r\nSplash screen\r\nsystem Info for About Dlg\r\nTip of the Day\r\nComponents实际运用:ComTest程序\r\n修改ComTest程序内容\r\n使用ActiveX Controls\r\nActiveX Control基础观念:Properties、Methods、Events\r\nActiveX Controls的五大使用步骤\r\n使用ActiveX Control:OcxTest程序\r\n\r\n第五篇 附录\r\n附录A 无责任书评:从摇篮到坟墓Windows的完全学习\r\n无责任书评:MFC四大天王\r\n附录B Scribble Step 5完整原始码\r\n附录C Visual C++5.0MFC范例程序一览\r\n附录D 以MFC重建DBWIN \r\n
任何人看到前面的读者来函,都会感动于一本电脑书籍的读者与作者竟然能够产生如此深厚的共鸣,以及似无若有的长期情感。
何况,身为这本书的作者的我!
我写的是一本技术书籍,但是赢得未曾谋面的朋友们的信赖与感情。我知道,那是因为这本书里面也有许多我自己的感情。每当收到读友们针对这本书寄来的信件(纸张的或电子的),我总是怀着感恩的心情仔细阅读。好几位读友,针对书中的可疑处或是可以更好的地方,不吝啬地拨出时间,写满一大张一大张的信纸,一一向我指正。我们谈的不只是技术,还包括用词遣字的意境。新竹刘嘉均先生和加拿大陈宗泰先生给我非常宝贵的技术上的意见。陈先生甚至在一个月内来了五封航空信。
这些,怎不教我心怀感谢,并且更加戒慎恐惧!
感谢所有读者促成这本书的更精致化。Visual C++ 5.0面世了,MFC则停留在4.2,程序设计的主轴没有什么大改变。对于新读者,本书乃全新产品自不待言,您可以从目录中细细琢磨所有的主题。对于老读者,本书所带给您的,是更精致的制作,以及数章新增的内容(请看第0章“与前版本之差异”)。
最后,我要说,我知道,这本书真的带给许多人很扎实的东西。而我之所以愿意不计代价去做些不求近利的深耕工作,除了这是身为专业作家的责任,以及个人的兴趣之外是的,我自已是工程师,我最清楚工程师在学习MFC时想知道什么、在哪里触礁。
所有出自我笔下的东西,我自己受益最丰。
感谢你们。