UI(一)
1.AfxWinMain
首先,MFC程序先执行到TheApp实例化对象也就是通过这句CTestApp the App来实例化对象的
然后,调用CTestApp构造函数分配内存空间
然后,就调用了AfxWinMain函数(这个是MFC/SRC下的源码,安装软件后电脑上会有,跟踪也会跟踪的到)
然后,AfxWinMain指向AfxWinInit()函数
然后,AfxWinMain执行InitApplication,这个地方InitApplication是虚函数,调用的是CWinApp::InitApplication
然后,AfxWinMain指向InitInstance,在这里面调用了CTestFrameWnd的构造函数,产生了主窗口
然后,显示窗口,更新窗口发送标准消息WM_PAINT
最后回到AfxWinMain,执行run函数,进入消息循环
参考:https://zhidao.baidu.com/question/321228915.html
2. 参见:https://zhidao.baidu.com/question/421099954.html?qbl=relate_question_0&word=lpCmdLine
extern int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine, int nCmdShow);
其中各个参数:
HINSTANCE hInstance, HINSTANCE 是“句柄型”数据类型。相当于装入到了内存的资源的ID。HINSTANCE对应的资源是instance.句柄实际上是一个 无符号长整数。
HINSTANCE hPrevInstance
LPTSTR lpCmdLine 表示指向字符/字符串的指针。
int nCmdShow nCmdShow:指定窗口如何显示。如果发送应用程序的程序提供了STARTUPINFO结构,则应用程序第一次调用ShowWindow时该参数被忽略。否则,在第一次调用ShowWindow函数时,该值应为在函数WinMain中nCmdShow参数。
更多内容参见:https://zhidao.baidu.com/question/206037460.html
3.CWinThread
CWinThread类是MFC用来封装线程的,包括UI线程和工作者线程。因此每个MFC程序至少使用一个CWinThread派生类。被MFC程序员熟知的CWinApp应用类就从这里派生。
参见:https://baike.baidu.com/item/CWinThread/5902501?fr=aladdin
4.CWinApp 是从 CWinThread 派生的,后者表示可能具有一个或多个线程的应用程序的主执行线程。
5.对应的:AfxGetThread函数与AfxGetApp函数
AfxGetApp是取前theApp的指针。
AfxGetThread是返回的是当前界面线程对象的指针,指得当前线程指针,如果在多线程时调用AfxGetThread返回的与AfxGetApp并不一定相同。
6.AfxWinInit
参数
BOOL AFXAPI AfxWinInit( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow );
BOOL CWinApp::InitApplication()
{
if (CDocManager::pStaticDocManager != NULL)
{
if (m_pDocManager == NULL)
m_pDocManager = CDocManager::pStaticDocManager;
CDocManager::pStaticDocManager = NULL;
}
if (m_pDocManager != NULL)
m_pDocManager->AddDocTemplate(NULL);
else
CDocManager::bStaticInit = FALSE;
LoadSysPolicies();
return TRUE;
}
8.InitInstance 线程初始化
进入程序,InitInstance是虚函数,继承类必须提供它的实现代码。完成整个消息链的启动。
在CWinApp这个类中除了有一般类都有的构造函数,一个重要的成员函数就是InitInstance,我们知道,在WINDOWS环境下面可以运行同一程序的多个实例,函数InitInstance的作用就是在生成的一个新的实例的时候,完成一些初始化的工作。
Windows允许在同一时刻运行程序的几份拷贝。在概念上,应用程序的初始化可以被分为两个部分:一次性的应用程序初始化工作,这些在应用程序第一次运行时完成,以及实例的初始化工作,每次运行程序的一个拷贝时都会执行这些操作,包括第一次运行时。框架中WinMain实现调用这个函数。重载InitInstance以初始化在Windows下运行的应用程序的每个新实例。
通常,重载InitInstance以构造主窗口对象并设置CWinThread::m_pMainWnd数据成员,使其指向这个窗口。
参见:https://blog.csdn.net/beyondhaven/article/details/6018864
9.CWinAppEx类
CWinAppEx处理应用程序状态、 将状态保存到注册表、 从注册表加载此状态,初始化应用程序管理器,并提供到同样的应用程序管理器链接。
class CWinAppEx : public CWinApp
参见:https://msdn.microsoft.com/zh-cn/library/bb983877.aspx
10.GetModuleFileName
DWORD WINAPI GetModuleFileName(
_In_opt_ HMODULE hModule,
_Out_ LPTSTR lpFilename,
_In_ DWORD nSize
);
UI:

