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    表示指向字符/字符串的指针

L表示long指针,这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32位操作系统中, long指针和near指针及far修饰符都是为了兼容的作用,没有实际意义。即win32中,long,near,far指针与普通指针没有区别,LP与P是等效的。
P表示这是一个指针。
T表示_T宏,这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。
STR表示这个变量是一个字符串。
C表示是一个常量,const。
 

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
);
7.InitApplication  //用于初始化代码
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

获取当前进程已加载模块的文件的完整路径,该模块必须由当前进程加载。
如果想要获取另一个已加载模块的文件路径,可以使用GetModuleFileNameEx函数。
DWORD WINAPI GetModuleFileName(
    _In_opt_  HMODULE hModule,
    _Out_     LPTSTR lpFilename,
    _In_      DWORD nSize
);
hModule Long
一个模块的句柄。可以是一个DLL模块,或者是一个应用程序的实例句柄。如果该参数为NULL,
该函数返回该应用程序全路径。
lpFileName String
指定一个字串缓冲区,要在其中容纳文件的用NULL字符中止的路径名,hModule模块就是从这个文件装载进来的
nSize Long
装载到缓冲区lpFileName的最大字符数量
参见百度百科。
11.GetBufferSetLength
申请一个指定长度的空间
12.ReleaseBuffer
GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象在以后的代码中继续可以实现长度自适应增长的功能。
ReleaseBuffer作用,就是更新字符串的长度。
13.GetLength
返回值:返回字符串中的字节计数。
此成员函数用来获取这个CString对象中的字节计数。这个计数不包括结尾的空字符。
14.VRS与UI中基站信息数据处理异同
VRS:

UI:

15.AfxOleInit  // 初始化 OLE 库

OLE,Object Linking and Embedding,对象连接与嵌入,简称OLE技术。OLE 不仅是桌面应用程序集成,而且还定义和实现了一种允许应用程序作为软件“对象”(数据集合和操作数据的函数)彼此进行“连接”的机制,这种连接机制和协议称为组件对象模型(COM)。

ole是对象链接嵌入技术的缩写。允许你在程序中嵌入别的程序的文档(此时你的程序成为容器),或者别的程序嵌入你的程序的文档(此时你的程序成为服务器)
你的程序完成ole的初始化,之所以有,是你创建mfc项目的时候勾选了ole的支持。

 同一个进程,只能调用一次AfxOleInit,不能调用第二次,多次调用必然失败。
一般来说,推荐在程序入口函数中调用AfxOleInit,调用之后,你封装的类无需再调用AfxOleInit。
可以尝试用AfxOleGetMessageFilter() != NULL判断OLE是否初始化
 
 16.INITCOMMONCONTROLSEX
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()。否则,将无法创建窗口。

17.ICC_WIN95_CLASSES  注册InitCommonControls函数注册的所有类。
    // 将它设置为包括所有要在应用程序中使用的
    // 公共控件类。
    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  

UpdateData() 是MFC的窗口函数,用来刷新数据的。
总的来说:操作系统会调用这个函数来初始化对话框中的数据,或者检索或者验证对话框中的数据。
CMemoryState  CMemoryState提供了便利的方式以检测程序中的“内存空洞”。“内存空洞”发生于已经为一个对象分配了内存,而在长期不再需要时也没有释放。这样的内存空洞最终可能导致内存溢出错误。
20.AfxEnableControlContainer

调用在应用程序对象的 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(一)的更多相关文章

  1. 避免重复造轮子的UI自动化测试框架开发

    一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...

  2. jQuery UI resizable使用注意事项、实时等比例拉伸及你不知道的技巧

    这篇文章总结的是我在使用resizable插件的过程中,遇到的问题及变通应用的奇思妙想. 一.resizable使用注意事项 以下是我在jsfiddle上写的测试demo:http://jsfiddl ...

  3. “四核”驱动的“三维”导航 -- 淘宝新UI(需求分析篇)

    前言 孔子说:"软件是对客观世界的抽象". 首先声明,这里的"三维导航"和地图没一毛钱关系,"四核驱动"和硬件也没关系,而是为了复杂的应用而 ...

  4. ABP框架 - Swagger UI 集成

    文档目录 本节内容: 简介 Asp.net Core 安装 安装Nuget包 配置 测试 Asp.net 5.x 安装 安装Nuget包 配置 测试 简介 来自它的网页:“...使用一个Swagger ...

  5. 06.LoT.UI 前后台通用框架分解系列之——浮夸的图片上传

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  6. 07.LoT.UI 前后台通用框架分解系列之——强大的文本编辑器

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  7. 01.LoT.UI 前后台通用框架分解系列之——小图片背景全屏显示(可自动切换背景)

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  8. 02.LoT.UI 前后台通用框架分解系列之——灵活的菜单栏

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  9. 03.LoT.UI 前后台通用框架分解系列之——多样的表格

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  10. 04.LoT.UI 前后台通用框架分解系列之——轻巧的弹出框

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

随机推荐

  1. 封装RabbitMQ.NET Library 的一点经验总结 转载

    这篇文章内容会很短,主要是想给大家分享下我最近在做一个简单的rabbitmq客户端类库的封装的经验总结,说是简单其实一点都不简单.为了节省时间我主要按照Library的执行顺序来介绍,在你看来这里仅仅 ...

  2. DOM-添加元素、节点

    createElement()方法能够根据参数指定的标签名称创建一个新元素,并返回新建元素的引用,用法如下 var element=document.createElement("tagNa ...

  3. 项目托管到Github上

    一.注册github账号   首先需要注册一个github账号,注册地址:https://github.com 接着会来到这 然后会收到一封github发的邮件,进入邮箱验证 二.创建个人的githu ...

  4. 表示层设计模式:Intercepting Filter(截取筛选器)模式

     上下文  问题  影响因素  解决方案  变体  示例  结果上下文  相关模式  致谢  上下文 对于任何一个曾经从头建立 Web 应用程序的人来说,他们都会有这样的体会:这项任务所需要的独立完成 ...

  5. 请整体描述Java异常体系

    java把异常当做对象来处理,并定义一个基类Throwable作为所有异常的超类.在java API中已经定义了许多异常的类,这些异常分为两大类,错误Error和异常Exception.其中异常Exc ...

  6. [AngularJS] “路由”的定义概念、使用详解——AngularJS学习资料教程

    这是小编的一些学习资料,理论上只是为了自己以后学习需要的,但是还是需要认真对待的 以下内容仅供参考,请慎重使用学习 AngularJS“路由”的定义概念 AngularJS最近真的很火,很多同事啊同学 ...

  7. css文字属性

    font-family- css字体:设定时,需考虑浏览器中有无该字体. 比如说“黑体”  “微软雅黑” font-size -css字体大小: 注意度量html单位.例如:font-size:18p ...

  8. 网络I/O模型--01阻塞模式(普通)

    很长一段时间内,大多数网络通信方式都是阻塞模式,即: · 客户端 向服务器端发出请求后,客户端会一直处于等待状态(不会再做其他事情),直到服务器端返回结果或者网络出现问题 . · 服务器端同样如此,当 ...

  9. Spring Boot—16日志设置

    application.properties # server.address=0.0.0.0 server.port=8080 server.servlet.context-path=/test s ...

  10. 行动学习方法----PARR