MFC程序的来龙去脉一(摘自《深入浅出MFC——侯捷》)

一、CWinApp——取代WinMain 的地位
CWinApp的派生对象被称为application object,可以想见,CWinApp本身就代表一个程序本体。CWinApp声明包含在AFXWIN.H文件中,传统上SDK程序的WinMain所完成的工作现在由CWinApp的三个函数完成:
virtual BOOL InitApplicaton();
virtual BOOL InitInstance();
virtual int Run();
记录主窗口handle的成员变量m_pMainWnd也包含在CWinThread中了(CWinApp的父类,MFC2.5包含在CWinApp中)
CWinApp的定义在AFXWIN.H中
二、CFrameWnd——取代WndProc的地位
传统的SDK窗口函数写法是:
 
MFC程序有新的做法,我们在Hello程序也为CMyFrameWnd准备了两个消息处理程序,声明如下

OnPaint处理WM_PAINT,后者处理WM_COMMAND的IDM_ABOUT。
引爆——Application object
下图中的theApp就是Hello程序的application object,每一个MFC应用程序都有一个而且也只有这么一个全局对象。

父类CWinApp的构造函数在APPCORE.CPP文件中




theApp配置完成后,WinMain登场。MFC早已准备好并由链接器直接加到应用程序代码中的,如下:_tWinMain函数的“_t”是为了支持Unicode而准备的一个宏。
 

此外,在DLLMODUL.CPP中有一个DLLMain函数。
AfxWinMain在WinMain.cpp中定义可见Windows程序进入点,程序代码可从MFC的WINMAIN.CPP中获得。

其中,AfxGetApp是一个全局函数,定义于AFXWIN1.INL中
_AFXWIN_INLINE CWinApp* AFXAPI AfxGetApp()
{return afxCurrentWinApp;}
而afxCurrentWinApp 有定义于AFXWIN.H中:
#define afxCurrentWinApp AfxGetModuleState()->m_pCurrentWinApp
  再根据稍早所诉CWinApp::CWinApp中的操作,我们于是知道,AfxGetApp其实就是取得CMyWinApp对象指针。所以,AfxWinMain中这样的操作:
CWinApp* pApp = AfxGetApp();
pApp->InitApplication();
pApp->InitInstance();
nReturnCode = pApp->Run();
导致调用:
CWinApp::InitApplication();//因为CMyWinApp并没有改写InitApplication.
CMyWinApp::InitInstance();//因为CMyWinApp改写了InitInstance
CWinApp::Run();//因为CMyWinApp并没有改写Run
InitApplication应该是注册窗口类的场所,InitInstance应该是产生窗口并显示窗口的场所,Run应该是获得消息并分派消息的场所。
下面分别讨论AfxWinMain的四个主要操作以及引发的行为。
AfxWinInit——AFX内部初始化操作
AfxWinInit是继CWinApp构造函数之后的第一个操作。(定义在APPINIT.CPP)
其中调用的AfxInitThread函数的操作摘要如下(在THRDCORE.CPP中定义)


MFC注册四个窗口类,但不再是AfxWinInit中完成。

CWinApp::InitApplication
因为InitApplication是CWinApp的一个虚拟函数;而在CMyWinApp中并没有改写它,所以pApp->InitApplication()调用的是CWinApp::InitApplication。 此函数在APPCORE.CPP中定义

CMyWinApp::InitInstance
因为InitInstance在CMyWinApp被定义所以pApp->InitInstance();调用CMyWinApp::InitInstance
注意:应用程序一定要改写虚函数InitInstance,因为他在CWinApp中只是个空函数,没有任何内建(默认)操作。

CFrameWin::Create产生主窗口:(并先注册窗口类)

CMyWinApp::InitInstance一开始new了一个CMyFrameWnd对象,准备用作主框架窗口的C++对象。new会引发构造函数:
CMyFrameWnd::CMyFrameWnd
{
  Create(NULL,"Hello MFC",WS_OVERLAPPEDWINDOW,rectDefault,NULL,"MainMenu");
}
其中Create 是CFrameWnd的成员函数,它将产生一个窗口。但,使用哪一个窗口类呢?(这里所谓的“窗口类”是由RegisterClass所注册的一份数据结构,不是C++类)。根据CFrameWnd::Create 的规格:
BOOL Create(LPCTSTR lpszClassName,
       LPCTSTR lpszWindowName,
       DWORD dwStyle = WS_OVERLAPPEDWINDOW,
       const RECT& rect = rectDefault,
       CWnd* pParentWnd = NULL,
       LPCTSTR lpszMenuName =NULL,
       DWORD dwExStyle =0,
       CCreateContext* pContext =NULL);
  八个参数中的后六个参数都有默认值,只有前两个参数必须指定。
