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 ...
随机推荐
- ajax读取图片后排列问题(先加载完图片再排列)
网上找了个瀑布流的图片排列插件.从数据库读取图片路径后显示时出现了位置重叠问题. $.ajax({ type: "POST", url: "index.aspx" ...
- C#中const 和 readonly 修饰符的用法详解
1.const是不变常量,在编译的时候就需要有确定的值,只能用于数值和字符串,或者引用类型只能为null.(这里为什么要把字符串单独拿出来?是因为字符串string是引用类型,但是使用的时候却感觉是值 ...
- SQL 修改表字段失败 解决方法
OK 大功告成 !!!
- SpringBean 工作原理详解
本文来自Github开源项目https://github.com/Snailclimb/JavaGuide,只供自己学习总结无商业用途,如有侵权,联系删除 前言 在 Spring 中,那些组成应用程序 ...
- JVM进程状态监控
前言 ========== 为什么需要做服务器jvm自动发现的监控呢?这个事情主要有两点原因: 1.zabbix默认监控jvm状态是使用jmx中转进行监控的,监控效率比较低下 2.zabbix使用jm ...
- Spring boot 入门三:SpringBoot用JdbcTemplates访问Mysql 实现增删改查
建表脚本 -- create table `account`DROP TABLE `account` IF EXISTSCREATE TABLE `account` ( `id` int(11) NO ...
- “使用IDEA,配置文件是yml,无法获取[环境变量],值是null”的问题处理
为了便于隐藏用户名和密码,我们有时会用到“环境变量”. Spring Boot提供了很好的机制,可以在配置文件中,如application.yml书写以下格式,然后在代码中@Value就可以获取“环境 ...
- drupal7 hook_validate
原文:function hook_validate function hook_validate($node, $form, &$form_state) { if (isset($node-& ...
- 网鼎杯 pwn 记录
题目位置 https://gitee.com/hac425/blog_data/tree/master/wdb babyheap 通过分配和释放构建 2 个 fastbin 链 利用 show 功能, ...
- Burp Suite插件推荐
BurpSuiteHTTPSmuggler 网址 https://github.com/nccgroup/BurpSuiteHTTPSmuggler 作用 利用 中间件对 HTTP 协议的实现的特性 ...