Visual C++ MFC 简明教程1

 

第一部分:MFC导论

Visual C++

不仅仅是一个编译器。它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的 C++ 来开发出专业级的 Windows 应用程序。为了能充分利用这些特性,你必须理解 C++ 程序设计语言。掌握了 C++ ,你就必须掌握 Microsoft 基本类库 (MFC) 的层次结构。该层次 结构包容了 Windows API 中的用户界面部分,并使你能够很容易地以面向对象的方式建立 Windows 应用程序。这种层次结构适用于所有版本的 Windows 并彼此兼容。你用 MFC 所建立的代码是完全可移植的。

该教程将向你介绍

MFC 的基本概念和术语以及事件驱动程序设计方法。在本节中,你将会输入、编译和运行一个简单的 MFC 程序。下一节中将向你详细解释这些代码。第三部分讨论了 MFC 控制和如何定制它们。第四部分将介绍消息映射,你将会处理 MFC 的事件。

什么是

MFC?

如果你要建立一个

Windows 应用程序,应该如何下手?

好的开端是从设计用户界面开始。首先,你要决定什么样的用户能使用该程序并根据需要来设置相应的用户界面对象。

Windows 用户界面有一些标准的控制,如按钮、菜单、滚动条和列表等,这对那些 Windows 用户已经是很熟悉了。 要记住的是,作为程序员必须选择一组控制并决定如何把它们安排到屏幕上。传统上,你需要在纸上做一下用户界面的草图,直到对各元素感到满意为止。这对于一些比较小的项目,以及一些大项目的早期原型阶段是可以的。

下一步,是要实现代码。为任何

Windows 平台建立应用程序时,程序员都有两种选择: C C++ 使用 C ,程序员是在 Windows 应用程序界面 ( API ) 的水平上编写代码。该界面是由几百个 C 函数所组成,这些函数在 Windows API 参考手册中都有介绍。对于 Windows NT, API 被称为 Win32 API ”,以区别于其用于 Windows 3.1 16 API

Microsoft

也提供了 C++ 库,它位于任何 Windows API 之上,能够使程序员的工作更容易。它就是 Microsoft 基本类库 (MFC) ,该库的主要优点是效率高。它减少了大量在建立 Windows 程序时必须编写的代码。同时它还提供了所有一般 C++ 编程的优点,例如继承和封装。 MFC 是可移植的,例如,在 Windows 3.1 下编写的代码可以很容易地移植到 Windows NT Windows 95 上。因此, MFC 很值得推荐的开发 Windows 应用程序的方法,在本教程自始至终使用的都是 MFC

当是使用

MFC 时,你编写的代码是用来建立必要的用户界面控制并定制其外观。同时你还要编写用来响应用户操作这些控制的代码。例如,如果用户单击一个按钮时,你应该有代码来响应。这就是事件驱动代码,它构成了所有应用程序。一旦应用程序正确的响应了所有允许的控制,它的任务也就完成了。

你可以看出,使用

MFC 进行 Windows 编程时是一件比较容易的的过程。本教程的目的是比较详细地教你如何快速建立专业级的应用程序的技术。 Visual C++ 应用程序开发程序环境特别适合于使用 MFC ( 也有其它开发环境使用 MFC ,译者注 ) ,所以一起学习 MFC Visual C++ 能够增强你的开发程序的能力。

Windows

词汇

Windows 用户界面和软件开发中所要用到的词汇都是基本和唯一的。对于新接触该环境的用户,下面复习几个定义以便使我们的讨论更加容易。

Windows

应用程序使用几个标准的控制 :

静态文本标签

按钮

列表框

组合框 ( 一种更高级的列表框 )

单选按钮

检查按钮

编辑框 ( 单行和多行 )

滚动条

你可以通过代码或“资源编辑器”来建立这些控制,在资源编辑器中可以建立对话框和这些控制。在本教程中,我们将使用代码来建立它们。

Windows

支持几种类型的应用程序窗口。一个典型的应用程序应该活动在称为“框架窗口”中。一个框架窗口是一个全功能的主窗口,用户可以改变尺寸、最小化、最大化等。 Windows 也支持两种类型的对话框:模式和无模式对话框。模式对话框一旦出现在屏幕上,只有当它退出时,屏幕上该应用程序的其余部分才能响应。无模式对话框出现在屏幕上时,程序的其余部分也可以作出响应,它就象浮动在上面一样。