第一个参数lpszClassName指定WNDCLASS窗口类,我们放置NULL代表的意思是要以MFC内建的窗口类产生一个标准的外框窗口。但,此时此刻Hello程序根本不存在任何窗口,Create函数在产生窗口之前会引发窗口类的注册操作,
第二个参数lpszWindowName指定窗口标题。
第三个参数dwStyle指定窗口风格,默认是WS_OVERLAPPEDWINDOW,也正是最常用的一种,他被定义为(在WINDWS.H之中):
#define WS_OVERLAPPEDWINDOW(WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX)
因此,如果你不想要窗口右上角的极大极小钮,就得这么做:
Create(NULL,"Hello MFC",WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME,rectDefault,NULL,"MainMenu");
如果希望窗口有垂直滚动条,就得在第三个参数上再增加WS_VSCROLL风格。除了上述标准的另有扩充风格,在Create的第七个参数dwExStyle指定之。扩充风格唯有以::CreateWindowEx(而非::CreateWindow)函数才能完成。其实CFrameWnd::Create最终调用的正是:CreateWindowEx.
Windows3.1提供五种窗口扩充风格:
WS_EX_DLGMODALFRAME、WS_EX_NOPARENTNOTIFY、WS_EX_TOPMOST、WS_EX_ACCEPTFILES、WS_EX_TRANSPARENT
Windows9x有更多选择,包括WS_EX_WINDOWEDGE和WS_EX_CLIENTEDGE,让窗口更具3D立体感。
Create的 第四个参数 rect指定窗口的位置与大小。默认值rectDefault是CFrameWnd的一个static成员变量,
可以为Create(NULL,"Hello MFC",WS_OVERLAPPEDWINDOW,CRect(40,60,240,460),NULL,"MainMenu");//起始位置(40,60),宽200,高400
第五个参数pParentWnd指定父窗口。对于一个top-level窗口而言,此值应为NULL,表示没有父窗口(其实是有的,父窗口就是desktop窗口)
第六个参数lpszMenuName指定菜单。本例使用一份在RC中准备好的菜单"MainMenu"。
第八个参数pContext是一个指向CCreateContext结构的指针,framework利用它,在具备Document/View结构的程序中初始化外窗口(第8章)本例不具备Document/View结构默认值为NULL.

具体的Create实现如下在WINFRM.CPP中


在函数中调用CreateEx.注意,CWnd有成员函数CreateEx,但其派生类CFrameWnd并没有改变虚函数CreateEx,所以这里虽然调用的是CFrameWnd::CreateExx,其实是从父类继承下来的CWnd::CreateEx。

函数中调用的PreCreateWindow是虚函数,在CWnd和CFrameWnd中都有定义。由于this指针所指对象的缘故,这里应该调用的是CFrameWnd::PreCreateWindow(还记得第2章的虚函数的那种行为方式)
WINFRM.CPP

其中AfxDeferRegisterClass是一个AFXIMPL.H中的宏




出现在上述函数中的六个窗口类卷标代码,分别定义与AFXIMPL.H中:
#define AFX_WND_REG          (0x0001)
#define AFX_WNDCONTROLBAR_REG     (0x0002)
#define AFX_WNDMDIFRAME_REG      (0x0004)
#define AFX_WNDFRAMEORVIEW_REG   (0x0008)
#define AFX_WNDCOMMCTLS_REG     (0x0010)
#define AFX_WNDOLECONTROL_REG     (0x0020)
出现在上述函数中的五个窗口类名称,分别定义与WINCORE.CPP中:
const TCHAR _afxWnd[] =AFX_WND;
const TCHAR _afxWndControlBar[] =AFX_WNDCONTROLBAR;
const TCHAR _afxWndMDIFrame[] =AFX_WNDMDIFRAME;
const TCHAR _afxWndFrameOrView[] =AFX_WNDFRAMEORVIEW;
const TCHAR _afxWndOleControl[] =AFX_WNDOLECONTROL;
等号右边的那些AFX_常数又定义于AFXIMPL.H中:

