如果用户打开项目工作台中的“FileView”标签,并稍微浏览一下所列出的内容的话,很容易发现“Hello,World!”应用程序还包含其他的一些文件。下面简单介绍这些文件的作用。
除了CHelloApp、CMainFrame、CHelloDoc、CHelloView等四个类的头文件和源文件以外,“Hello,World!”程序还包括另外的两个代码文件:StdAfx.h和StdAfx.cpp。这两个文件用来产生一个预编译的头文件和一个预编译的目标文件,AppWizard会自动管理这两个文件,一般情况下,用户无需对这两个文件进行任何操作或修改。
另外,Resource.h和Hello.rc文件中记录了本应用程序所用到的所有资源的信息,这包括应用程序的菜单、工具栏、“About”对话框等各种资源。在Resource Files项目下包含的一些文件,一般都是本应用程序所用到的一些位图信息。这些文件都保存在“res”子目录下。
最后,还有一些文件(后缀为dsp、dsw、opt、clw等的文件)保存了本应用程序或者说明本项目的一些信息。这些都由AppWizard进行管理,用户不必自行处理。
用户如果曾经直接使用Windows API函数编写过Windows应用程序,一定还记得WinMain()函数和用来处理消息循环的回调函数中长长的select...case...语句。这种应用程序的运行过程是比较容易理解的:WinMain()函数是应用程序的入口,在该函数中完成程序的初始化工作,然后进入消息循环,具体的消息由回调函数中的select...case...语句处理,直至应用程序结束运行。
但是,在MFC应用程序中,正如上一节中浏览“Hello,World!”应用程序的代码时所看到的,并没有出现WinMain()函数和select...case...语句。MFC采用了另外的一种方式,应用程序的初始化是在InitInstance()函数中完成的,操作系统向应用程序发送的消息则由消息映射宏映射到特定的函数进行处理。
但如果进一步深入地研究MFC的源代码,可以发现WinMain()函数还是存在的,但是MFC对此进行了封装,使得用户不需要直接处理WinMain()函数。在应用程序启动的时候,应用程序框架将调用WinMain()函数。该函数执行一些标准的初始化过程,如注册窗口类等;然后该函数将调用应用程序对象的成员函数,初始化应用程序并进入应用程序的消息循环。
在初始化应用程序对象的时候,WinMain()函数将调用应用程序类的成员函数InitApplication()和InitInstance();接着调用应用程序类的Run()进入消息循环;在应用程序终止的时候,WinMain()调用应用程序类的ExitInstance()函数退出应用程序。图2-16清楚地显示了这一过程。
在图2-16中,标明的WinMain()函数和Run()函数是应用程序框架提供了标准的处理函数,无需用户更改;而InitInstance()函数和ExitInstance()函数需要用户进行覆盖和修改。
在应用程序的执行过程中,除了启动时的初始化过程和退出时的清理过程外,大部分的时间都在执行应用程序对象的Run()函数,即处于消息循环中,因此,在一般情况下,处理应用程序的消息就是用户开发MFC应用程序最重要的任务。