15.AfxOleInit // 初始化 OLE 库
OLE,Object Linking and Embedding,对象连接与嵌入,简称OLE技术。OLE 不仅是桌面应用程序集成,而且还定义和实现了一种允许应用程序作为软件“对象”(数据集合和操作数据的函数)彼此进行“连接”的机制,这种连接机制和协议称为组件对象模型(COM)。
ole是对象链接嵌入技术的缩写。允许你在程序中嵌入别的程序的文档(此时你的程序成为容器),或者别的程序嵌入你的程序的文档(此时你的程序成为服务器)
你的程序完成ole的初始化,之所以有,是你创建mfc项目的时候勾选了ole的支持。
一般来说,推荐在程序入口函数中调用AfxOleInit,调用之后,你封装的类无需再调用AfxOleInit。
可以尝试用AfxOleGetMessageFilter() != NULL判断OLE是否初始化
typedef struct tagINITCOMMONCONTROLSEX {
DWORD dwSize; // size of this structure
DWORD dwICC; // flags indicating which classes to be initialized
} INITCOMMONCONTROLSEX, *LPINITCOMMONCONTROLSEX;
DWORD DWORD全称Double Word,是指注册表的键值,每个word为2个字节的长度,DWORD 双字即为4个字节,每个字节是8位,共32位。
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
18.CWinAppEx::InitInstance(); CWinAppEx继承于WinApp,故可以使用WinApp中的函数,此函数意思为:Windows允许同一个程序的多个副本同时运行。
virtual BOOL InitInstance( );
非零,如果初始化成功;否则为0。
此条目后面可以不看
InitLibId CAtlModuleT::InitLibId 初始化包含当前模块的GUID的数据成员
LoadAppLangResourceDLL
virtual HINSTANCE LoadAppLangResourceDLL();
Handle 是代表系统的内核对象,如文件句柄,线程句柄,进程句柄。
HMODULE 是代表应用程序载入的模块,win32系统下通常是被载入模块的线性地址。
HINSTANCE 在win32下与HMODULE是相同的东西,在Win32下还存在主要是因为win16
程序使用HINSTANCE来区别task。
AfxSetResourceHandle(目前程序不会调用) AfxGetResourceHandle用于获取当前资源模块句柄,而AfxSetResourceHandle则用于设置程序目前要使用的资源模块句柄。
SupportsRestartManager 确定应用程序是否支持重新启动管理器。
返回值 TRUE 指示应用程序支持重新启动管理器; FALSE 指示应用程序不。
// Register the application with the Restart Manager, if supported.
if (SupportsRestartManager())
{
RegisterWithRestartManager(SupportsApplicationRecovery(), _T(""));
}
RegisterWithRestartManager 注册重新启动管理器的应用程序。
virtual HRESULT RegisterWithRestartManager( BOOL bRegisterRecoveryCallback, const CString &strRestartIdentifier );
|
bRegisterRecoveryCallback |
TRUE 指示应用程序的此实例使用还原回调函数; FALSE 指示它不。在应用程序意外退出时,框架调用还原回调函数。有关更多信息,请参见 CWinApp::ApplicationRecoveryCallback。 |
|
[in] strRestartIdentifier |
标识重新启动管理器的此实例的唯一字符串。重新启动管理器标识符用于应用程序的每个实例都是唯一的。 |
参见:https://msdn.microsoft.com/zh-cn/library/dd394274.aspx
SupportsApplicationRecovery 确定重新启动管理器是恢复意外退出的应用程序。
语法 virtual BOOL SupportsApplicationRecovery() const; 返回值 TRUE 指示重新启动管理器恢复应用程序; FALSE 指示重新启动管理器不。
19.Checkpoint
void CMemoryState::Checkpoint()
{
_CrtMemCheckpoint(&m_memState);
UpdateData();
}
_CrtMemCheckpoint 指向 _CrtMemState 结构以使用内存检查点进行填充的指针。
UpdateData
调用在应用程序对象的 InitInstance 函数中对此函数启用 OLE 控件包容的支持。
21.EnableTaskbarInteraction
指定是否应启用了Windows 7任务栏的交互(TRUE),或禁用(FALSE)。
22.SetRegistryKey
这个函数功能是设置MFC程序的注册表访问键,并把读写 ini 文件的成员函数映射到读写注册表。只要调用一下 SetRegistryKey 并指定注册表键值,那么下面6个成员函数,就被映射到进行注册表读取了~