AfxEndDeferRegisterClass的操作。它调用两个函数完成实际的窗口类注册操作,一个是RegisterWithIcon,一个是AfxRegisterClass:


注意,不同类的PreCreateWindow成员函数都是在窗口产生之前一刻被调用,准备用来注册窗口类。如果我们指定类是NULL,那么就使用系统默认类。从CWnd及其各个派生类的PreCreateWindow成员函数可以看出,整个Framework针对不同功能的窗口使用了那些窗口类:



指定图标和光标形状实为RegisterClass责任而非CreateWindow的责任!
  MFC开放了一个窗口,可以在HELLO.RC中这样设定图标:
AFX_IDI_STDFRAME ICON DISCARDABLE "HELLO.ICO"
你可以从AfxEndDeferRegisterClass的第55行看出,当它调用RegisterWithIcon时,指定的icon正是AFX_IDI_STD_FRAME。
  鼠标光标必须调用AfxRegisterWndClass(其中有"Cursor"参数)注册自己的窗口类:然后再将其返回值(一个字符串)作为Create的第一个参数。
奇怪的窗口类名称 Afx:b:14ae:6:3e8f
  当应用程序调用CFrameWnd::Create(或CMDIFrameWnd::LoadFrame,第7章)准备产生窗口时,MFC才会在Create或LoadFrame内部调用的PreCreateWindow虚拟函数中为你产生适当的窗口类。这些窗口类的名称分别是
"AfxWnd42d"、"AfxControlBar42d"、"AfxMDIFrame42d"、"AfxFrameCrView42d"、"AfxOleControl42d"
利用spy++(vc++所附的一个工具)观察窗口类的名称时,Application Framework 将把这些窗口类的名称转换为Afx:x:y:z:w的类型,成为独一无二的窗口类名称
x:窗口风格(window style)的hex值
y:窗口鼠标光标hex值
z:窗口后台颜色的hex值
w:窗口图标(icon)的hex值

如果你要使用原来的(MFC默认的)那些个窗口类,但又希望拥有自己定义的一个有意义的类名称,你可以改写PreCreateWindow虚函数(因为Create和LodFrame的内部会调用它),在其中先利用API函数GetClassInfo获得该类的一个副本,更改其类结构中的lpszClassName字段(甚至更改其hIcon字段),再以AfxRegisterClass重新注册之

窗口显示与更新

CMyFrameWnd::cMyFrameWnd结束后,窗口已经诞生出来;程序流程又回到CMyWinApp::InitInstance,于是调用ShowWindow函数令窗口显示出来,并调用UpdateWindow函数令Hello程序送出WM_PAINT消息。

