应用程序头文件和源文件
应用程序向导会根据应用程序的类型(单文档、多文档或基于对话框的程序)自动生成一些头文件和源文件,这些文件是工程的主体部分,用于实现主框架、文档、视图等。
下面分别简单介绍下各个文件:
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等中的树视图。
资源文件
一般我们使用MFC生成窗口程序都会有对话框、图标、菜单等资源,应用程序向导会生成资源相关文件:res目录、HelloWorld.rc文件和Resource.h文件。
res目录:工程文件夹下的res目录中含有应用程序默认图标、工具栏使用图标等图标文件。
HelloWorld.rc:包含默认菜单定义、字符串表和加速键表,指定了默认的About对话框和应用程序默认图标文件等。
Resource.h:含有各种资源的ID定义。
预编译头文件
几乎所有的MFC程序的文件都要包含afxwin.h等文件,如果每次都编译一次则会大大减慢编译速度。所以把常用的MFC头文件都放到了stdafx.h文件中,然后由stdafx.cpp包含stdafx.h文件,编译器对stdafx.cpp只编译一次,并生成编译之后的预编译头HelloWorld.pch,大大提高了编译效率。
编译链接生成文件
如果是Debug方式编译,则会在解决方案文件夹和工程文件夹下都生成Debug子文件夹,而如果是Release方式编译则生成Release子文件夹。
工程文件夹下的Debug或Release子文件夹中包含了编译链接时产生的中间文件,解决方案文件夹下的Debug或Release子文件夹中主要包含有应用程序的可执行文件。
实际上在前面自动生成的框架中比较重要的类包括以下几个:CHelloWorldApp、CMainFrame、CHelloWorldDoc和CHelloWorldView
四个主要类的关系简单讲下:
CHelloWorldApp类处理消息,将收到的消息分发给相应的对象。
CMainFrame是视图CHelloWorldView的父窗口,视图CHelloWorldView就显示在CMainFrame的客户区中。
视图类CHelloWorldView用来显示文档类CHelloWorldDoc中的数据,并根据对视图类的操作修改文档类的数据。一个视图类只能跟一个文档类相联系,而一个文档类可以跟多个视图类相联系。
程序运行都要有入口函数,在之前的C++教程中都是main函数,而Windows应用程序的入口函数是WinMain函数,MFC程序也是从WinMain函数开始的
MFC消息映射机制概述
添加消息处理函数
右键点击CMainFrame,选择类向导,然后选择消息中的WM_LBUTTONDOWN,添加,然后选择编辑代码
右键点击CDrawView,选择类向导,然后选择消息中的WM_LBUTTONDOWN,添加,然后选择编辑代码
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 MessageBox("view clicked"); CView::OnLButtonDown(nFlags, point); }
注意:编译过程中,出现不能将参数 1 从“const char [11]”转换为“LPCWSTR”的编译错误
解决方法:
选中项目,然后点击属性——>配置属性——>常规——>项目默认值——>字符集,选为“使用多字节字符集"
结果是框架类编写的程序不出现,View类编写的类,点击出现结果
View类在框架类窗口之上,鼠标移动、点击只能由view类窗口进行捕获
Tip:在VS2010环境中,在MFC中删掉一个响应函数