MFC应用程序调用流程 - [C/C++]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://cjbskysea.blogbus.com/logs/31147444.html
1:调用该对象的构造函数(基类构造函数),而基类构造函数先调用其父类的构造函数,而父类的构造函数先调用父类的父类构造函数。 即:CMyApp():CWinApp():CThreadWin(),而在调用CThreadWin()时,其实会调用CThreadWin类的Run函数来启动该应用程序对象的 主线程,Run()函数是在CThreadWin()函数体里面的。这些步骤后应用程序对象就启动了。
2:调用该应用程序对象的InitInstance()初始化函数,该对象的InitInstance()的函数体如下: InitCommonControls();//WindowsAPI,如果一个运行在XP上的应用程序清单指定要使用 ComCtl32.dll 版本 6
//或更高版本来启用可视化方式,则需要函数。否则将无法创建窗口
CWinApp::InitInstance();//调用父类的初始化函数
if (!AfxOleInit())// 初始化 OLE 库
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
AfxEnableControlContainer(); // 标准初始化,如果未使用这些功能并希望减小最终可执行文件的大小,
//则应移除下列,不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));// 例如修改为公司或组织名
这些步骤后应用程序对象就完成初始化工作。
3:每个应用程序对象都有一个属于自己的框架,即myapp对象有个属性C frameWnd 类型的 m_pMainWND,该属性是它的基类的,就是CWinApp的。
首先先申明一个指向主框架类对象的指针如下:
CMainFrame* pFrame = new CMainFrame;
if (!pFrame) return FALSE;
m_pMainWnd = pFrame; //给myapp属性m_pMainWND进行赋值
pFrame->LoadFrame(IDR_MAINFRAME,WS_OVERLAPPEDWINDOW|FWS_ADDTOTITLE,NULL,NULL);
//创建并加载带有其资源的框架
pFrame->ShowWindow(SW_SHOW);// 一个窗口已初始化,显示它
pFrame->UpdateWindow();//对其进行更新 return TRUE;
这些步骤都是在myapp调用InitInstance()初始化函数时做的,即3的内容也是InitInstance()的函数体一部分。
4:在上面的
pFrame->LoadFrame(IDR_MAINFRAME,WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,NULL);
// 创建并加载带有其资源的框架
其中pFrame是一个指向CMainFrame类对象的指针,CMainFrame类是主框架类,它继承CFrameWnd 。在pFrame调用LoadFrame()这个函数时, 其实LoadFrame()不是CMainFrame类的,而是基类的。LoadFrame()函数作以下事情:
4.1:调用pFrame所属类的 OnCreate()函数,即调用对象自己类的OnCreate()函数,就是CMainFrame::OnCreate()。
而CMainFrame::OnCreate()函数体中是先运行基类的CFrameWnd::OnCreate(), 而运行基类的OnCreate()时,
会调用子类的CMainFrame::PreCreateWindow(),而运行CMainFrame::PreCreateWindow()时,是先调用 CFrameWnd::PreCreateWindow()的。
LoadFrame函数 流程: CMainFrame::OnCreate() 4
CFrameWnd::OnCreate() 3
CMainFrame:: PreCreateWindow() 2
CFrameWnd::PreCreateWindow() 1
调用 LoadFrame函数时,先调用4,再运行LoadFrame自己的东西。
调用4 时,先调用3,再运行4自己的东西。
调用3时 ,先调用2,再运行3自己的东西(3自己的东西)。
调用 2时,先调用1,再运行2自己的东西。
4 .2: 每个应用程序都有个主框架(顶级窗口=主框架=主窗口),所以Cw inApp 类里面就有个成员变量是CFrameWnd。而每个主框架也都有个子窗口, 所以 主框架类里面就有个-CWnd类或者CWnd子类的类型的属性(多数为CWnd子类CChildView): m_wndView 而且这个属性一般是在 CFrameWnd 子类申明的即:在 CMainFrame类里面声明的.在第 4.1 点中的“ 3自己的东西 ”就是给主框架的 m_wndView 属性进行赋值。 m_wndView.create(…), create 函数是 CWnd 类的,该函数做了:
4.2.1 :CChildView:: O n Create ()即: m_wndView. On Create , 而CChildView::On Create会先调用CW nd:: O n Create , 而 CW nd:: O n Create 会调用CChildView:: PreCreateWindow()。
4.2.2: 做 create 自己的东西。
5: 最后 pFrame ->ShowWindow(...); pFrame ->UpdateWindow(...);
主框架: LoadFrame(…)->OnCreate(…)->PreCreateWindow(…) 子窗口:
create(…)- >OnCreate(…)->PreCreateWindow(…)