CWinApp 说明
目 录
1概述
基本信息
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 成员函数。下图显示了框架应用程序中的执行顺序。
2执行顺序
注意 本文中以粗体显示的名称指示由 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已经为我们完成了线程结束的工作。
3CWinApp类成员
数据成员
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对象
操作符
载入光标资源
|
|
载入WINDOWS.H中IDC_常量所指定的Windows预定义光标
|
|
LoadOEMCursor
|
载入WINDOWS.H中OCR_常量所指定的WindowsOEM预定义光标
|
载入图标资源
|
|
LoadStandardIcon
|
载入WINDOWS.H中IDI_常量所指定的Windows预定义图标
|
LoadOEMIcon
|
载入WINDOWS.H中OIC_常量所指定的WindowsOEM预定义图标
|
检查应用程序的命令行是否指定/Automation选项。已不用。应当在调用ParseCommandLine之后使用CCommandLineInfo::m_bRunEmbedded中的值
|
|
RunEmbedded
|
检查应用程序的命令行是否指定/Embedding选项。已不用。应当在调用ParseCommandLine之后使用CCommandLineInfo::m_bRunEmbedded中的值
|
ParseCommandLine
|
解析命令行中的每个参数和标志
|
ProcessShellCommand
|
处理命令行参数和标志
|
从应用程序的。INI文件的一个入口中获取一个整数
|
|
WriteProfileInt
|
将一个整数写到应用程序的。INI文件的入口
|
从应用程序的。INI文件的一个入口中获取一个字符串
|
|
将一个字符串写到应用程序的。INI文件的入口
|
|
将一个文档模板加到应用程序的可用文档模板列表中
|
|
GetFirstDocTemplatePosition
|
获取第一个文档模板的位置
|
GetNextDocTemplate
|
获得文档模板的位置。可以递归调用
|
由框架调用,用以从文件打开一个文档
|
|
将一个文件名加入最近使用(MRU)的文件列表
|
|
SelectPrinter
|
选择先前由用户在打印对话框中指定的打印机
|
创建一个打印机设备环境
|
|
GetPrinterDeviceDefaults
|
获得缺省的打印机设备
|
可重载的函数
可被重载以执行Windows的实例初始化,比如创建窗口对象
|
|
InitApplication | 初始化. |
运行缺省的消息循环。可被重载以定制消息循环
|
|
OnIdle
|
可被重载以执行应用程序指定的空闲时处理
|
可被重载以在应用程序结束时执行清除操作
|
|
在关闭所有的文档之前隐藏应用程序
|
|
关闭所有打开的文档
|
|
在消息被分派到Windows函数::TranslateMessage和::DispatchMessage之前过滤消息
|
|
SaveAllModified
|
提示用户保存所有改变了的文档
|
为应用程序实现AfxMessageBox
|
|
在消息到达应用程序之前截取特定的消息
|
|
ProcessWndProcException
|
截取应用程序的消息和命令处理函数抛出的未被处理的异常
|
打开或关闭等待光标
|
|
OnDDECommand
|
框架调用这个函数以响应动态数据交换(DDE)执行命令
|
WinHelp
|
调用Windows的WinHelp函数
|
初始化
载入标准的。INI文件设置并允许MRU文件列表特性
|
|
SetDialogBkColor
|
设置对话框和消息框的缺省背景颜色
|
使应用程序的设置保存在注册表中,而不是。INI文件中
|
|
允许用户通过Windows的文件管理器打开数据文件
|
|
RegisterShellFileTypes
|
在Windows的文件管理器中注册所有的应用程序文档类型
|
使控件具有三维外观(动态库)
|
|
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命令
|
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)