最简单的

Windows 应用程序是使用单文档界面 (SDI) ,只有一个框架窗口。 Windows 的钟表、 PIF 编辑器、记事本等都是 SDI 应用程序的例子。 Windows 也提供了一种称为多文档界面的组织形式,它可用于更复杂的应用程序。 MDI 系统允许用户在同一应用程序中同时可以查看多个文档。例如,一个文本编辑器可以允许用户同时打开多个文本文件。使用 MDI 时,应用程序有一个主窗口,在主窗口中有一些子窗口,每个子窗口中各自包含有各自的文档。在 MDI 框架中,主窗口有一个主菜单,它对主框架中最顶端窗口有效。各子窗口都可以缩成图标或展开, MDI 主窗口也可以变成桌面上的一个图标。 MDI 界面可能会给你一种第二桌面的感觉,它对窗口的管理和删除混乱的窗口有很大的帮助。

你所建立的没一个应用程序都会使用它自己的一套控制、菜单结构以及对话框。应用程序界面的好坏取决于你如何选择和组织这些界面对象。

Visual C++ 中的资源编辑器可以使你能容易的建立和定制这些界面对象。

事件驱动软件和词汇

所有基于窗口的

GUI 都包含相同的基本元素,它们的操作方式都是相同的。在屏幕上,用户所看到的是一组窗口,每个窗口都包含有控制、图标、对象以及一些处理鼠标和键盘的元素。从用户角度来看,各系统的界面对象都是相同的:按钮、滚动条、图标、对话框以及下拉菜单等等。尽管这些界面元素的“外观和感觉”可能有些不同,但这些界面对象的工作方式都是相同的。例如,滚动条对于 Windows Mac Motif 可能有些不同,但他们的作用完全是一样的。

从程序员的角度来看,这些系统在概念上是相似的,尽管它们可能有很大的不同。为了建立

GUI 程序,程序员第一步要把所有需要的用户界面控制都放到窗口上。例如,如果程序员要建立一个从摄氏到华氏的转换的简单程序,则程序员所选择的用户界面对象来完成并在屏幕上把结果显示出来。在这个简单的程序中,程序员可能需要用户在一个可编辑的编辑框中输入温度值,在一个不可编辑的编辑框中显示转换结果,然后让用户可以单击一个标有“退出”的按钮来退出应用程序。

因为是用户来操作应用程序的控制,所以程序必须作出响应。所做的响应依赖于用户使用鼠标或键盘在不同控制上的操作。屏幕上的每个用户界面对象对事件的响应是不同的。例如,如果用户单击退出按钮,则该按钮必须更新屏幕、加亮它自己。然后程序必须响应退出。

Windows

所用的模式也是类似的。在一个典型的应用程序中,你将建立一个主窗口,并且在其中放置了一些用户界面控制。这些控制通常被称为子窗口��它们就象一些在主窗口中的更小更特殊的子窗口。作为程序员,你应该通过函数调用来发送信息操作这些控制、通过把信息发送给你到代码来响应用户的操作。

如果你从未做过事件驱动程序设计,则所有这些对你来说可能是很陌生的。但是,事件驱动程序设计方式是很容易理解的。具体的细节对不同的系统可能有些不同,但是其基本概念是类似的。在一个事件驱动界面中,应用程序会在屏幕上绘制几个界面对象,如按钮、文本区和菜单。应用程序通常通过一段称为事件循环的的代码来响应用户的操作。用户可以使用鼠标或键盘来任意操作屏幕上的对象。例如,用户用鼠标单击一个按钮。用鼠标单击就称为一个事件。事件驱动系统把用户的动作如鼠标单击和键盘操作定义为事件,也把系统操作如更新屏幕定义为事件。

在比较低级的编程方法中,如用

C 直接编写 Windows API 应用程序,代码量是非常大的,因为你所要照顾的细节太多了。例如,你用某种类型的结构来接收单击鼠标事件。你的事件循环中的代码会查看结构中不同域,以确定哪个用户界面对象受到了影响,然后会完成相应的操作。当屏幕上有很多对象时,应用程序会变得很大。只是简单地处理哪个对象被单击和对它需要做些什么要花费大量的代码。