转载于:https://www.cnblogs.com/yelinpalace/archive/2009/09/29/1576355.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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。
深入浅出MFC(第二版) 目录 第0章 你一定要知道(导读) 这本书适合谁 你需要什么技术基础 你需要什么软硬件环境 让我们使用同一种语言 本书符号习惯 本书例程的取得 范例程序说明 与前版本之差异 如何联络作者 第一篇 勿在浮砂筑高台 第1章 Win32程序基本概念 Win32程序开发流程 需要什么函数库(.LIB) 需要什么头文件(.H) 以消息为基础,以事件驱动之(message based,event driven) 一个具体而微的Win32程序 程序进入点WinMain 窗口类之注册与窗口之诞生 消息循环 窗口的生命中枢:窗口函数 消息映射(Message Map)的雏形 对话框的运行 模块定义文件(.DEF) 资源描述档(.RC) Widnows程序的生与死 空闲时间的处理:OnIdle Console程序 Console程序与DOS程序的差别 Console程序的编译链接 JBACKUP:Win32 Console程序设计 MFCCON:MFC Console程序设计 行程与线程(Process and Thread) 核心对象 一个行程的诞生与死亡 产生子行程 一个线程的诞生与死亡 以_beginthreadex取代CreateThread 线程优先级(Priority) 多线程程序设计实例 第2章 C++的重要性质 类及其成员——谈封装(encapsulation) 基类与派生类:谈继承(Inheritance) this指针 虚拟函数与多态(Polymorphism) 类与对象大解剖 Object slicing与虚拟函数 静态成员(变量与函数) C++程序的生与死:兼谈构造函数与解构函数 四种不同的对象生存方式(in stack、in heap、global、local static) 执行期类型信息(RTTI) 动态生成(Dynamic Creation) 异常处理(Exception Handling) Template Template Functions Template Classes Template的编译与链接 第3章 MFC六大关键技术之仿真 MFC类层次结构 Frame 1范例程序 MFC程序的初始化过程 Frame 2范例程序 RTTI(执行期类型识别) 类别型录网与CRuntimeClass DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC宏 Frame 3范例程序 IsKindOf(类型识别) Frame 4范例程序 Dynamic Creation(动态生成) DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE宏 Frame 6范例程序 Persistence(永久保存)机制 Serialize(数据读写) DECLARE_SERIAL/IMPLEMENT_SERIAL宏 没有范例程序 Message Mapping(消息映射) Frame 7范例程序 Command Routing(命令传递) Frame 8范例程序 本章回顾 第二篇 欲善工事先利其器 第4章 Visual C++集成开发环境 安装与组成 四个重要的工具 内务府总管:Visual C++集成开发环境 关于project 关于工具设定 Source Browser Online Help 调试工具 VC++调试器 Exception Handling 程序代码产生器:AppWizard 东圈西点完成MFC程序骨干 威力强大的资源编辑器 Icon编辑器 Cursor编辑器 Bitmap编辑器 工具栏(Toolbar)编辑器 VERSIONINFO资源编辑器 字符串表格(Accelerator)编辑器 菜单(Menu)编辑器 加速键(Accelerator)编辑器 对话框(Dialog)编辑器 Console程序的项目管理 第三篇 浅出MFC程序设计 第5章 总观Application Framework 什么是Application Framework? 侯捷怎么说 我怎么说 别人怎么说 为什么使用Application Framework Microsoft Foundation Classes(MFC) 白头宫女话天宝:Visual C++MFC 纵览MFC General Purpose classes CObject 数据处理类(collection classes) 杂项类 异常处理类(exception handling classes) Windows API classes Application framework classes High level Abstractions Afx全局函数 MFC宏(macros) MFC数据类型(data types) 第6章 MFC程序的生死因果 不二法门:熟记MFC类的层次结构 需要什么函数库? 需要什么头文件? 简化的MFC程序结构——以Hello MFC为例 Hello程序程序代码 MFC程序来龙去脉(causal relations) 我只借用两个类:CWinApp和CFrameWnd CWinApp——取代WinMain的地位 CFrameWnd——取代WndProc的地位 引爆器——Application object 隐晦不明的WinMain AfxWinInit——AFX内部初始化操作 CWinApp::InitApplication CMyWinApp::InitInstance CFrameWnd::Create产生主窗口(并先注册窗口类) 奇怪的窗口类名称Afx:b:14ae:6:3e8f 窗口显示与更新 CWinApp::Run——程序生命的活水源头 把消息与处理函数连接在一起:Message Map机制 来龙去脉总整理 Callback函数 空闲时间(idle time)的处理:OnIdle Dialog与Control 通用对话框(Common Dialogs) 本章回顾 第7章 简单而完整:MFC骨干程序 不二法门:熟记MFC类层次结构 MFC程序的UI新风貌 Document/View支撑你的应用程序 利用Visual C++工具完成Scribble step0 骨干程序使用哪些MFC类? Document Template的意义 Scribble的Document/View设计 主窗口的诞生 工具栏和状态栏的诞生(Toolbar&Status bar) 鼠标拖放(Drag and Drop) 消息映射(Message Map) 标准菜单File/Edit/View/Window/Help 对话框 改用CEditView 第四篇 深入MFC程序设计 第8章 Document-View深入探讨 为什么需要Document-View(形而上) Document View Document Frame(View Frame) Document Template CDocTemplate管理CDocument/CView/CFrameWnd Scribble Step1的Document——数据结构设计 MFC Collection Classes的选用 CScribbleDoc的修改 文件:一连串的线条 线条与坐标点 Scribble Step 1的View:数据重绘与编辑 CScribbleView的修改 View的重绘操作:GetDocument和OnDraw ClassWizard的辅佐 WizardBar的辅佐 Serialize:对象的档案读写 Serialization以外的档案读写操作 台面上的Serialize操作 台面下的Serialize写档奥秘 台面下的Serialize读档奥秘 DYNAMIC/DYNCREATE/SERIAL三宏 Serializable的必要条件 CObject类 IsKindOf IsSerializable CObject::Serialize CArchive类 operator《和operator》 效率考虑 自定SERIAL宏给抽象类使用 在CObList中加入CStroke以外的类 Document与View交流——为Step4做准备 第9章 消息映射与命令传递 到底要解决什么 消息分类 万流归宗Command Target(CCmdTarget) 三个奇怪的宏,一张巨大的网 DECLARE_MESSAGE_MAP宏 消息映射网的形成:BEGIN…/ON…/END…宏 米诺托斯(Minotauros)与西修斯(Theseus) 二万五千里长征——消息的传递 直线上溯(一般Windows消息) 拐弯上溯(WM_COMMAND命令消息) 罗塞达碑石:AfxSig_xx的奥秘 Scribble Step2:UI对象的变化 改变菜单 改变工具栏 利用ClassWizard连接命令项识别码与命令处理函数 维护UI对象状态(UPDATE_COMMAND_UI) 本章回顾 第10章 MFC与对话盒 对话框编辑器 利用ClassWizard连接对话框与其专用类 对话框的消息处理函数 对话框数据交换与校验(DDX&DDV) 如何唤起对话框 本章回顾 第11章 View功能的加强与重绘效率的提高 同时修改多个Views:UpdateAllViews和OnUpdate 在View中定义一个hint 把hint传给OnUpdate 利用hint增加重绘效率 可卷动的窗口:CScrollView 大窗口中的小窗口:Splitter 切分窗口的功能 切分窗口的程序概念 切分窗口的实现 本章回顾 第12章 打印与预览 概述 打印操作的后台原理 MFC默认的打印机制 Scribble打印机制的增强 打印机的页和文件的页 配置GDI绘图工具 尺寸与方向:关于映射方式(坐标系统) 分页 页眉与页脚 动态计算页码 打印预览(Print Preview) 本章回顾 第13章 多重文件与多重显示 MDI和SDI 多重显示(Multiple Views) 窗口的动态切分 窗口的静态切分 CreateStatic和CreateView 窗口的静态三叉切分 Graph范例程序 静态切分窗口之观念整理 同源子窗口 CMDIFrameWnd::OnWindowNew Text范例程序 非标准做法的缺点 多重文件 新的Cocument类 新的Document Template 新的UI系统 新文件的档案读写操作 第14章 MFC多线程程序设计 从操作系统层面看线程 三个观念:模块、行程和线程 线程优先级(Priority) 线程调度(Scheduling) Thread Context 从程序设计层面看线程 Worker Threads和UI Threads 错误观念 正确态度 MFC多线程程序设计 探索CWinThread 产生一个Worker Thread 产生一个UI Thread 线程的结束 线程与同步控制 MFC多线程程序例程 第15章 定制一个AppWizard 到底Wizard是什么? Custom AppWizard的基本操作 剖析AppWizard Components Dialog Templates和Dialog classes Macros Directives 动手修改Top Studio AppWizard 利用资源编辑器修改IDD_CUSTOM1对话框画面 利用ClassWizard修改IDD_CUSTOM1对话框的对应类CCustomlDlg 改写OnDismiss虚拟函数,在其中定义macros 修改text template Top Studio AppWizard执行结果 更多的信息 第16章 站上众人的肩膀——使用Components&activeX Controls 什么是Component Gallery 使用Components Splash screen system Info for About Dlg Tip of the Day Components实际运用:ComTest程序 修改ComTest程序内容 使用ActiveX Controls ActiveX Control基础观念:Properties、Methods、Events ActiveX Controls的五大使用步骤 使用ActiveX Control:OcxTest程序 第五篇 附录 附录A 无责任书评:从摇篮到坟墓Windows的完全学习 无责任书评:MFC四大天王 附录B Scribble Step 5完整原始码 附录C Visual C++5.0MFC范例程序一览 附录D 以MFC重建DBWIN收起
这是一本讲述vc的经典书籍,对您一定会有很大的帮助的,这是第二版,后面没有续篇了,还停留在VC++5.0,现在都6.0很久了,不过确实是VC经典书刊了。 第一篇提出学习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程序,另成一格。想学习vc++的人可以好好看看!推荐大家同时看看thinking in c++,也很不错! 本书是学习MFC不可多得一本好书。 对MFC的讲解从基本原理到三大聚集的概念及使用,通过对一个个小程序的详解,让你了解利用MFC进行程式设计的来龙去脉
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值