http://blog.sina.com.cn/s/blog_65cab32d01012a0l.html
23.LoadStdProfileSettings // 加载标准 INI 文件选项(包括 MRU)
要跟踪的最近使用的文件个数。
24.InitContextMenuManager
非零,则方法创建CContextMenuManager对象;0,如果 CContextMenuManager 对象已存在。
25.InitKeyboardManager
非零,则方法创建 CKeyboardManager 对象;0,如果 CKeyboardManager 对象已存在。
26.InitTooltipManager
非零,则方法创建 CTooltipManager 对象;0,如果 CTooltipManager 对象已存在。
27.CMFCToolTipInfo
存储有关工具提示视觉外观的信息。

28.SetTooltipParams
自定义工具提示控件的外观指定的Windows控件类型的。

29.// 注册应用程序的文档模板。文档模板
// 将用作文档、框架窗口和视图之间的连接
CSingleDocTemplate
定义实现单文档界面 (SDI) 的文档模板。
30.AddDocTemplate
调用此成员函数添加文档模板到列表可用文档应用程序维护的模板。
// 分析标准 shell 命令、DDE、打开文件操作的命令行
31.CCommandLineInfo
辅助在应用程序启动时分析命令行。
32.ParseCommandLine
调用该成员函数的分析命令行和发送参数,一个,以 CCommandLineInfo::ParseParam。
33.// 调度在命令行中指定的命令。如果
// 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。
ProcessShellCommand
此成员函数由 InitInstance 调用接受来自 CCommandLineInfo 对象传递的参数标识 rCmdInfo,并执行所指示的事件。
34.ShowWindow 显示窗口
35.UpdateWindow 更新窗口
36.AfxOleGetUserCtrl 检索当前的用户控件标志。
当用户显式打开或创建新文档时,用户是在应用程序控制中。如果应用程序未由 OLE 系统 DLL 启动,则用户也在控制中 - 也就是说,如果用户使用系统 shell 启动的应用程序。
37.PumpMessage 包含线程的消息循环。
处理信息循环。
AfxInternalPumpMessage
38.AfxWinTerm
39.IsIdleMessage
IsIdleMessage是一种函数,功能是若要避免在产生指定的消息后调用OnIdle函数,应重载该函数 。
40.AfxInternalIsIdleMessage
41.WM_QUIT
Indicates a request to terminate an application, and is generated when the application calls the PostQuitMessage function. This message causes the GetMessage function to return zero.
返回值:This message does not have a return value because it causes the message loop to terminate before the message is sent to the application's window procedure.
42.PeekMessage
PeekMessage是一个Windows API函数。该函数为一个消息检查线程消息队列,并将该消息(如果存在)放于指定的结构。
BOOL PeekMessage( LPMSG IpMsg, HWND hWnd, UINT wMSGfilterMin, UINT wMsgFilterMax, UINT wRemoveMsg );