幸运的是,你可以在比较高级的方法来进行编程,这就是使用

MFC 。在 MFC 中,几乎所有的低级的细节处理都为你代办了。如果你把某一用户界面对象放在屏幕上,你只需要两行代码来建立它。如果用户单击一个按钮,则按钮自己会完成一切必要的操作,从更新屏幕上的外观到调用你程序中的预处理函数。该函数包含有对该按钮作出相应操作的代码。 MFC 为你处理所有的细节:你建立按钮并告知它特定的处理函数,则当它被按下时,它就会调用相应的函数。第四部分介绍了怎样使用消息映射来处理事件。

例子

理解一个典型的

MFC 程序的结构和样式的最好方法是输入一段小程序,然后编译和运行它。下面的程序是一段简单的“ hello world ”程序。这对很多 C 程序员都是很熟悉了,让我们看一下如何用 MFC 方法来实现。如果你是第一次看到这类程序,也许比较难理解。这没关系,我们后面会详细介绍。现在你只要用 Visual C++ 环境中建立、编译和运行它就可以了。

//hello.cpp

#include <afxwin.h>

//

说明应用程序类

class CHelloApp : public CWinApp

{

public:

virtual BOOL InitInstance();

};

//

建立应用程序类的实例

CHelloApp HelloApp;

//

说明主窗口类

class CHelloWindow : public CFrameWnd

{

CStatic* cs;

public:

CHelloWindow();

};

//

每当应用程序首次执行时都要调用的初始化函数

BOOL CHelloApp::InitInstance()

{

m_pMainWnd = new CHelloWindow();

m_pMainWnd->ShowWindow(m_nCmdShow);

m_pMainWnd->UpdateWindow();

return TRUE;

}

//

窗口类的构造函数

CHelloWindow::CHelloWindow()

{

//

建立窗口本身

Create(NULL,

"Hello World!",

WS_OVERLAPPEDWINDOW,

CRect(0,0,200,200));

//

建立静态标签

cs = new CStatic();

cs->Create("hello world",

WS_CHILD|WS_VISIBLE|SS_CENTER,

CRect(50,80,150,150),

this);

}

上面的这段程序如果用

C 来实现,得需要几页的代码。这个简单的例子做了三件事。第一,它建立了一个应用程序对象。你所编写的每个 MFC 程序都有一个单一的程序对象,它是处理 MFC Windows 的初始细节的。第二,应用程序建立了一个窗口来作为应用程序的主窗口。最后,在应用程序的窗口中建立了一个静态文本标签,它包含有“ hello world ”几个字。在第二部分中我们会仔细研究这段程序,以理解其结构。

启动

VC++ ,如果你是刚刚安装好,则你会在屏幕上看到一个带有工具栏的空窗口。如果 VC++ 已经在该机器上使用过了,则所显示的窗口可能有些不同,因为 VC++ 会记忆和自动重新打开上次使用后退出时的项目和文件。我们需要的是它没有装如任何项目和代码。如果程序启动后弹出对话框指示不能打开某些文件,你只要单击“ No ”即可。在“ Window ”菜单中选取“ Close All ”选项关闭所有窗口。在“ File ”菜单中选取“ Close ”选项来关闭其它窗口。现在,你就处于开始状态了。如果你安装 VC++ 后,第一次运行,则屏幕应如下所示:

Image555.gif

如果你以后不希望看到“

InfoViewer Topic ”窗口,你可以用按钮把它关掉。如果以后需要的话,你还可以单击工具栏上的“主页”按钮来打开该窗口。

现在一切都正常了。正如你所看到的,顶部是菜单和几个工具栏。左边的窗口所显示的是在线帮助内容,你可以双击某项标题来浏览其内容。在线帮助的内容是十分丰富的。

现在该做什么了?你所要做的是输入上面的程序,然后便宜并运行它。开始之前,要检查以下你的硬盘上至少要留有

5MB 的剩余空间。

建立项目和编译代码

为了在

