是从
CWinThread 派生的,后者表示可能具有一个或多个线程的应用程序的主执行线程。在最新版本的
MFC 中,
InitInstance、Run、
ExitInstance 和 OnIdle 成员函数实际位于 CWinThread 类中。此处将这些函数作为 CWinApp 成员来探讨,因为探讨所关心的是对象作为应用程序对象而不是主线程的角色。
MFC 中的主应用程序类封装用于 Windows 操作系统的应用程序的初始化、运行和终止。基于框架生成的应用程序必须有且仅有一个从 CWinApp 派生的类的对象。在创建窗口之前先构造该对象。
应用程序类构成应用程序的主执行
线程。使用 Win32 API 函数还可以创建辅助执行线程。这些线程可以使用 MFC 库。有关更多信息,请参见
多线程编程。
与用于 Windows 操作系统的任何程序一样,框架应用程序也具有 WinMain 函数。但在框架应用程序中不必编写 WinMain。它由类库提供,并在应用程序启动时调用。WinMain 执行注册
窗口类等标准服务。然后它调用应用程序对象的成员函数来初始化和运行应用程序。(可通过重写由 WinMain 调用的 CWinApp 成员函数来自定义 WinMain。)
为初始化应用程序,WinMain 调用应用程序对象的 InitApplication 和 InitInstance 成员函数。为运行应用程序的
消息循环,WinMain 调用 Run 成员函数。在终止时,WinMain 调用应用程序对象的 ExitInstance 成员函数。
注意 本文中以粗体显示的名称指示由 Microsoft 基础类库和
Visual C++ 提供的元素。以 monospaced 类型显示的名称指示您创建或重写的元素。
基于MFC的应用程序有一个
应用对象,它是CWinApp
派生类的对象,该对象代表了应用进程的
主线程。当
线程执行完并退出线程时,由于进程中没有其他线程存在,进程自动结束。类CWinApp从
CWinThread派生出来,CWinThread是
用户接口线程的基本类。我们在编写用户接口线程时,需要从CWinThread派生我们自己的线程类,
ClassWizard可以帮助我们完成这个工作。
先用ClassWizard派生一个新的类,设置
基类为
CwinThread。注意:类的
DECLARE_DYNCREATE和
IMPLEMENT_DYNCREATE宏是必需的,因为创建线程时需要动态创建类的对象。根据需要可将初始化和结束代码分别放在类的
InitInstance和
ExitInstance函数中。如果需要创建窗口,则可在InitInstance函数中完成。然后创建线程并启动线程。可以用两种方法来创建
用户接口线程,MFC提供了两个版本的
AfxBeginThread函数,其中一个用于创建用户接口
线程。第二种方法分为两步进行:首先,调用线程类的
构造函数创建一个线程对象;其次,调用
CWinThread::
CreateThread函数来创建该线程。线程建立并启动后,在线程函数执行过程中一直有效。如果是线程对象,则在对象删除之前,先结束线程。CWinThread已经为我们完成了线程结束的工作。