43._AfxTraceMsg
http://blog.sina.com.cn/s/blog_a2aa00d70101im9b.html
在PumpMessage中,如果收到WM_QUIT消息,那么返回FALSE,所以ExitInstance()函数执行,跳出循环,返回程序的退出代码。所以,一个程序要退出,只用在代码中调用函数
UI(一)的更多相关文章
- 避免重复造轮子的UI自动化测试框架开发
一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...
- jQuery UI resizable使用注意事项、实时等比例拉伸及你不知道的技巧
这篇文章总结的是我在使用resizable插件的过程中,遇到的问题及变通应用的奇思妙想. 一.resizable使用注意事项 以下是我在jsfiddle上写的测试demo:http://jsfiddl ...
- “四核”驱动的“三维”导航 -- 淘宝新UI(需求分析篇)
前言 孔子说:"软件是对客观世界的抽象". 首先声明,这里的"三维导航"和地图没一毛钱关系,"四核驱动"和硬件也没关系,而是为了复杂的应用而 ...
- ABP框架 - Swagger UI 集成
文档目录 本节内容: 简介 Asp.net Core 安装 安装Nuget包 配置 测试 Asp.net 5.x 安装 安装Nuget包 配置 测试 简介 来自它的网页:“...使用一个Swagger ...
- 06.LoT.UI 前后台通用框架分解系列之——浮夸的图片上传
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
- 07.LoT.UI 前后台通用框架分解系列之——强大的文本编辑器
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
- 01.LoT.UI 前后台通用框架分解系列之——小图片背景全屏显示(可自动切换背景)
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
- 02.LoT.UI 前后台通用框架分解系列之——灵活的菜单栏
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
- 03.LoT.UI 前后台通用框架分解系列之——多样的表格
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
- 04.LoT.UI 前后台通用框架分解系列之——轻巧的弹出框
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
随机推荐
- 2019.2.1 现有vue-cli项目引入ESLint
ESLint 不管是多人合作还是个人项目,代码规范是很重要的.这样做不仅可以很大程度地避免基本语法错误,也保证了代码的可读性. 可能在早期建立项目的时候,因为一些原因没有引入eslint.单元测试等, ...
- c#基础学习(0627)之类型转换、算数运算符++、--
类型转换 我们要求等号两边参与运算的操作数的类型必须一致,如果不一致,满足下列条件会发生自动类型转换,或者称之为隐式类型转换 例如:int和double兼容(都是数字类型) 目标类型大于源类型 例如: ...
- [日常] CentOS安装最新版redis设置远程连接密码
wget http://download.redis.io/releases/redis-4.0.8.tar.gztar -zxvf redis-4.0.8.tar.gzmake完成后就会放在了src ...
- log4j.properties配置模板
# For JBoss: Avoid to setup Log4J outside $JBOSS_HOME/server/default/deploy/log4j.xml! # For all oth ...
- secureCRT的文件上传技巧
现在我们经常会习惯性的使用windows系统,但现在开发项目和维护中经常都在使用linux服务器,以为它的性能更强.更精简. 学习大数据的同志们和维护后端的同志们,推荐一下secureCRT软件,用起 ...
- Sql Server 中使用日期遍历
一个存储过程小案例,内容如下: declare @dt datetime set @dt='2016-01-01' while (@dt<='2016-12-31') begin -- 转换字符 ...
- logback和slf4j的使用之logger使用
原文:https://blog.csdn.net/cw_hello1/article/details/51923814 一.logger标签描述:(了解logger标签之前先看看两个重要概念) 1.主 ...
- [js常用]文字转化成语音
使用百度语音接口,实现文字转化成语音播放 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" &qu ...
- cordova打包安卓或IOS应用
1,先搞个java jdk.我先用的1.7版本的,用cordova打包的时候各种报错,应该是向下不兼容吧.又换了个1.8版本.装jdk一定要注意jdk跟jre不能都装在目标文件夹的根目录下,jdk跟j ...
- Linux 启动脚本及chkconfig命令之自启动服务
有时我们会碰到这样的情况,系统启动的时候报一大堆无法连接mysql的错误,问题在mysql数据库还没有启动的时候已经启动了一些需要连接mysql数据库的服务.这样我们就得修改启动顺序,把需要连接mys ...