Visual C++ 中编译代码,你必须要建立一个项目。为了这么小的程序来建立一个项目可能有点小题大作,但是,在任何实际的程序中,项目的概念是非常有用的。一个项目主要保存着下面三种不同类型的信息 :

它可以记住建立一个可执行程序所需要的所有源程序代码文件。在这个简单的例子中,文件 HELLO.CPP 是唯一的源文件,但是在一个大型的应用程序中,为了便于管理和维护,你可以会有许多个不同的源文件。项目会维护这些不同文件的列表,并当你要建立下一个新的可执行程序时,在必要时编译它们。

它会记住针对你的应用程序所使用的编译器和连接器选项。例如,它会记住把哪个库连接到了执行程序中,你是否预编译了头文件等等。

它会记住你想要建立的项目类型 : 一个控制台应用程序,或一个窗口应用程序等等。

如果你已经对项目文件有所了解,则会很容易明白作为机器产生的项目文件的作用。现在,我们来建立一个简单的项目,并用它来编译

HELLO.CPP

为此,首先从“

File ”菜单中选择“ New ”选项。在“ Projects ”标签中,加单击“ Win32 Application ”。在“ Location ”域中输入一个合适的路径名或单击“ Browse ”按钮来选择一个。在“ Project name ”中输入“ hello ”作为项目名称。这时候你会看到“ hello ”也会出现在“ Location ”域中。单击“ OK ”按钮。 Visual C++ 会建立一个新的称为 HELLO 的目录,并把所有的项目文件 HELLO.OPT HELLO.NCB HELLO.DSP HELLO.DSW 都放到该目录中。如果你退出,以后再重新打开该项目,则可选择 HELLO.DSW

现在,在屏幕的左边,出现了三个标签。

InfoView 标签仍然在,又新出现了 ClassView FileView 标签。 ClassView 标签会把你程序中所有的类都列出来, FileView 标签给出了项目中文件的列表。

现在可以输入程序的代码了。在“

File ”菜单中选择“ New ”选项来建立一个编辑窗口。在出现的对话框中,选择“ Files ”标签和“ Text File ”。则会出现 Visual C++ 的智能编辑器,你可以用它来输入上面的程序代码。输入代码时,你会发现编辑器会自动把不同类型的文本变成不同的颜色,如注释、关键字字符串等的颜色都不同。如果你要改变其颜色或关闭颜色功能,可选择“ Tools ”菜单中“ Options ”选项,然后选择“ Format ”标签和“ Source Windows ”选项就可以修改。

输入完代码后,选择“

File ”菜单中的“ Save ”选项来保存。在 Visual C++ 新建立的目录中,把它存成 HELLO.CPP 文件。

现在选择在“

Project ”菜单中选择“ Add To Project ”选项,再选“ Files... ”。你会看到一个对话框供你选择要添加的文件。在本例子中,选择 HELLO.CPP 文件。

在屏幕的左边,单击

FileView 标签,并双击标有 HELLO 的图标。你会看到名为 HELLO.CPP 的文件。单击 ClassView 标签,并双击文件夹图标,你会看到程序中所有的类。任何时候你都可以使用 FileView 来删除项目的文件,你只要单击该文件,然后按键盘上的 delete 键。

后,此时你必须告诉项目要使用

MFC 库。如果你忽略了这一步,则项目在连接时会出错,而出错信息对你毫无帮助。选择“ Project ”菜单的“ Settings ”。在出现的对话框中选择“ General ”标签。在“ Microsoft Foundation Classes ”组合框中,选择“ Use MFC in a Shared DLL ”。然后关闭对话框。

我们已经建立了项目文件,并调整了设置,你现在可以准备编译

HELLO.CPP 程序了。在“ Build ”菜单中,你会发现有三个不同的编译选项:

Compile HELLO.CPP ( 只有当含有 HELLO.CPP 的窗口处于激活状态时才可 )

Build HELLO.EXE

Rebuild All

第一个选项只是编译源文件并形成它们的目标文件。该选项不能完成连接任务,所以它只对快速编译一些源文件以检查错误有用。第二个选项编译自上次编译后所修改的所有源文件,并连接形成可执行文件。第三个选项要重新编译和连接所有的源文件。

我们可以选择“

