1、VS2010/MFC 编程入门教程之目录 第一部分: VS2010/MFC 开发环境 VS2010/MFC 编程入门之前言 VS2010/MFC 编程入门之一( VS2010 与 MSDN 安装过程图解) 第二部分: VS2010/MFC 应用程序框架 VS2010/MFC 编程入门之二(利用 MFC 向导生成单文档应用程序框架) VS2010/MFC 编程入门之三( VS2010 应用程序工程中文件的组成结构) VS2010/MFC 编程入门之四( MFC 应用程序框架分析) VS2010/MFC 编程入门之五( MFC 消息映射机制概述) 第三部分:对话框 VS2010/MFC 编程入门之
2、六(对话框:创建对话框模板和修改对话框属性) VS2010/MFC 编程入门之七(对话框:为对话框添加控件) VS2010/MFC 编程入门之八(对话框:创建对话框类和添加控件变量) VS2010/MFC 编程入门之九(对话框:为控件添加消息处理函数) VS2010/MFC 编程入门之十(对话框:设置对话框控件的 Tab 顺序) VS2010/MFC 编程入门之十一(对话框:模态对话框及其弹出过程) VS2010/MFC 编程入门之十二(对话框:非模态对话框的创建及显示) VS2010/MFC 编程入门之十三(对话框:属性页对话框及相关类的介绍) VS2010/MFC 编程入门之十四(对话框:
3、向导对话框的创建及显示) VS2010/MFC 编程入门之十五(对话框:一般属性页对话框的创建及显示) VS2010/MFC 编程入门之十六(对话框:消息对话框) VS2010/MFC 编程入门之十七(对话框:文件对话框) VS2010/MFC 编程入门之十八(对话框:字体对话框) VS2010/MFC 编程入门之十九(对话框:颜色对话框) 第四部分:常用控件 VS2010/MFC 编程入门之二十(常用控件:静态文本框) VS2010/MFC 编程入门之 二十一(常用控件:编辑框 Edit Control) VS2010/MFC 编程入门之二十二(常用控件:按钮控件 Button、 Radio
4、 Button 和 Check Box) VS2010/MFC 编程入门之二十三(常用控件:按钮控件的编程实例) VS2010/MFC 编程入门之二十四(常用控件:列表框控件 ListBox) VS2010/MFC 编程入门之二十五(常用控件:组合框控件 Combo Box) VS2010/MFC 编程入门之 二十六(常用控件:滚动条控件 Scroll Bar) VS2010/MFC 编程入门之二十七(常用控件:图片控件 Picture Control) VS2010/MFC 编程入门之二十八(常用控件:列表视图控件 List Control 上) VS2010/MFC 编程入门之二十九(常用
5、控件:列表视图控件 List Control 下) VS2010/MFC 编程入门之三十(常用控件:树形控件 Tree Control 上) VS2010/MFC 编程入门之三十一(常用控件:树形控件 Tree Control 下) VS2010/MFC 编程入门之三十二(常用控件:标签控件 Tab Control 上) VS2010/MFC 编程入门之三十三(常用控件:标签控件 Tab Control 下) 第五部分:菜单、工具栏与状态栏 VS2010/MFC 编程入门之三十四(菜单: VS2010 菜单资源详解) VS2010/MFC 编程入门之三十五(菜单:菜单及 CMenu 类的使用)
6、 VS2010/MFC 编程入门之三十六(工具栏:工具栏资源及 CToolBar 类) VS2010/MFC 编程入门之三十七(工具栏:工具栏的创建、停靠与使用) VS2010/MFC 编程入门之三十八(状态栏的使用详解) 第六部分:文档、视图和框架 VS2010/MFC 编程入门之三十九(文档、视 图和框架:概述) VS2010/MFC 编程入门之四十(文档、视图和框架:各对象之间的关系) VS2010/MFC 编程入门之四十一(文档、视图和框架:分割窗口) 第七部分: MFC 常用类 VS2010/MFC 编程入门之四十二( MFC 常用类: CString 类) VS2010/MFC 编
7、程入门之四十三( MFC 常用类: CTime 类和 CTimeSpan 类) VS2010/MFC 编程入门之四十四( MFC 常用类:定时器 Timer) VS2010/MFC 编程入门之四十五( MFC 常用类: CFile 文件操作类) VS2010/MFC 编程入门之四十六( MFC 常用类: MFC 异常处理) 第八部分:字体和文本输出 VS2010/MFC 编程入门之四十七(字体和文本输出: CFont 字体 类) VS2010/MFC 编程入门之四十八(字体和文本输出:文本输出) 第九部分:图形图像 VS2010/MFC 编程入门之四十九(图形图像: CDC 类及其屏幕绘图函数
8、) VS2010/MFC 编程入门之五十(图形图像: GDI 对象之画笔 CPen) VS2010/MFC 编程入门之五十一(图形图像: GDI 对象之画刷 CBrush) 第十部分: Ribbon 界面开发 VS2010/MFC 编程入门之五十二( Ribbon 界面开发:创建 Ribbon 样式的应用程序框架) VS2010/MFC 编程入门之五十三( Ribbon 界面开发:为 Ribbon Bar 添加控件) VS2010/MFC 编程入门之五十四( Ribbon 界面开发:使用更多控件并为控件添加消息处理函数) VS2010/MFC 编程入门之前言 鸡啄米的 C+编程入门 系列给大家
9、讲了 C+的编程入门知识,大家对 C+语言在语法和设计思想上应该有了一定的了解了。但是教程中讲的例子只是一个个简单的例程,并没有可视化窗口。鸡啄米在这套 VS2010/MFC 编程入门教程中将会给大家讲解怎样使用 VS2010 进行可视化编程,也就是基于窗口的程序。 C+编程入门系 列主要偏重于理论方面的知识,目的是让大家打好底子,练好内功,在使用 VC+编程时不至于丈二和尚摸不着头脑。本套教程也会涉及到 VC+的原理性的东西,同样更重视实用性,让大家学完本套教程以后,基本的界面程序都能很容易编写出来。 VC+简介 VC+全称是 Visual C+,是由微软提供的 C+开发工具,它与 C+的根
10、本区别就在于, C+是语言,而 VC+是用 C+语言编写程序的工具平台。 VC+不仅是一个编译器更是一个集成开发环境,包括编辑器、调试器和编译器等,一般它包含在 Visual Studio 中。Visual Studio 包含了 VB、 VC+、 C#等编译环境。当然我们在使用 VC+ 6.0 的时候为了轻便,总是只单独安装 VC+ 6.0。但自微软 2002 年发布 Visual Studio.NET 以来,微软建立了在 .NET 框架上的代码托管机制,一个项目可以支持多种语言开发的组件, VC+同样被扩展为支持代码托管机制的开发环境,所以 .NET Framework 是必须的,也就不再有
11、 VC+的独立安装程序,不过可以在安装 Visual Studio 时只选择 VC+进行安装。 VC+版本的选择 :VS2010 因为 VC+ 6.0 以后的版本不再有独立的安装程序,所以鸡啄米在教程中将不会称 VC+ 6.0以后的版本为 VC+ 7.0等等,而是用 VC+所属的 Visual Studio的版本名称代替,比如 VS2003。 近些年 VC+主要的版本包括: VC+ 6.0、 VS2003、 VS2005、 VS2008 和 VS2010。 VC+ 6.0 占用的系统资源比较少,打开工程、编译运行都比较快,所以赢得很多软件开发者的青睐。但因为它先于 C+标准推出,所以对 C+标
12、准的支持不太好。举个例子: for(int i=0; iMicrosoft Visual Studio 2010-Visual Studio Tools下选择 Manage Help Settings - ENU: 弹出对话框: 可以将帮助库存在默 认路径,也可以修改存放路径。鸡啄米使用默认路径,点 OK出现: 选择 Install Content From Disk后弹出对话框选择帮助所在文件,这时需要在加载了VS2010 的虚拟光驱中找,选择图中所示路径: 点 OK 后出现如下对话框,可以点 Add选择要添加的帮助库,鸡啄米全部添加了。 点 Update进行安装,等待其完成就可以了。 使用
13、 MSDN 时点击开始菜单的 所有程序 -Microsoft Visual Studio 2010-Microsoft Visual Studio 2010 Documentation即可。 到此 VS2010 和 MSDN 的安装过程就结束了。以后就可以正式使用 VS2010 进行软件开发了。至于 VS2010 的使用方法 在鸡啄米的 C+编程入门系列中已经介绍过,大家可以看看。 VS2010/MFC 编程入门之二(利用 MFC 向导生成单文档应用程序框架) 解决方案与工程 鸡啄米在 VS2010 的使用介绍 中已经讲了解决方案与工程的概念,这里再重提一下。每个应用程序都作为一个工程来处理,
14、它包含了头文件、源文件和资源文件等,这些文件通过工程集中管理。在 VS2010 中,工程都是在解决方案管理之下的。一个解决方案可以管理多个工程,可以把解决方案理解为多个有关系或者没有关系的工程的集合。 VS2010 提供了一个 Solution Explorer 解决方案浏览器视图,可以显示当前解决方案的内容,当新建一个工程时可以选择新建一个解决方案还是加入当前解决方案。 下图左侧面板中正在显示的视图就是 Solution Explorer,视图中有一个解决方案 -HelloWorld,此解决方案下有一个同名的工程 -HelloWorld。 在应用程序向导生成应用程序后 , VS2010 会在
15、用户设置的路径下,以解决方案名为名称建立一个目录,里面存放自动生成的文件。 使用 VS2010 应用程序向导生成单文档应用程序框架 鸡啄米这里简略演示下怎样生成单文档应用程序框架,让大家先有个直观的了解,有不理解的地方可以留着以后回来再看。下面按照操作步骤一步步讲解: 1.点菜单栏 File-New-Project,弹出 New Project 对话框,我们可以选择工程类型。 如果安装完 VS2010 以后第一启动时已经设置为 VC+,则 Installed Templates-Visual C+项会默认展开,而如果没有设置 VC+,则可以展开到 Installed Templates-Oth
16、er Languages-Visual C+项。因为我们要生成的是 MFC 程序,所以在 Visual C+下选择 MFC,对话框中间区域会出现三个选项: MFC ActiveX Control、 MFC Application 和 MFC DLL。 MFC ActiveX Control 用来生成 MFC ActiveX 控件程序。 MFC Application 用来生成 MFC 应用程序。 MFC DLL 用来生成 MFC 动态链接库程序。当然我们要选择 MFC Application。 在对话框下部有 Name、 Location 和 Solution name 三个设置项。意义如下:
17、 Name-工程名, Location-解决方案路径, Solution name-解决方案名称。这里 Name 我们设为 HelloWorld, Location 设置为 桌面 的路径, Solution name 默认和 Name 一样,当然可以修改为其他名字,这里我们不作修改,也使用 HelloWorld。点 OK按钮。 2.这时会弹出 MFC Application Wizard对话框,上部写有 Welcome to the MFC Application Wizard,下面显示了当前工程的默认设置。第一条 Tabbed multiple document interface (MDI
18、)是说此工程是多文档应用程序。如果这时直接点下面的 Finish按钮,可生成具有上面列出设置的多文档程序。但我们此例是要建立单文档应用程序,所以点 Next按钮再继续设置 吧。 3.接下来弹出的对话框上部写有 Application Type,当然是让选择应用程序类型,我们看到有四种类型: Single document(单文档)、 Multiple documents(多文档)、 Dialog based(基于对话框)和 Multiple top-level documents。我们选择 Single document 类型,以生成一个单文档应用程序框架。单文档应用程序运行时是一个单窗口界面
19、。 此对话框的 Resource language还提供语言的 选择,这里默认选择英语。 Project style可选择工程风格,我们选择默认的 Visual Studio风格。 Use of MFC有两个选项: Use MFC in a shared DLL(动态链接库方式使用 MFC)和 Use MFC in a static library(静态库方式使用 MFC)。选择 Use MFC in a shared DLL 时 MFC 的类会以动态链接库的方式访问,所以我们的应用程序本身就会小些,但是发布应用程序时必须同时添加必要的动态链接库,以便在没有安装 VS2010 的机子 上能够正
20、常运行程序。选择 Use MFC in a static library 时 MFC 的类会编译到可执行文件中,所以应用程序的可执行文件要比上种方式大,但可以单独发布,不需另加包含 MFC 类的库。这里我们使用默认的 Use MFC in a shared DLL。点 Next按钮。 4.此时弹出上部写有 Compound Document Support的对话框,可以通过它向应用程序加入 OLE 支持,指定 OLE 选项的复合文档类型。本例不需要 OLE 特性,使用默认值 None。点 Next按钮。 5.弹出的新对话框上部写有 Document Template Properties。 F
21、ile extension可以设置程序能处理的文件的扩展名。对话框其他选项还可以更改程序窗口的标题。我们都使用默认设置,点 Next按钮。 6.此时弹出的对话框主题是 Database Support。用于设置数据库选项。此向导可以生成数据库应用程序需要的代码。它有四个选项: None:忽略所有的数据库支持; Header files only:只包含定义了数据库 类的头文件,但不生成对应特定表的数据库类或视图类; Database view without file support:创建对应指定表的一个数据库类和一个视图类,不附加标准文件支持; Database view with file
22、 support:创建对应指定表的一个数据库类和一个视图类,并附加标准文件支持。 本例选择默认值 None,不使用数据库特性。点 Next按钮。 7.这时弹出的对话框是关于 User Interface Features,即用户界面特性。我们可以设置有无最大化按钮、最小化按钮、系统菜单和初始状态栏等。还可以选择使用菜单栏和工具栏生成简单的应用程序还是使用 ribbon。这里我们都选择默认设置。点 Next进入下一步。 8.此时弹出 高级特性 对话框。可以设置的高级特性包括有无打印和打印预览等。在 Number of files on recent file list项可以设置在程序界面的文件菜
23、单下面最近打开文件的个数。我们仍使用默认值。点 Next按钮。 9.弹出 生成类 对话框。在对话框上部的 生成类 列表框内,列出了将要生成的 4 个类:一个视图类( CHelloWorldView)、一个应用类( CHelloWorldApp)、一个文档类( CHelloWorldDoc)和一个主框架窗口类( CMainFrame)。在对话框下面的几个编辑框中,可以修改默认的类名、类的头文件名和源文件名。对于视图类,还可以修改其基类名称,默认的基类是 CView,还有其他几个基类可以选择。这里我们还是使用默认设置。点 Finish按钮。 应用程序向导最后为我们生成了应用程序框架,并在 Solu
24、tion Explorer 中自动打开了解决方案(见上面第一张图)。 编译运行生成的程序 点菜单中的 Build-Build HelloWorld 编译程序,然后点 Debug-Start Without Debugging(快捷键 Ctrl+F5)运行程序,也可以直接点 Debug-Start Without Debugging,这时会弹出对话框提示是否编译,选择 Yes, VS2010 将自动编译链接运行 HelloWorld 程序。结果页面如下所示: 终于看见界面了。鸡啄米在以后的教程中会继续讲解各种界面和控件的使用方法。欢迎到鸡啄米博客交流,您的关注是我前进的动力。 VS2010/MF
25、C 编程入门之三( VS2010 应用程序工程中文件的组成结构) 鸡啄米在上一讲中为大家演示了如何 利用应用程序向导创建单文档应用程序框架 。这一节将以上一讲中生成应用程序 HelloWorld 的文件结构为例,讲解 VS2010 应用程序工程中文件的组成结构。 用应用程序向导生成框架程序后,我们可以在之前设置的 Location 下看到以解决方案名命名的文件夹,此文件夹中包含了几个文件和一个以工程名命名的子文件夹,这个子文件夹中又包含了若干个文件和一个 res 文件夹,创建工程时的选项不同,工程文件夹下的文件可能也会有所不同。 如果已经 以 Debug 方式编译链接过程序,则会在解决方案文件
26、夹下和工程子文件夹下各有一个名为 Debug的文件夹,而如果是 Release 方式编译则会有名为 Release的文件夹。这两种编译方式将产生两种不同版本的可执行程序: Debug 版本和 Release 版本 。 Debug 版本的可执行文件中包含了用于调试的信息和代码,而 Release 版本则没有调试信息,不能进行调试,但可执行文件比较小。 鸡啄米将所有文件分为 6 个部分:解决方案相关文件、工程相关文件、应用程序头文件和源文件、资源文件、预编译头文件和编译 链接生成文件。 1.解决方案相关文件 解决方案相关文件包括解决方案文件夹下的 .sdf 文件、 .sln 文件、 .suo 文件
27、和 ipch 文件夹。 .sdf 文件和 ipch 目录一般占用空间比较大,几十兆甚至上百兆,与智能提示、错误提示、代码恢复和团队本地仓库等相关。如果你觉得不需要则可以设置不生成它们,方法是点击菜单栏 Tools-Options,弹出 Options 对话框,选择左侧面板中 Text Editor-C/C+-Advanced,右侧列表中第一项 Disable Database 由 False 改为 True 就可以了,最后关闭 VS2010 再删除 .sdf 文件和 ipch 目录以后就不会再产生了。但关闭此选项以后也会有很多不便,例如写程序时的智能提示没有了。 .sln 文件和 .suo 文
28、件为 MFC 自动生成的解决方案文件,它包含当前解决方案中的工程信息,存储解决方案的设置。 2.工程相关文件 工程相关文件包括工程文件夹下的 .vcxproj 文件和 .vcxproj.filters 文件。 .vcxproj 文件是 MFC 生成的工程文件,它包含当 前工程的设置和工程所包含的文件等信息。 .vcxproj.filters 文件存放工程的虚拟目录信息,也就是在解决方案浏览器中的目录结构信息。 3.应用程序头文件和源文件 应用程序向导会根据应用程序的类型(单文档、多文档或基于对话框的程序)自动生成一些头文件和源文件,这些文件是工程的主体部分,用于实现主框架、文档、视图等。鸡啄米
29、下面分别简单介绍下各个文件: HelloWorld.h:应用程序的主头文件。主要包含由 CWinAppEx 类派生的 CHelloWorldApp 类的声明,以及 CHelloWorldApp 类的全局对象 theApp 的声明。 HelloWorld.cpp:应用程序的主源文件。主要包含 CHelloWorldApp 类的实现, CHelloWorldApp 类的全局对象 theApp 的定义等。 MainFrm.h 和 MainFrm.cpp:通过这两个文件从 CFrameWndEx 类派生出 CMainFrame 类,用于创建主框架、菜单栏、工具栏和状态栏等。 HelloWorldDoc
30、.h 和 HelloWorldDoc.cpp:这两个文 件从 CDocument 类派生出文档类CHelloWorldDoc,包含一些用来初始化文档、串行化(保存和装入)文档和调试的成员函数。 HelloWorldView.h 和 HelloWorldView.cpp:它们从 CView 类派生出名为 CHelloWorldView 的视图类,用来显示和打印文档数据,包含了一些绘图和用于调试的成员函数。 ClassView.h 和 ClassView.cpp:由 CDockablePane 类派生出 CClassView 类,用于实现应用程序界面左侧面板上的 Class View。 FileV
31、iew.h 和 FileView.cpp:由 CDockablePane 类派生出 CFileView 类,用于实现应用程序界面左侧面板上的 File View。 OutputWnd.h 和 OutputWnd.cpp:由 CDockablePane 类派生出 COutputWnd 类,用于实现应用程序界面下侧面板 Output。 PropertiesWnd.h 和 PropertiesWnd.cpp:由 CDockablePane 类派生出 CPropertiesWnd 类 ,用于实现应用程序界面右侧面板 Properties。 ViewTree.h 和 ViewTree.cpp:由 CTr
32、eeCtrl 类派生出 CViewTree 类,用于实现出现在ClassView 和 FileView 等中的树视图。 4.资源文件 一般我们使用 MFC 生成窗口程序都会有对话框、图标、菜单等资源,应用程序向导会生成资源相关文件: res 目录、 HelloWorld.rc 文件和 Resource.h 文件。 res 目录:工程文件夹下的 res 目录中含有应用程序默认图标、工具栏使用图标等图标文件。 HelloWorld.rc:包含默认菜单定义、字符串表和加速键表,指定了默认的 About 对话框和应用程序默认图标文件等。 Resource.h:含有各种资源的 ID 定义。 5.预编译头
33、文件 几乎所有的 MFC 程序的文件都要包含 afxwin.h 等文件,如果每次都编译一次则会大大减慢编译速度。所以把常用的 MFC 头文件都放到了 stdafx.h 文件中,然后由 stdafx.cpp 包含 stdafx.h 文件,编译器 对 stdafx.cpp 只编译一次,并生成编译之后的预编译头 HelloWorld.pch,大大提高了编译效率。 6.编译链接生成文件 如果是 Debug 方式编译,则会在解决方案文件夹和工程文件夹下都生成 Debug 子文件夹,而如果是 Release 方式编译则生成 Release 子文件夹。 工程文件夹下的 Debug 或 Release 子文件
34、夹中包含了编译链接时产生的中间文件,解决方案文件夹下的 Debug 或 Release 子文件夹中主要包含有应用程序的可执行文件。 关于应 用程序工程文件的组成结构鸡啄米就先讲到这了。其中包含了很多专有名词,以后大家会慢慢熟悉的。欢迎来鸡啄米博客交流。谢谢。 VS2010/MFC 编程入门之四( MFC 应用程序框架分析) 上一讲鸡啄米讲的是 VS2010 应用程序工程中文件的组成结构 ,可能大家对工程的运行原理还是很模糊,理不出头绪,毕竟跟 C+编程入门系列中的例程差别太大。这一节鸡啄米就为大家分析下 MFC 应用程序框架的运行流程。 一 .SDK 应用程序与 MFC 应用程序运行过程的对比
35、 程序运行都要有入口函数,在之前的 C+教程中都是 main 函数,而 Windows 应用程序的入口函数是 WinMain 函数, MFC 程序也是从 WinMain 函数开始的。下面鸡啄米就给出用 Windows SDK 写的 HelloWorld程序,与应用程序框架进行对比,这样能更好的了解框架是怎样 运行的。 Windows SDK 开发程序就是不使用 MFC 类库,直接用 Windows API 函数进行 软件开发 。鸡啄米不是要讲解 SDK 开发,只是为了对比而简单介绍,至于 SDK开发可以在大家学完 MFC 以后选择是否要研究,一般来说有简单了解就可以了。 SDK 应用程序 首先
36、,给出 Windows SDK 应用程序 HelloWorld的源码: C+代码 1. #include 2. 3. LRESULT CALLBACK myWndProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam); 4. 5. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) 6. 7. const static TCHAR appName = TEXT(“Hello world“); 8.
37、 WNDCLASSEX myWin; 9. myWin.cbSize = sizeof(myWin); 10. myWin.style = CS_HREDRAW | CS_VREDRAW; 11. myWin.lpfnWndProc = myWndProc; 12. myWin.cbClsExtra = 0; 13. myWin.cbWndExtra = 0; 14. myWin.hInstance = hInstance; 15. myWin.hIcon = 0; 16. myWin.hIconSm = 0; 17. myWin.hCursor = 0; 18. myWin.hbrBackg
38、round = (HBRUSH)(COLOR_WINDOW + 1); 19. myWin.lpszMenuName = 0; 20. myWin.lpszClassName = appName; 21. /Register 22. if (!RegisterClassEx( 23. const HWND hWindow = CreateWindow( 24. appName, 25. appName, 26. WS_OVERLAPPEDWINDOW, 27. CW_USEDEFAULT, 28. CW_USEDEFAULT, 29. CW_USEDEFAULT, 30. CW_USEDEFA
39、ULT, 31. 0, 32. 0, 33. hInstance, 34. 0); 35. ShowWindow(hWindow,iCmdShow); 36. UpdateWindow(hWindow); 37. 38. MSG msg; 39. while(GetMessage( 42. DispatchMessage( 43. 44. return (int)msg.wParam; 45. 46. 47. 48. LRESULT CALLBACK myWndProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam) 49. 50.
40、if (msg=WM_PAINT) 51. 52. PAINTSTRUCT ps; 53. const HDC hDC = BeginPaint(hWindow, 54. RECT rect; 55. GetClientRect(hWindow, 56. DrawText(hDC,TEXT(“HELLO WORLD“),-1, 57. EndPaint(hWindow, 58. return 0; 59. 60. else if (msg=WM_DESTROY) 61. 62. PostQuitMessage(0); 63. return 0; 64. 65. return DefWindow
41、Proc(hWindow,msg,wParam,lParam); 66. 上面的程序运行的流程是:进入 WinMain 函数 -初始化 WNDCLASSEX,调用 RegisterClassEx 函数注册窗口类 -调用 ShowWindow 和 UpdateWindow 函数显示并更新窗口 -进入消息循环。关于消息循环再简单说下, Windows 应用程序是消息驱动的,系统或用户让应用程序进行某项操作或完成某个任务时会发送消息,进入程序的消息队列,然后消息循环会将消息队列中的消息取出,交予相应的窗口过程处理,此程序的窗口过程函数就是 myWndProc 函数,窗口过程函数处理完消息就完成了某项
42、操作或任务。本例是要显示 HELLO WORLD字符串, UpdateWindow 函数会发送 WM_PAINT 消息,但是此消息不经过消息队列而是直接送到窗口 过程处理,在窗口过程函数中最终绘制了 HELLO WORLD字符串。 MFC 应用程序 下面是 MFC 应用程序的运行流程,通过 MFC 库中代码进行分析: 首先在 HelloWorld.cpp 中定义 全局对象 theApp: CHelloWorldApp theApp;。调用 CWinApp 和 CHelloWorldApp 的构造函数后,进入 WinMain 函数(位于 appmodul.cpp 中)。 C+代码 1. exte
43、rn “C“ int WINAPI 2. _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 3. _In_ LPTSTR lpCmdLine, int nCmdShow) 4. #pragma warning(suppress: 4985) 5. 6. / call shared/exported WinMain 7. return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow); 8. 在 TCHAR.h 中,有此定义: #define _tWinMain Win
44、Main,所以这里的 _tWinMain就是 WinMain 函数。它调用了 AfxWinMain 函数(位于 WinMain.cpp 中)。 C+代码 1. int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nCmdShow) 2. 3. .略 4. / App global initializations (rare) 5. if (pApp != NULL 7. 8. if (!pThread-InitInstance() 9. 10. .略 11. 12. 1
45、3. / Run 函数位于 THRDCORE.cpp 中,由此函数进入消息循环 14. nReturnCode = pThread-Run(); 15. 16. 略 17. 18. return nReturnCode; 19. 上面 InitInstance 函数的代码如下: C+代码 1. BOOL CTestApp:InitInstance() 2. 3. .略 4. CSingleDocTemplate* pDocTemplate; 5. pDocTemplate = new CSingleDocTemplate( 6. IDR_MAINFRAME, 7. RUNTIME_CLASS(
46、CTestDoc), 8. RUNTIME_CLASS(CMainFrame), / main SDI frame window 9. RUNTIME_CLASS(CTestView); 10. if (!pDocTemplate) 11. return FALSE; 12. AddDocTemplate(pDocTemplate); 13. / Parse command line for standard shell commands, DDE, file open 14. 15. CCommandLineInfo cmdInfo; 16. ParseCommandLine(cmdInfo
47、); 17. 18. /ProcessShellCommand位于 AppUI2.cpp中,注册并创建窗口 19. if (!ProcessShellCommand(cmdInfo) 20. return FALSE; 21. 22. m_pMainWnd-ShowWindow(SW_SHOW); 23. m_pMainWnd-UpdateWindow(); 24. 25. return TRUE; 26. InitInstance 中的 ProcessShellCommand 函数又调用了 CMainFrame 的 LoadFrame函数注册并创建了窗口,执行完 ProcessShellCommand 函数以后,调用了 m_pMainWnd的 ShowWindow 和 UpdateWindow 函数显示并更新框架窗口。这些是不是与上面的 SDK程序十分类似? 接下来该是消息循环了,上面的 AfxWinMain 函数中调用了 pThread 的 Run 函数(位于 THRDCORE.cpp 中),在 Run 中包含了消息循环。 Run 函数的代码如下: C+代码 1. int C