VS2010/MFC编程入门之二(单文档应用程序框架和应用程序工程中文件的组成结构)
VS2010/MFC编程入门之二(单文档应用程序框架和应用程序工程中文件的组成结构)
-----整理于 鸡啄米的微博 http://www.jizhuomi.com
-----相当于自己的学习笔记
这一讲给大家一个简单的例子,演示如何生成单文档应用程序框架。
(有没有人做过智能机器人呢?似乎这个是最复杂的东东!程序的最高境界莫过于实现软件越来越像人的思维)
解决方案与工程
每个应用程序都作为一个工程来处理,它包含了头文件、源文件和资源文件等,这些文件通过工程集中管理。
在 VS2010中,工程都是在解决方案管理之下的。一个解决方案可以管理多个工程项目(一般大型程序都会包含多个工程项目,至少 界面前端服务+后台服务器数据库,具体要看分析师或者架构师的对软件的需求分析,数据库分析 等文档),可以把解决方案理解为多个有关系或者没有关系的工程的集合。
下图左侧面板中正在显示的视图就是Solution Explorer(解决方案资源管理器),如下视图中有一个解决方案-HelloWorld,此解决方案下有一个同名的工程-HelloWorld。
使用VS2010应用程序向导生成单文档应用程序框架
演示下怎样生成单文档应用程序框架,让大家先有个直观的了解。下面按照操作步骤一步步讲解:
1.点菜单栏File->New->Project,弹出New Project对话框,我们可以选择工程类型。
如 果安装完VS2010以后第一启动时已经设置为VC++,则Installed Templates->Visual C++项会默认展开,而如果没有设置VC++,则可以展开到Installed Templates->Other 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三个设置项。意义如下:Name--工程名,Location--解决方案路径,Solution name--解决方案名称。这里Name我们设为“HelloWorld”,Location设置为“桌面”的路径,Solution name默认和Name一样点“OK”按钮。
2.这时会弹出“MFC Application Wizard”(MFC应用程序向导)对话框,上部写有“Welcome to the MFC Application
Wizard”,下面显示了当前工程的默认设置。第一条“Tabbed multiple document interface
(MDI)”是说此工程是多文档应用程序。如果这时直接点下面的“Finish”按钮,可生成具有上面列出设置的多文档程序。但我们此例是要建立单文档应
用程序,所以点“Next”按钮再继续设置吧。
3.接下来弹出的对话框上部写有“Application Type”,当然是让选择应用程序类型,我们看到有四种类型:Single document(单文档SDI)、Multiple documents(多文档MDI)、Dialog based(基于对话框DB)(做界面常用)和Multiple top-level documents。我们选择Single document类型,以生成一个单文档应用程序框架。单文档应用程序运行时是一个单窗口界面。
“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的机子上能够正常运行程序。
选择Use MFC in a static library时MFC的类会编译到可执行文件中,所以应用程序的可执行文件(.exe文件,一般展示给客户都是一个demo,就是这样类似的一个.exe文件 )要比上种方式大,但可以单独发布,不需另加包含MFC类的库。这里我们使用默 认的Use MFC in a shared DLL。
点“Next”按钮。(可跳过直接Finish)
4.此时弹出上部写有“Compound Document Support”的对话框,可以通过它向应用程序加入OLE支持,指定OLE选项的复合文档类型。本例不需要OLE特性,使用默认值“None”。
点“Next”按钮。(可跳过直接Finish)
5.弹出的新对话框上部写有“Document Template Properties”。“File extension”可以设置程序能处理的文件的扩展名。对话框其他选项还可以更改程序窗口的标题。我们都使用默认设置,
点“Next”按钮。(可跳过直接Finish)
6.此时弹出的对话框主题是“Database Support”。用于设置数据库选项。此向导可以生成数据库应用程序需要的代码。它有四个选项:
None:忽略所有的数据库支持;
Header files only:只包含定义了数据库类的头文件,但不生成对应特定表的数据库类或视图类;
Database view without file support:创建对应指定表的一个数据库类和一个视图类,不附加标准文件支持;
Database view with file support:创建对应指定表的一个数据库类和一个视图类,并附加标准文件支持。
本例选择默认值“None”,不使用数据库特性。
点“Next”按钮。(可跳过直接Finish)
7.这时弹出的对话框是关于“User Interface Features”,即用户界面特性。我们可以设置有无最大化按钮、最小化按钮、系统菜单和初始状态栏等。还可以选择使用菜单栏和工具栏生成简单的应用程 序还是使用ribbon。这里我们都选择默认设置。
点“Next”进入下一步。(可跳过直接Finish)
8.此时弹出“高级特性”对话框。可以设置的高级特性包括有无打印和打印预览等。在“Number of files on recent file list”项可以设置在程序界面的文件菜单下面最近打开文件的个数。我们仍使用默认值。(有些方面还是得注意下,比如有的程序设计可能涉及一些高级特性,比如套接字)
点“Next”按钮。(可跳过直接Finish)
9. 弹出“生成类”对话框。在对话框上部的“生成类”列表框内,列出了将要生成的4 个类:一个视图类(CHelloWorldView)、一个应用类(CHelloWorldApp)、一个文档类(CHelloWorldDoc)和一个 主框架窗口类(CMainFrame).在对话框下面的几个编辑框中,可以修改默认的类名、类的头文件名和源文件名。对于视图类,还可以修改其基类名称, 默认的基类是CView,
(不同的基类的派生类,这很重要,可以看一下MFC类的派生表)。点“Finish”按钮。
应用程序向导最后自动打开了解决方案(见上面第一张图)。
编译运行生成的程序
点 菜单中的Build->Build HelloWorld(编译F5)编译程序。结果页面如下所示:
终于看见界面了。
VS2010应用程序工程中文件的组成结构
这一节将以上一讲中生成应用程序HelloWorld的文件结构为例,讲解VS2010应用程序工程中文件的组成结构。
用应用程序向导生成框架程序后,我们可以在之前设置的Location下看到以解决方案名命名的文件夹,此文件夹中包含了几个文件和一个以工程名命名的 子文件夹,这个子文件夹中又包含了若干个文件和一个res文件夹,创建工程时的选项不同,工程文件夹下的文件可能也会有所不同。
如果已经以Debug方式编译链接过程序,则会在解决方案文件夹下和工程子文件夹下各有一个名为“Debug”的文件夹,而如果是Release方式编译则会有名为“Release”的文件夹。这两种编译方式将产生两种不同版本的可执行程序:Debug版本和Release版本。Debug版本的可执行文件中包含了用于调试的信息和代码,而Release版本则没有调试信息,不能进行调试,但可执行文件比较小。
所有文件分为6个部分:解决方案相关文件、工程相关文件、应用程序头文件和源文件、资源文件、预编译头文件和编译链接生成文件。
1.解决方案相关文件
解决方案相关文件包括解决方案文件夹下的.sdf文件、.sln文件、.suo文件和ipch文件夹。
.sdf文件和ipch目录一般占用空间比较大,几十兆甚至上百兆,与智能提示、错误提示、代码恢复和团队本地仓库等相关。
.sln文件和.suo文件为MFC自动生成的解决方案文件,它包含当前解决方案中的工程信息,存储解决方案的设置。
2.工程相关文件
工程相关文件包括工程文件夹下的.vcxproj文件和.vcxproj.filters文件。
.vcxproj文件 是MFC生成的工程文件,它包含当前工程的设置和工程所包含的文件等信息。
.vcxproj.filters文件 存放工程的虚拟目录信息,也就是在解决方案浏览器中的目录结构信息。
3.应用程序头文件和源文件
应用程序向导会根据应用程序的类型(单文档、多文档或基于对话框的程序)自动生成一些头文件.h 和源文件.cpp,这些文件是工程的主体部分,用于实现主框架、文档、视图等。下面分别简单介绍下各个文件:(反正都是类,记住主要了类的继承关系就好,需要时间去记,不过最好的方法还是敲代码,把框架实现的关键代码都敲一遍,熟能生巧。)
HelloWorld.h:应用程序的主头文件。主要包含由CWinAppEx类派生的CHelloWorldApp类的声明,以及CHelloWorldApp类的全局对象theApp的声明。
HelloWorld.cpp:应用程序的主源文件。主要包含CHelloWorldApp类的实现,CHelloWorldApp类的全局对象theApp的定义等。
MainFrm.h和MainFrm.cpp:通过这两个文件从CFrameWndEx类派生出CMainFrame类,用于创建主框架、菜单栏、工具栏和状态栏等。
HelloWorldDoc.h和HelloWorldDoc.cpp:这两个文件从CDocument类派生出文档类CHelloWorldDoc,包含一些用来初始化文档、串行化(保存和装入)文档和调试的成员函数。
HelloWorldView.h和HelloWorldView.cpp:它们从CView类派生出名为CHelloWorldView的视图类,用来显示和打印文档数据,包含了一些绘图和用于调试的成员函数。
ClassView.h和ClassView.cpp:由CDockablePane类派生出CClassView类,用于实现应用程序界面左侧面板上的Class View。
FileView.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:由CTreeCtrl类派生出CViewTree类,用于实现出现在ClassView和FileView等中的树视图。
4.资源文件
一般我们使用MFC生成窗口程序都会有对话框、图标、菜单等资源,应用程序向导会生成资源相关文件:res目录、HelloWorld.rc文件和Resource.h文件。
res目录:工程文件夹下的res目录中含有应用程序默认图标、工具栏使用图标等图标文件。
HelloWorld.rc:包含默认菜单定义、字符串表和加速键表,指定了默认的About对话框和应用程序默认图标文件等。
Resource.h:含有各种资源的ID定义。
5.预编译头文件
几乎所有的MFC程序的文件都要包含afxwin.h等文件,如果每次都编译一次则会大大减慢编译速度。所以把常用的MFC头文件都放到了 stdafx.h文件中,然后由stdafx.cpp包含stdafx.h文件,编译器对stdafx.cpp只编译一次,并生成编译之后的预编译头 HelloWorld.pch,大大提高了编译效率。
6.编译链接生成文件
如果是Debug方式编译,则会在解决方案文件夹和工程文件夹下都生成Debug子文件夹,而如果是Release方式编译则生成Release子文件夹。
工程文件夹下的Debug或Release子文件夹中包含了编译链接时产生的中间文件,解决方案文件夹下的Debug或Release子文件夹中主要包含有应用程序的可执行文件。