Build HELLO.EXE ”来编译和连接代码。 Visual C++ 会建立一个名为“ Debug ”的新子目录,并把 HELLO.EXE 放在该目录中。该子目录的文件都是可以再产生的,所以你可以任意删除它们。

如果你发现了编译错误,双击输出窗口中的错误信息。这时编辑器会把你带到出错的位置处。检查你的代码是否有问题,如果有,就修改之。如果你看到大量的连接错误,则可能你在建立项目对话框中所指定的项目类型不对。你可以把该项目所在的子目录删除,然后再重新按上面的步骤来建立。

为了执行该程序,你可选则“

Build ”菜单中的“ Execute HELLO.EXE ”选项。你就可以看到你的第一个 MFC 程序了 -- 出现一个带有“ hello world ”的窗口。该窗口本身带有:标题栏、尺寸缩放区、最大和最小按钮等等。在窗口上,有一个标有“ hello world ”。请注意,该程序是完整的。你可以移动窗口、缩放窗口、最小化等。你只使用了很少的代码就完成了一个完整的 Window 应用程序。这就是使用 MFC 的优点。所有的细节问题都有 MFC 来处理。

结论

在本讲中,你已经成功地编译和执行了你的第一个

MFC 程序。你将来会用类似的步骤来建立的应用程序。你可以为每个项目建立单独的目录,或建立一个单独的项目文件,然后再添加或删除不同的源文件。

在下一讲中,我们将仔细研究该程序,你会更完整的理解它的结构。

转载于:https://www.cnblogs.com/lgzdd/archive/2005/10/15/255288.html

