“深入浅出MFC(第2版)(附光盘)”
- 格式:doc
- 大小:4.79 KB
- 文档页数:3
“深入浅出MFC(第2版)(附光盘)”“深入浅出MFC(第2版)(附光盘)”的全部评论1.现在有很多人说C/C++已经没落了,在不久的将来终将退化到现在汇编语言(Assembly)的地位,基于C++的MFC自然也不能避免被淘汰的命运。
我不否认C++/MFC面对最新的基于动态语言的Web应用显得是多么的力不从心,也不否认大红大紫的Java、Perl、C#等后辈抢夺了MFC无数的风头,但是无论是出于对曾经在Win32历史上扮演过至关重要的角色的颇具神秘色彩的MFC的仰慕,还是出于希望深入理解编程语言与操作系统的交互关系的目的,抑或是为了能更有效的编写Win32应用程序,研究MFC内部运行机理都是必要的。
其实随着现在嵌入式开发的增长,C/C++的使用比例又有了一定程度的增加,这在今年的TIOBE排行榜上也可以得到印证。
而且有很多企业以前的系统都采用的是MFC,有大量的代码需要维护,所以阅读侯俊杰先生所著的《深入浅出MFC第二版》(英文名Dissecting MFC 2nd)之旅。
一个多月断断续续的研读,在合上此书最后一页的时候,我有了一种豁然开朗的感觉。
以前也看过一本介绍MFC程序设计的书籍,不过多是以例子为主,尽管有能力编写图形界面了,不过却是知其然不知其所以然——对于通过VC向导生成的代码有好多不明所以的地方,所幸MFC的使用者只需要按部就班地修改指定的函数体就行了,其余的交给IDE(Integrated Development Environment 集成开发环境)好了——此所谓第一种层次吧。
不过VC++相比其它的RAD(Rapid Application Development 快速应用程序开发)工具(如VB)却是有着本质的不同。
在VC++中,虽然使用者可以同VB一样通过IDE完成大部分的工作,但是VC++并不掩饰反应程序运行机理的代码;而在VB中程序员能看到的只有自己添加的代码。
很难说那种方式一定最好吧,毕竟各有各的用户群。
mfc使用手册MFC(Microsoft Foundation Class Library)是微软提供的一个类库,用于简化Windows应用程序的开发过程。
以下是MFC使用手册的简要介绍:1. 简介:MFC是一个基于C++的类库,它提供了许多用于构建Windows应用程序的类和函数。
通过使用MFC,开发人员可以快速地构建具有一致外观和感觉的应用程序,并利用Windows平台提供的各种功能。
2. 安装和配置:在开始使用MFC之前,您需要安装Microsoft Visual Studio并确保安装了MFC开发工作负载。
安装完成后,您需要创建一个新的MFC项目或打开一个现有的MFC项目。
3. 创建MFC应用程序:要创建一个新的MFC应用程序,您需要使用Microsoft Visual Studio的向导。
选择“File”菜单中的“New”选项,然后选择“Project”。
在弹出的对话框中,选择“MFC Application”并按照向导的提示完成应用程序的创建过程。
4. MFC类库:MFC提供了许多用于构建应用程序的类和函数。
以下是一些常用的MFC类:CWinApp:应用程序对象类,用于管理应用程序级别的操作,例如初始化应用程序和退出应用程序。
CWnd:窗口类,用于管理窗口的各种操作,例如创建窗口、处理消息和绘制窗口。
CDocument:文档类,用于管理应用程序中的文档数据。
CView:视图类,用于管理应用程序中的视图,例如显示文档数据和与用户交互。
5. MFC消息处理:MFC使用消息传递机制来处理用户与应用程序的交互。
每个窗口和控件都处理一组预定义的消息,例如鼠标点击、键盘输入和窗口大小改变等。
通过覆盖类中的虚函数,您可以定义应用程序如何响应这些消息。
6. MFC对话框和控件:MFC提供了许多内置的对话框和控件,例如按钮、文本框和列表框等。
您可以使用对话框编辑器来创建对话框,并将控件拖放到对话框中。
一、引言上一专题中,纯手动地完成了一个Windows应用程序,然而,在实际开发中,我们大多数都是使用已有的类库来开发Windows应用程序。
MFC(Microsoft Foundation Class, 微软基础类库)是微软为了简化程序员的开发工作而将Windows API 封装到C++类中,利用这些类,程序员可以有效地完成Windows平台下应用程序的开发。
本专题将详细剖析它。
二、利用向导创建一个MFC程序用于帮助有效地开发Windows应用程序的类库除了MFC外,还有其他开源类库提供,比如说QT,只是QT不是微软开发的罢了,为了更好地剖析MFC,下面让我们用Visual Studio 中的MFC模板和向导工具来创建一个基于MFC的单文档(SDI)应用程序。
1.启动Visual studio 2010,单击文件(FIle)菜单——>新建项目——>项目,在出现的项目窗口中选择Visual C++ 语言,然后选择MFC应用程序,并输入项目的名称为SDIMFC,具体如下图所示。
2.输入项目名称后点击确定按钮,将出现MFC应用程序向导窗口,点击下一步,应用程序类型选择:单个文档,如下图所示:3. 点击下一步,出现MFC向导的第三个对话框,复合文档支持保持默认选择,然后在出现的对话框中一直点击下一步来完成一个单文档MFC应用程序的创建。
下面,按下Ctrl+F5来运行MFC应用程序,之后将看到我们创建的MFC 应用程序界面,具体如下图所示:在上面的程序中,我们并没有编写任何代码,运行它后就生成了一个带标题栏,系统菜单,具有最大化、最小化框和一个可调边框的应用程序,这一切的工作都是由MFC的向导工具帮我们完成,即该向导工具为我们生成了很多代码,下面就以这个简单的MFC程序来分析下MFC框架。
三、MFC框架详细解析我们看下用MFC向导工具帮我们生成的哪些代码。
你可以在VS中点击类视图选项卡(如果VS界面上没有看到类视图的,可以通过菜单栏视图—>类视图的方式显示出来),就可以看到如下图所示的类。
过去,我对每本作品(着译皆然),总是把握新刷机会,修正每次滑鼠左键按下,开始一条线条,图8-10a中的程式立刻四方形和一个圆形,并和线条一起加入 CObList以下为发现後之当时公告(永远有效)。
各位亲爱的读友:我是侯俊杰。
最近我开一个课程,使用 <深入浅出 MFC> 2/e做教材(ISBN 957-22-2518-9,松岗书号 2101629),发现本书第3刷缺少一张跨页彩色图,此图应该出现在封面之後的扉页位置。
第1刷和第2刷均有此图,独第3刷漏失。
此图为 MFC 4.21 类别阶层架构图,至为重要。
我个人以及松岗公司对此装订上的疏失深感懊恼与抱歉。
松岗公司为维护读者权益,决定加印此图,免费提供给<深入浅出 MFC> 二版3刷之读者索取。
索取方式有三:1. 亲至松岗各门市索取。
2. 进入松岗网页(),对客服部留言函索。
3. FAX 至松岗客服部(02-23257956)函索此图。
以 2 或 3 方式索取者,请留下您的邮寄地址;松岗将以邮递方式将图寄给您。
您不必出示任何读者证明。
因此疏失而为您带来麻烦,我与松岗公司谨至最大的歉意。
虽然疏失的发现时机有点迟,我们愿尽最大的努力弭补。
同时也请您将此讯息告诉您的朋友。
我与松岗公司均力图在每一次可能的机会中,修正内容误失,力求让此书更美好。
我要藉此机会感谢每一位写信给我,向我指正或给我意见的读友。
-- 侯俊杰 1998.05.16★ <深入浅出 MFC> 二版4刷 ★ 出版日期:1998/??本刷内容与3刷完全相同。
★ <深入浅出 MFC> 二版五刷 ★ 出版日期:1998/09●新增读者来函 i~xvi(16 页)二版五刷感言 4 页●模糊不清 重制(括号内为 chap1 之前的页次):(11,17,18,19,26,28,33,)1,35,53,68,81,83,84,101,119,121,137,147,149,269,293,296,641,771,779,784,795,834,839●内容误失:页次:p9 方块内 L5原文: eneric.res : generic.rc generic.h更正:generic.res : generic.rc generic.h页次:p16 图1-3 左下 L-6原文:CW_USEDEFAULT, // hieght更正:CW_USEDEFAULT, // height页次:p27 中段程式码 L2 片段原文:if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)更正:if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) {页次:p58原文:#0029更正:#0029 {页次:p65 中段程式码片段原文:void setComm(float comm);更正:void setCommission(float comm);页次:p74 L8原文:踪合更正:综合页次:p75 第四段 L3原文:CYaohoo更正:CYahoo页次:p94 L-1原文:vitual更正:virtual页次:p132 Frame3 范例程式 之前 L-3原文:Cobject更正:C O bject页次:p262 L2原文:预设市关闭状态更正:预设是关闭状态页次:p408 程式码片段 L5原文:filename = dlg.GetPathNMe();更正:filename = opendlg.GetPathNMe();页次:p408 程式码片段下第一行原文:opdndlg 构建式的第一个叁数被指定为...更正:opendlg 构建式的第一个叁数被指定为...页次:p493 L-4 尾原文:Document/View/Frmae更正:Document/View/Frame页次:p535 L-6原文:包容 DYNCREATION 巨集,并且在...更正:包容 DYNCREATE 巨集,并且在...页次:p541 L-1,L-3原文:图10-a更正:图8-10a★ <深入浅出 MFC> 二版六刷 ★ 出版日期:1999/01页次:p72 L12原文:pEmp = &aBoss;更正:pEmp = &aManager;◆以下 p85~p88 的错误主要是 SavingAccount 笔误为 SavingAccout。
深入浅出MFC一Contents[Trial version] 目录[Trial version] 第0章你一定要知道(导读)[Trial version] 第1章Win32基本程序观念[Trial version] 第2章C++的重要性质[Trial version] 第3章MFC六大关键技术之模拟[Trial version] 第5章总观AlicationFramework[Trial version] 第6章MFC程序设计导论[Trial version] 第7章简单而完整:MFC骨干程序[Trial version] 第8章Document-View深入探讨[Trial version] 第9章消息映射与命令绕行[Trial version] 第10章MFC与对话框[Trial version] 第11章View功能之加强与重绘效率之提升[Trial version] 第12章打印与预览[Trial version] 第13章多重文件与多重显示[Trial version] 第14章MFC多线程程序设计[Trial version] 第15章定制一个AWizard[Trial version] 第16章站上众人的肩膀--使用Comonents&am;amActiveXControls[Trial version] 附录A无责任书评[Amber demo]owered By Gisun htt://目录第0章你一定要知道(导读)/1这本书适合谁/1你需要什么技术基础/1你需要什么软硬件环境让我们使用同一种语言本书符号习惯/3磁盘内容与安装范例程序说明第一篇勿在浮砂筑高台- 本书技术前提/3 第1章Win32 程序基本观念/3Win32程序开发流程/4需要什么函数库(.LIB)/4需要什么头文件(.H)/4以消息为基础以事件驱动之/5一个具体而微的Win32 程序/5程序进入点WinMain/10窗口类之注册与窗口之诞生/11 消息循环/12窗口的生命中枢—窗口函数/12 消息映射(Message Ma)雏形/13 对话框的运作/14模块定义文件(.DEF)/14资源描述文件(.RC)/15 Windows 程序的生与死/15闲置时间的处理:OnIdle /16 Console 程序/17Console 程序与DOS 程序的差别/17 Console 程序的编译链接/18JBACKU:Win32 Console 程序设计/19 MFCCON:MFC Console 程序设计/20什么是C Runtime Library 的多线程版本/22 进程与线程(rocess and Thread)/22核心对象/22一个进程的诞生与死亡/23产生子进程/23一个线程的诞生与死亡/24以_beginthreadex取代CreateThread/25线程优先权(riority)/26多线程程序设计实例/27第2章C++ 的重要性质/29类及其成员—谈封装(encasulation)/29基类与派生类—谈继承(Inheritance)/29this 指针/31虚函数与多态(olymorhism)/32类与对象大解剖/40Object slicing 与虚函数/42静态成员(变量与函数)/44C++程序的生与死:兼谈构造函数与析构函数/46四种不同的对象生存方式/47所谓“Unwinding”/48运行时类型信息(RTTI)/48动态生成(Dynamic Creation)/50异常处理(Excetion Handling)/50 Temlate /53Temlate Functions /53Temlate Classes /54Temlates 的编译与链接/56第3章MFC六大关键技术之模拟/57MFC类阶层/57Frame1范例程序/57MFC程序的初始化过程/59Frame2范例程序/61RTTI(运行时类型辨识)/65 CRuntimeClass与类型录/65DECLARE_DYNAMIC / IMLEMENT_DYNAMIC宏/66 Frame3 范例程序/71IsKindOf(类型辨识)/77Frame4 范例程序/77Dynamic Creation(动态生成)/78DECLARE_DYNCREATE / IMLEMENT_DYNCREATE 宏/79 Frame6 范例程序/84ersistence(永续生存)机制/91Serialize(数据读写)/91DECLARE_SERIAL/IMLEMENT_SERIAL 宏/95没有范例程序Message Maing(消息映射)/97Frame7 范例程序/104Command Routing(命令循环)/112Frame8 范例程序/119本章回顾/130第二篇欲善工事先利其器-Visual C++ 5.0 开发工具第4章Visual C++ - 整合性软件开发环境安装与组成四个重要的工具内务府总管:Visual C++ 整合开发环境关于roject关于工具设定Source BrowserOnline Hel除错工具VC++ 除错器Excetion Handling程序代码产生器—AWizard东圈西点完成MFC 程序骨干Scribble Ste0威力强大的资源器Icon 器Cursor器Bitma器ToolBar器VERSIONINFO资源器String Table器Menu 器Accelerator 器Dialog 器Console 程序的项目管理第三篇浅出MFC程序设计第5章总观Alication Framework /130 什么是Alication Framework /130侯捷怎么说/130我怎么说/131别人怎么说/133为什么使用Alication Framework /134 Microsoft Foundation Class(MFC)/136 白头宫女话天宝:Visual C++与MFC/137 纵览MFC /138General urose classes /138Windows AI classes /139Alication framework classes /140High level abstractions /140Afx全局函数/140MFC宏(macros)/141MFC数据类型(data tye)/142第6章MFC程序设计导论——MFC程序的生死因果/144 不二法门:熟记MFC类的阶层架构/144需要什么函数库(.LIB)/146需要什么含入文件(.H)/146简化的MFC程序架构—以Hello MFC为例/148Hello 程序原始代码/148MFC 程序的来龙去脉/152我只借用两个类:CWinA和CFrameWnd /152 CWinA—取代WinMain的地位/152CFrameWnd—取代Wndroc的地位/154引爆器—Alication object /155隐晦不明的WinMain /156AfxWinInit - AFX 内部初始化动作/158CWinA::InitAlication /160CMyWinA::InitInstance /160CFrameWnd::Create 产生主窗口(并注册窗口类)/161 奇怪的窗口类名称Afx:b:14ae:6:3e8f/168 窗口显示与更新/170CWinA::Run - 程序生命的活水源头/170把消息与处理函数串接在一起:Message Ma机制/172来龙去脉总整理/173Callback 函数/174闲置时间(idle time)的处理:OnIdle/176 Dialog 与Control/178通用对话框(Common Controls)/178本章回顾/179第7章简单而完整:MFC 骨干程序/180 不二法门:熟记MFC 类的阶层架构/180 MFC程序的UI新风貌/180Document/View 支撑你的应用程序/181 利用Visual C++工具完成Scribble ste0 /183骨干程序使用哪些MFC类?/183Document Temlate的意义/187Scribble的Document/View 设计/190主窗口的诞生/192工具列和状态列的诞生(Toolbar &am; Status bar)/193 鼠标拖放(Drag and Dro)/195消息映射(Message Ma)/196标准菜单File/Edit/View/Window/Hel/196对话框/199改用CEditView /199第四篇深入MFC程序设计/199第8章Document-View 深入探讨/200为什么需要Document-View(形而上)/200 Document /200View /201Document Frame(View Frame)/202Document Temlate /202CDocTemlate 管理CDocument / CView / CFrameWnd /202 Scribble Ste1 的Document(数据结构设计)/207 MFC Collection Classes 的选用/207Temlate-Based Classes /208Temlate-Based Classes 的使用方法/209CScribbleDoc 的修改/209 SCRIBBLEDOC.H /211 SCRIBBLEDOC.C /212文件:一连串的线条/215 CScribbleDoc 的成员变量/215 CObList /215CScribbleDoc 的成员函数/215 线条与坐标点/217CStroke 的成员变量/217 CArray<Coint, Coint> /217 CStroke 的成员函数/217Scribble Ste1 的View:数据重绘与/218 CScribbleView 的修改/218 SCRIBBLEVIEW.H /219SCRIBBLEVIEW.C /220View 的重绘动作—GetDocument和OnDraw /222 CScribbleView的成员变量/222 CScribbleView的成员函数/223View 与使用者的交谈(鼠标消息处理实例)/223 ClassWizard 的辅佐/224WizardBar 的辅佐/225Serialize:对象的文件读写/225Serialization以外的文件读写动作/226 台面上的Serialize动作/227台面下的Serialize写文件奥秘/231台面下的Serialize读文件奥秘/233 DYNAMIC / DYNCREATE / SERIAL 三宏/240 Serializable 的必要条件/244CObject 类/245IsKindOf/245IsSerializable/245CObject::Serialize/245CArchive类/246oerator<<和oerator>>/246效率考虑/250自定SERIAL宏给抽象类使用/250在CObList中加入CStroke 以外的类/250 Document与View 交流—为Scribble Ste4做准备/254 第9章消息映射与命令循环/255到底要解决什么/255消息分类/256万流归宗Command Target(CCmdTarget)/256三个奇怪的宏一张巨大的/257 DECLARE_MESSAGE_MA 宏/257消息映射的形成:BEGIN_/ON_/END_ 宏/258米诺托斯(Minotauros)与西修斯(Theseus)/261 两万五千里长征—消息的流窜/265直线上溯(一般Windows 消息)/265拐弯上溯(WM_COMMAND 命令消息)/268罗塞达碑石:AfxSig_xx 的秘密/273Scribble Ste2:UI 对象的变化/277改变菜单/277改变工具列/278利用ClassWizard连接命令项识别代码与命令处理函数/280 维护UI对象状态(UDATE_COMMAND_UI)/282本章回顾/285第10章MFC 与对话框/285对话框器/286利用ClassWizard 连接对话框与其专属类/288ENDLG.H /290ENDLG.C /291对话框的消息处理函数/292MFC中各式各样的MA /294对话框数据交换与查核(DDX &am; DDV)/294MFC中各式各样的DDx_函数/297如何唤起对话框/297本章回顾/299第11章View功能之加强与重绘效率之提升/299同时修改多个Views:UdateAllViews 和OnUdate/300 在View中定义一个hint/302把hint传给OnUdate/304利用hint增加重绘效率/305可卷动的窗口:CScrollView /307大窗口中的小窗口:Slitter /313分裂窗口的功能/313分裂窗口的程序概念/314分裂窗口之实现/315本章回顾/317第12章印表与预览/317概观/317打印动作的后台原理/320MFC预设的打印机制/324Scribble打印机制的补强/333打印机的页和文件的页/333配置GDI绘图工具/334尺寸与方向:关于映射模式(坐标系统)/334分页/336表头(Header)与表尾/338动态计算页代码/338打印预览(rint review)/339本章回顾/339第13章多重文件与多重显示/339 MDI 和SDI /340多重显像(Multile Views)/340窗口的动态分裂/342窗口的静态分裂/343 CreateStatic 和CreateView /343窗口的静态三叉分裂/345Grah 范例程序/346静态分裂窗口之观念整理/354同源子窗口/355 CMDIFrameWnd::OnWindowNew/355 Text 范例程序/356非制式作法的缺点/361多重文件/361新的Document类/362新的Document Temlate /363新的UI系统/364新文件的文件读写动作/365第14章MFC多线程程序设计(Multi-threaded rogramming in MFC)/367从操作系统层面看线程/367三个观念:模块、进程、线程/367线程优先权(riority)/368线程排程(Scheduling)/369Thread Context /370从程序设计层面看线程/371Worker Threads 和UI Threads /371错误观念/372正确态度/372MFC多线程程序设计/372探索CwinThread/372产生一个Worker Thread/374产生一个UI Thread /375线程的结束/376线程与同步控制/376 MFC多线程程序实例/378第15章定制一个AWizard /380到底Wizard是什么?/381Custom AWizard 的基本操作/381剖析AWizard Comonents /385Dialog Temlates 和Dialog Classes /385Macros /386Directives /387动手修改To Studio AWizard/387利用资源器修改IDD_CUSTOM1对话窗画面/387 利用ClassWizard 修改CCustom1Dlg类/388改写OnDismiss 虚函数在其中定义macros /389 修改text temlate/389To Studio AWizard执行结果/390更多的信息/390第16章站上众人的肩膀—使用Comonents和ActiveX Controls/391 什么是Comonent Gallery /391使用Comonents /393Slash screen /393System Info for About Dlg /394Tis of the Day /394Comonents实际运用:ComTest 程序/395修改ComTest 程序内容/409使用ActiveX Controls /411ActiveX Control 基础观念:roerties、Methods、Events/411ActiveX Controls 的五大使用步骤/412使用“Grid”ActiveX Control:OcxTest 程序/413[Amber demo]owered By Gisun htt://第0章你一定要知道(导读)这本书适合谁深入浅出MFC是一本介绍MFC(Microsoft Foundation Classes)程序设计技术的书籍。
《深入浅出MFC》中关于永久保存机制的问题《深入浅出MFC》中谈到Persistence(永久保存机制)时,P126中提出了一个例子:我们可以在每次记录对象内容的时候,先写入一个代码,表示此对象的类是否曾在文件中记录过了。
如果是新类,乖乖地记录其类名称;如果是旧类,则以代码表示。
这样可以节省文件大小以及程序用于解析的时间。
下面是新的构想,也就是Serialization的目标:20 03 84 03 ;Document size06 00 ;CObList elements countFF FF ;new class tag02 00 ;schema07 00 ;class name string length43 53 74 72 6F 6B 65 ;“CStroke”02 00 ; DWordArray Size28 00 13 00 ; point28 00 13 00 ; pointFF FF ;new class tag01 00 ;schema0A 00 ; class name string length43 52 65 63 74 61 6E 67 6C 65 ; ”CRectangle”11 00 22 00 33 00 44 00 ; CRectFF FF ;new class tag01 00 ; schema07 00 ; class name string length43 43 69 72 63 6C 65 ; “circle”55 00 66 00 77 00 ; CPoint & radius01 80 ; old class tag02 00 ; DWordArray size28 00 35 00 ; point28 00 35 00 ; point03 80 ; old class tag11 00 22 00 33 00 44 00 ; CRect05 80 ; old class tag55 00 66 00 77 00 ; CPoint & radius我看到这里有一个疑问,比如01 80 ; old class tag那么它表示旧类,但是是表示哪一种旧类呢?这个机制是如何识别的呢?还有schema又有什么意义呢?(或者说什么作用呢?)。
浅析MFC特殊界面及双缓冲技术的实现作者:张丹丹来源:《科技创新导报》2012年第21期摘要:Vc++是微软推出的面向对象的可视化集成编程系统,随Visual C++的发布还包括MFC-微软基础类,MFC提供的类很多用于界面开发,并设计了合理的消息映射机制和相应的消息处理函数,实现设备环境绘图等。
中图分类号:TP3 文献标识码:A 文章编号:1674-098X(2012)07(c)-0004-021 引言,是经典的windows视窗和windows应用程序的开发平台。
为了减少程序设计人员工作开发量它提供有效的应用程序框架,对类进行了封装,大部分是从Cobject里派生而来的,包含窗口类、图形设备接口类、对象链接和嵌入类、文件和数据库类、输入/输出类、异常类等等。
利用MFC提供的类我们可以方便做出一些不规则形状的界面,同时利用双缓冲原理有效解决界面抖动或界面显示慢的问题。
当窗口被改变大小,被最小最大化,或被关闭再打开,或者被另一个窗口覆盖的时候,窗体都面临着重绘,于是Window触发WM_PAINT消息处理复杂图形的绘制,由于过多的刷频导致图形显示出抖动、缓慢等症状,利用内存设备环境,具体归纳为双缓冲技术,可以有效解决这一问题。
2 MFC提供的设备环境类MFC提供的类很多用于界面开发,其中一个重要的类—CDC,提供了处理设备环境,如显示器、打印机等设备的成员函数。
MFC将GDI(图形设备接口)封装在CDC类中,因此可以调用该类成员函数完成诸如各种颜色、尺寸,不同图形的绘图操作,同时GDI具有设备无关性,程序员也无需考虑设备的类型。
CDC的这种设备无关性,使Windows下的绘图等程序不直接面向物理设备,而通过虚拟的设备描述表进行。
设备描述表又称设备上下文或设备环境,它是一种Windows下的数据结构,它存储了设备绘图属性信息。
应用程序不能直接访问设备描述表,只能由各种相关API函数通过设备描述表的句柄间接访问该结构。
深入浅出mfc开发流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!MFC(Microsoft Foundation Classes)是微软提供的一个 C++类库,用于开发 Windows 应用程序。
“深入浅出MFC(第2版)(附光盘)”的全部评论
1.现在有很多人说C/C++已经没落了,在不久的将来终将退化到现在汇编语言(Assembly)的地位,基于C++的MFC自然也不能避免被淘汰的命运。
我不否认C++/MFC面对最新的基于动态语言的Web应用显得是多么的力不从心,也不否认大红大紫的Java、Perl、C#等后辈抢夺了MFC无数的风头,但是无论是出于对曾经在Win32历史上扮演过至关重要的角色的颇具神秘色彩的MFC的仰慕,还是出于希望深入理解编程语言与操作系统的交互关系的目的,抑或是为了能更有效的编写Win32应用程序,研究MFC内部运行机理都是必要的。
其实随着现在嵌入式开发的增长,C/C++的使用比例又有了一定程度的增加,这在今年的TIOBE排行榜上也可以得到印证。
而且有很多企业以前的系统都采用的是MFC,有大量的代码需要维护,
所以阅读侯俊杰先生所著的《深入浅出MFC第二版》(英文名Dissecting MFC 2nd)之旅。
一个多月断断续续的研读,在合上此书最后一页的时候,我有了一种豁然开朗的感觉。
以前也看过一本介绍MFC程序设计的书籍,不过多是以例子为主,尽管有能力编写图形界面了,不过却是知其然不知其所以然——对于通过VC向导生成的代码有好多不明所以的地方,所幸MFC的使用者只需要按部就班地修改指定的函数体就行了,其余的交给IDE(Integrated Development Environment 集成开发环境)好了——此所谓第一种层次吧。
不过VC++相比其它的RAD(Rapid Application Development 快速应用程序开发)工具(如VB)却是有着本质的不同。
在VC++中,虽然使用者可以同VB一样通过IDE完成大部分的工作,但是VC++并不掩饰反应程序运行机理的代码;而在VB中程序员能看到的只有自己添加的代码。
很难说那种方式一定最好吧,毕竟各有各的用户群。
VB针对入门级的程序员,以简单快速的开发方式吸引大家上手;VC++则面向系统级的程序员,提供高率的编译代码以及访问底层系统属性的能力。
透过VC++暴露给程序员的代码,侯俊杰先生引领读者将MFC的各项重要机制一一“剖膛破肚”。
令我大开眼界的是MFC的框架竟然能在编译器不提供RTTI(运行时类型信息)支持的情况下,完成了该框架所必须的RTTI功能。
MFC将Macro(宏、巨集)的功能简直发挥到了极致。
尽管相较于Java、C#等面向对象领域的后起之秀来说,MFC的宏确实显得有些笨拙和缺乏可读性,但是在当时的环境之下,通过宏来实现却不得不说是一种优雅。
剖析MFC让我领略到一个应用程序框架的结构,能被成为框架而不是仅仅是类库的东西,关键在于类与类之间绝不是简单独立的关系。
在框架中,类和类必须
通力协作才能完成所需的功能。
也就是说,我们在使用框架的时候绝对可以像使用类库一样随心所欲——这是当然的咯,要得到框架的服务,自然要遵循人家的游戏规则。
这就是很多习惯了字符环境下编程的C程序员过渡到 MFC框架下一时间难以适应的原因。
我不是那种在理解了原理之后就忘记当初初试MFC的痛苦经历的人,也许正是通过不断的挫折和积累,让我在阅读《深入浅出MFC》时不断能从以前的实践中找到书中所述要点的印证,不时地得到新的理解和启示,同时也鼓励我继续地把这本书好好的研读下去。
如果必须要为C程序员做一个关于应用程序框架的恰当的比喻的话,我想可以把这个框架理解成main函数中传入命令行参数的机制:为了从命令行中获取信息,你需要定义argc, argv 两个参数,OS会自动帮你填入值;同样的道理,为了捕捉鼠标事件、按钮的点击事件并设置
相关函数进行处理,你自然不能越MFC的规矩办事咯。
希望这个有些简陋的比喻能对挣扎在MFC一线的苦手有所帮助和启示吧。
另外,我还发现一本孙鑫先生的VC书籍也甚是不错,是按视频改编的,也建议大家看看,视频在网上都能找到。
2.这本书写于2001年,至今历经9年而不衰,我买到时已是第22次印刷,虽然出版年代比较久,但内容至尽多数仍不过时,
侯先生的这本书介绍MFC视角独特,主要是分析MFC框架,以让人从宏观上把握和更好的使用MFC。
我需要强调的是,这不是一本针对MFC初学者需要快速上手写程序而准备的书,而是一本增加MFC使用功力的书,您很有必要在阅读本书前具备如下知识:
1.c++知识作为基础铺垫--比如明白概念“继承”,“多态”甚至“模板”等。
2.具备所谓的Windows SDK编程经验--比如知道Windows程序从WinMain开始执行,知道一个程序需要注册窗口类,创建窗口,知道消息循环,窗口处理函数等概念。
3.你最好具备MFC程序编写经验,也就是说知道在MFC中要写一个程序实现自己的功能应该在哪里增加代码,映射消息等。
再强调一次,这是本向高手进阶的书(阅读数万行代码的大型框架程序时会有感触),不是教初学者学习怎样写MFC程序的书,作为初学尤其是想快速用MFC写程序的人,这本书不合适。
作者侯先生的许多书籍深受读者喜爱,侯先生自评中“好读书,求甚解”一句在本书的内容中做了完美诠释。
也许有人会认为书的内容有些罗嗦,但我理解和欣赏侯先生的这些内容。
摘录几句书中经典的话:
1.MFC框架简化程序书写,但不是让程序更容易阅读。
2.以往你只是知道踩刹车时不要踩离合器,现在通过对本书的
阅读,你理解了这样做是为了避免失去引擎的刹车牵制力。
同时,希望侯先生能够有一个健康的身体,良好的心态,能够为读者继续书写和翻译优秀的作品,谢谢!
3.现在有很多人说C/C++已经没落了,在不久的将来终将退化到现在汇编语言(Assembly)的地位,基于C++的MFC自然也不能避免被淘汰的命运。
我不否认C++/MFC面对最新的基于动态语言的Web应用显得是多么的力不从心,也不否认大红大紫的Java、Perl、C#等后辈抢
夺了MFC无数的风头,但是无论是出于对曾经在Win32历史上扮演过至关重要的角色的颇具神秘色彩的MFC的仰慕,还是出于希望深入理解编程语言与操作系统的交互关系的目的,抑或是为了能更有效的编写Win32应用程序,研究MFC内部运行机理都是必要的
4.。