概述
基本信息
CWinApp为应用程序类
MFC 中的主应用程序类封装用于 Windows 操作系统的应用程序的初始化、运行和终止。基于框架生成的应用程序必须有且仅有一个从 CWinApp 派生的类的对象。在创建窗口之前先构造该对象。
CWinApp 是从 CWinThread 派生的,后者表示可能具有一个或多个线程的应用程序的主执行线程。在最新版本的 MFC 中,InitInstance、Run、ExitInstance 和 OnIdle 成员函数实际位于 CWinThread 类中。此处将这些函数作为 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已经为我们完成了线程结束的工作。
CWinApp类成员
数据成员
m_pszAppName | 指定了应用程序的名字 |
| |
m_hInstance | 标识了应用程序的当前实例 |
m_hPrevInstance | 在32位应用程序中被设为NULL |
m_lpCmdLine | 指向一个以null结尾的字符串,指定了应用程序的命令行 |
m_nCmdShow | 指定最初如何显示窗口 |
m_bHelpMode | 指明用户是否处于Help上下文模式(通常用SHIFT+F1激活) |
m_pActiveWnd | 当一个OLE服务器是现场可激活时,它指向容器应用程序的主窗口 |
m_pszExeName | 应用程序的模块名字 |
m_pszHelpFilePath | 应用程序的帮助文件的路径 |
m_pszProfileName | 应用程序的。INI文件名 |
m_pszRegistryKey | 用于确定保存应用程序主要设置的完整的注册表键 |
m_pDocManager | 用于保存文档模板管理类的指针(MSDN中没有这个数据成员) |
构造函数
CWinApp 构造一个CWinApp对象
操作符
LoadCursor | 载入光标资源 |
LoadStandardCursor | 载入WINDOWS.H中IDC_常量所指定的Windows预定义光标 |
LoadOEMCursor | 载入WINDOWS.H中OCR_常量所指定的WindowsOEM预定义光标 |
LoadIcon | 载入图标资源 |
LoadStandardIcon | 载入WINDOWS.H中IDI_常量所指定的Windows预定义图标 |
LoadOEMIcon | 载入WINDOWS.H中OIC_常量所指定的WindowsOEM预定义图标 |
RunAutomated | 检查应用程序的命令行是否指定/Automation选项。已不用。应当在调用ParseCommandLine之后使用CCommandLineInfo::m_bRunEmbedded中的值 |
RunEmbedded | 检查应用程序的命令行是否指定/Embedding选项。已不用。应当在调用ParseCommandLine之后使用CCommandLineInfo::m_bRunEmbedded中的值 |
ParseCommandLine | 解析命令行中的每个参数和标志 |
ProcessShellCommand | 处理命令行参数和标志 |
GetProfileInt | 从应用程序的。INI文件的一个入口中获取一个整数 |
WriteProfileInt | 将一个整数写到应用程序的。INI文件的入口 |
GetProfileString | 从应用程序的。INI文件的一个入口中获取一个字符串 |
WriteProfileString | 将一个字符串写到应用程序的。INI文件的入口 |
AddDocTemplate | 将一个文档模板加到应用程序的可用文档模板列表中 |
GetFirstDocTemplatePosition | 获取第一个文档模板的位置 |
GetNextDocTemplate | 获得文档模板的位置。可以递归调用 |
OpenDocumentFile | 由框架调用,用以从文件打开一个文档 |
AddToRecentFileList | 将一个文件名加入最近使用(MRU)的文件列表 |
SelectPrinter | 选择先前由用户在打印对话框中指定的打印机 |
CreatePrinterDC | 创建一个打印机设备环境 |
GetPrinterDeviceDefaults | 获得缺省的打印机设备 |
可重载的函数
InitInstance | 可被重载以执行Windows的实例初始化,比如创建窗口对象 |
Run | 运行缺省的消息循环。可被重载以定制消息循环 |
OnIdle | 可被重载以执行应用程序指定的空闲时处理 |
ExitInstance | 可被重载以在应用程序结束时执行清除操作 |
HideApplication | 在关闭所有的文档之前隐藏应用程序 |
CloseAllDocuments | 关闭所有打开的文档 |
PreTranslateMessage | 在消息被分派到Windows函数::TranslateMessage和::DispatchMessage之前过滤消息 |
SaveAllModified | 提示用户保存所有改变了的文档 |
DoMessageBox | 为应用程序实现AfxMessageBox |
ProcessMessageFilter | 在消息到达应用程序之前截取特定的消息 |
ProcessWndProcException | 截取应用程序的消息和命令处理函数抛出的未被处理的异常 |
DoWaitCursor | 打开或关闭等待光标 |
OnDDECommand | 框架调用这个函数以响应动态数据交换(DDE)执行命令 |
WinHelp | 调用Windows的WinHelp函数 |
初始化
LoadStdProfileSettings | 载入标准的。INI文件设置并允许MRU文件列表特性 |
SetDialogBkColor | 设置对话框和消息框的缺省背景颜色 |
SetRegistryKey | 使应用程序的设置保存在注册表中,而不是。INI文件中 |
EnableShellOpen | 允许用户通过Windows的文件管理器打开数据文件 |
RegisterShellFileTypes | 在Windows的文件管理器中注册所有的应用程序文档类型 |
Enable3dControls | 使控件具有三维外观(动态库) |
Enable3dControlsStatic | 使控件具有三维外观(静态库) |
命令操作
OnFileNew | 实现ID_FILE_NEW命令 |
OnFileOpen | 实现ID_FILE_NEW命令 |
OnFilePrintSetup | 实现ID_FILE_PRINT_SETUP命令 |
OnContextHelp | 处理应用程序内的SHIFT+F1命令 |
OnHelp | 处理应用程序内的F1帮助命令(使用当前的上下文) |
OnHelpIndex | 处理ID_HELP_INDEX命令,提供缺省的帮助主题 |
OnHelpFinder | 处理ID_HELP_FINDER和ID_DEFAULT_HELP命令 |
OnHelpUsing | 处理ID_HELP_USING命令 |