第1章 MFC概述 1 1.1 MFC是一个编程框架 1 1.1.1 封装 1 1.1.2 继承 2 1.1.3 虚拟函数和动态约束 2 1.1.4 MFC的宏观框架体系 2 1.2 MDI应用程序的构成 3 1.2.1 构成应用程序的对象 3 1.2.2 构成应用程序的对象之间的关系 5 1.2.3 构成应用程序的文件 5 第2章 MFC和Win32 9 2.1 MFC Object和Windows Object的关系 9 2.2 Windows Object 12 2.2.1 Windows的注册 12 2.2.2 MFC窗口类CWnd 15 2.2.3 在MFC下创建一个窗口对象 17 2.2.4 MFC窗口的使用 18 2.2.5 在MFC下窗口的销毁 19 2.3 设备描述表 20 2.3.1 设备描述表概述 20 2.3.2 设备描述表在MFC中的实现 22 2.3.3 MFC设备描述表类的使用 24 2.4 GDI对象 25 第3章 CObject类 28 3.1 CObject的结构 28 3.2 CObject类的特性 30 3.3 实现CObject特性的机制 32 3.3.1 DECLARE_DYNAMIC等宏的定义 32 3.3.2 CruntimeClass类的结构与功能 35 3.3.3 动态类信息、动态创建的原理 38 3.3.4 序列化的机制 39 第4章 消息映射的实现 42 4.1 Windows消息概述 42 4.1.1 消息的分类 42 4.1.2 消息结构和消息处理 42 4.2 消息映射的定义和实现 44 4.2.1 MFC处理的三类消息 44 4.2.2 MFC消息映射的实现方法 45 4.2.3 在声明与实现的内部 46 4.2.3.1 消息映射声明的解释 47 4.2.3.2 消息映射实现的解释 49 4.2.4 消息映射宏的种类 51 4.3 CcmdTarget类 54 4.4 MFC窗口过程 55 4.4.1 MFC窗口过程的指定 56 4.4.2 对Windows消息的接收和处理 58 4.4.2.1 从窗口过程到消息映射 59 4.4.2.2 Windows消息的查找和匹配 60 4.4.2.3 Windows消息处理函数的调用 62 4.4.2.4 消息映射机制完成虚拟函数功能的原理 63 4.4.3 对命令消息的接收和处理 64 4.4.3.1 MFC标准命令消息的发送 64 4.4.3.2 命令消息的派发和消息的多次处理 67 4.4.3.3 一些消息处理类的OnCmdMsg的实现 69 4.4.3.4 一些消息处理类的OnCommand的实现 71 4.4.4 对控制通知消息的接收和处理 72 4.4.4.1 WM_COMMAND控制通知消息的处理 72 4.4.4.2 WM_NOTIFY消息及其处理: 73 4.4.4.3 消息反射 74 4.4.5 对更新命令的接收和处理 77 4.4.5.1 实现方法 77 4.4.5.2 状态更新命令消息 78 4.4.5.3 类CCmdUI 79 4.4.5.4 自动更新用户接口对象状态的机制 80 4.5 消息的预处理 82 4.6 MFC消息映射的回顾 83 第5章 MFC对象的创建 85 5.1 MFC对象的关系 85 5.1.1 创建关系 85 5.1.2 交互作用关系 86 5.2 MFC提供的接口 87 5.2.1 虚拟函数接口 87 5.2.2 消息映射方法和标准命令消息 91 5.3 MFC对象的创建过程 94 5.3.1 应用程序中典型对象的结构 94 5.3.1.1 应用程序类的成员变量 95 5.3.1.2 CDocument的成员变量 97 5.3.1.3 文档模板的属性 97 5.3.2 WinMain入口函数 99 5.3.2.1 WinMain流程 99 5.3.2.2 MFC空闲处理 101 5.3.3 SDI应用程序的对象创建 102 5.3.3.1 文档模板的创建 102 5.3.3.2 文件的创建或者打开 103 5.3.3.3 SDI边框窗口的创建 112 5.3.3.4 视的创建 115 5.3.3.5 窗口初始化 116 5.3.3.6 视的初始化 120 5.3.3.7 激活边框窗口(处理WM_ACTIVE) 121 5.3.3.8 SDI流程的回顾 122 5.3.4 MDI程序的对象创建 123 5.3.4.1 有别于SDI的主窗口加载过程 124 5.3.4.2 MDI子窗口、视、文档的创建 125 5.3.4.3 MDI子窗口的初始化和窗口的激活 127 第6章 应用程序的退出 131 6.1 边框窗口对WM_CLOSE的处理 131 6.2 窗口的销毁过程 135 6.2.1 DestroyWindow 135 6.2.2 处理WM_DESTROY消息 136 6.2.3 处理WM_NCDESTROY消息 136 6.3 SDI窗口、MDI主、子窗口的关闭 137 第7章 MFC的DLL 139 7.1 DLL的背景知识 139 7.2 调用约定 141 7.2.1 MFC的DLL应用程序的类型 142 7.3 DLL的几点说明 143 7.4 输出函数的方法 145 第8章 MFC的进程和线程 148 8.1 Win32的进程和线程概念 148 8.2 Win32的进程处理简介 148 8.2.1 进程的创建 148 8.2.2 进程的终止 149 8.3 Win32的线程 150 8.3.1 线程的创建 150 8.3.2 线程的终止 150 8.3.3 线程局部存储 151 8.4 线程同步 152 8.4.1 同步对象 152 8.4.2 等待函数 153 8.5 MFC的线程处理 154 8.5.1 创建用户界面线程 155 8.5.2 创建工作者线程 155 8.5.3 AfxBeginThread 155 8.5.4 CreateThread和_AfxThreadEntry 157 8.5.5 线程的结束 160 8.5.6 实现线程的消息循环 161 第9章 MFC的状态 163 9.1 模块状态 163 9.2 模块、进程和线程状态的数据结构 164 9.2.1 层次关系 164 9.2.2 CNoTrackObject类 166 9.2.3 AFX_MODULE_STATE类 166 9.2.4 _AFX_BASE_MODULE_STATE 169 9.2.5 _AFX_THREAD_STATE 169 9.2.6 AFX_MODULE_THREAD_STATE 171 9.3 线程局部存储机制和状态的实现 172 9.3.1 CThreadSlotData和_afxThreadData 173 9.3.1.1 CThreadSlotData的定义 173 9.3.1.2 CThreadSlotData的一些数据成员 174 9.3.1.3 _afxThreadData 175 9.3.2 线程状态_afxThreadState 176 9.3.3 进程模块状态afxBaseModuleState 178 9.3.4 状态对象的创建 180 9.3.4.1 状态对象的创建过程 180 9.3.4.2 创建过程所涉及的几个重要函数的算法 183 9.4 管理状态 184 9.4.1 模块状态切换 184 9.4.2 扩展DLL的模块状态 186 9.4.2.1 _AFX_EXTENSION_MODULE 187 9.4.2.2 扩展DLL的初始化函数 188 9.4.3 核心MFC DLL 190 9.4.4 动态链接的规则DLL的模块状态的实现 190 9.5 状态信息的作用 192 9.5.1.1 模块信息的保存和管理 192 9.5.2 MFC资源、运行类信息的查找 193 9.5.3 模块信息的显示 194 9.5.4 模块-线程状态的作用 196 9.5.4.1 只能访问本线程MFC对象的原因 196 9.5.4.2 实现MFC对象和Windows对象之间的映射 196 9.5.4.3 临时对象的处理 199 9.6 状态对象的删除和销毁 199 第10章 内存分配方式和调试机制 202 10.1 M内存分配 202 10.1.1 内存分配函数 202 10.1.2 C++的new 和 delete操作符 204 10.2 调试手段 204 10.2.1 C运行库提供和支持的调试功能 204 10.2.2 MFC提供的调试手段 205 10.2.3 内存诊断 208 第11章 MFC下的文件类 210 11.1 文件操作的方法 210 11.2 MFC的文件类 210 11.2.1 CFile的结构 211 11.2.1.1 CFile定义的枚举类型 211 11.2.1.2 CFile的其他一些成员变量 212 11.2.1.3 CFile的成员函数 212 11.2.2 CFile的部分实现 213 11.2.3 CFile的派生类 215 第12章 对话框和对话框类CDialog 217 12.1 模式和无模式对话框 217 12.1.1 模式对话框 217 12.1.2 无模式对话框 218 12.2 对话框的MFC实现 219 12.2.1 CDialog的设计和实现 219 12.2.1.1 CDialog的成员变量 219 12.2.1.2 CDialog的成员函数: 219 12.2.2 MFC模式对话框的实现 220 12.2.2.1 MFC对话框过程 220 12.2.2.2 模式对话框窗口过程 221 12.2.2.3 使用原对话框窗口过程作消息的缺省处理 225 12.2.2.4 Dialog命令消息和控制通知消息的处理 226 12.2.2.5 消息预处理和Dialog消息 228 12.2.2.6 模式对话框的消息循环 229 12.2.3 对话框的数据交换 233 12.2.3.1 数据交换的方法 233 12.2.3.2 CDataExchange 234 12.2.3.3 数据交换和验证函数 236 12.2.3.4 UpdateData函数 239 12.3 无模式对话框 240 12.3.1 CScrollView 240 12.3.2 CFormView 242 12.3.2.1 CFormView的创建 243 12.3.2.2 CFormView的消息预处理 245 12.3.2.3 CFormView的输入焦点 247 第13章 MFC工具条和状态栏 248 13.1 Windows控制窗口 248 13.2 MFC的工具条和状态栏类 249 13.2.1 控制窗口的创建 251 13.2.1.1 PreCreateWindow 251 13.2.1.2 控制条的窗口创建 253 13.2.2 控制条的销毁 259 13.2.3 处理控制条的位置 259 13.2.3.1 计算控制条位置的过程和算法 259 13.2.3.2 CFrameWnd的虚拟函数RecalcLayout 260 13.2.3.3 CWnd的成员函数RepositionBars 262 13.2.4 工具条、状态栏和边框窗口的接口 265 13.2.4.1 应用程序在状态栏中显示信息 265 13.2.4.2 状态栏显示菜单项的提示信息 268 13.2.4.3 控制条的消息分发处理 270 13.2.4.4 Tooltip 275 13.2.4.5 禁止和允许 279 13.2.4.6 显示或者隐藏工具栏和状态栏 285 13.2.5 泊位和漂浮 286 第14章 SOCKET类的设计和实现 288 14.1 WinSock基本知识 288 14.1.1 WinSock API 288 14.1.2 Socket的使用 290 14.2 MFC对WinSockt API的封装 291 14.2.1 CAsyncSocket 291 14.2.2 socket对象的创建和捆绑 292 14.2.3 异步网络事件的处理 296 14.3 CSocket 297 14.4 CSocketFile 299
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值