MFC中的文档程序流程图 mfc多文档应用程序

1、首先定义一个全局应用程序变量(CxxxApp theApp),所以运行程序时先构造该变量,构造该变量又导致调

用了它的父类的构造函数CWinApp::CWinApp(LPCTSTRlpszAppName),该函数定义在APPCORE.CPP。

2、运行到主程序入口点WinMain()函数,该函数是操作系统调用的。该函数定义在APPMODUL.CPP。该函数有一

个宏定义_tWinMain();MFC实际是通过宏来实现WinMain()函数的调用。

3、在WinMain()中又是通过调用AfxWinMain()函数来完成其功能的,而AfxWinMain()是一个全局函数。该函数定

义在WINMAIN.CPP。

4、在AfxWinMain()函数体中我们可以看到,它获得了当前线程CWinThread *pThread=AfxGetThread()和当前应

用实例CWinApp*pApp=AfxGetApp()对象。我们知道CWinApp派生于CWinThread,从AfxGetThread()函数体中我

们可以发现该函数返回的也是AfxGetApp()函数返回的结果,AfxGetThread()定义在THRDCORE.CPP。所以这里

面实际上pThread和pApp都是指向该应用程序的唯一实例即全局变量theApp.

在AfxWinMain()中调用了pApp->InitApplication()、pThread->InitInstance()、pThread->Run()三个函数.

这三个函数实际上就是完成了:设计窗口、注册窗口、创建窗口、显示窗口、更新窗口、消息循环及窗口过

程函数的功能。

pApp->InitApplication()该函数完成了MFC内部管理方面的工作。

pThread->InitInstance()因为pThread是指向pApp的对象,而InitInstance()又是虚函数,根据多态原则,

它实际调用了其子类CxxxApptheApp中的InitInstance()。而InitInstance()函数我们可以在创建的工程应

用程序类中看到。

5、在CxxxApptheApp中的InitInstance()中我们可以看到他调用了文档模板,并将参数传递给模板构造了该模

板对象。

CSingleDocTemplate*pDocTemplate;
pDocTemplate = newCSingleDocTemplate(
MFC中的文档程序流程图 mfc多文档应用程序
IDR_MAINFRAME,
RUNTIME_CLASS(CxxxDoc),
RUNTIME_CLASS(CMainFrame),// main SDI frame window 框架窗口(主窗口)
RUNTIME_CLASS(CxxxView));//视类窗口
AddDocTemplate(pDocTemplate);

在这构造里面完成了窗口的设计,注册,创建工作。

6、从5中我们可以看到,模板实际上注册了两个窗口:框架窗口CMainFrame和视类窗口CxxxView。其中框架窗口

类中有一个函数PreCreateWindow,它是在窗口产生之前被调用的,在工程项目中我们可以清楚的看到它调用

了CFrameWnd::PreCreateWindow(cs)父类的函数。父类的PreCreateWindow函数定义在WINFRM.CPP中。

从父类的该函数体中我们看到它调用了AfxDeferRegisterClass,这个函数实际上是一个宏定义,该宏定义在

AFXIMPL.H文件中.它实际上就是AfxEndDeferRegisterClass()函数。该函数又定义在WINCORE.CPP中。在该函

数中MFC提供了默认的几个标准窗口类(即设计窗口类),根据不同的窗口类型注册窗口,在这里面我们可以

看到它的窗口过程函数是DefWindowProc。但在这个函数中没有直接注册,而是通过调用函数

AfxRegisterClass来完成最后注册的。该函数的定义在WINCORE.CPP中。这样我们就完成了主窗口的注册。

7、窗口注册之后就要创建窗口,CFrameWnd类通过LoadFrame函数调用了Create函数进行窗口的创建,Create函数

定义在AFXWIN.H中,在Create函数中又调用了CreateEx函数,但是CFrameWnd中并没有该函数,它又如何调用

呢?由于继承的关系,可得它调用的是CWnd类的CreateEx函数,该函数声明在AFXWIN.H,定义在WINCORE.CPP

中。从CreateEx函数中我们又看到了,在函数体中又在次调用了PreCreateWindow窗口注册函数。为何?主要

是为了给程序员一个机会,让它在此可以改变窗口外观。而且在CreateEx函数中它还有一个钩子函数:

AfxHookWindowCreate。函数最后调用全局函数::CreateWindowEx进行窗口的最终创建。

8、窗口创建完成之后,就是显示,更新操作了.在pThread->InitInstance()函数体中我们看到了两句

m_pMainWnd->ShowWindow(SW_SHOW); //窗口显示
m_pMainWnd->UpdateWindow(); //窗口更新

m_pMainWnd是CxxxApp中的一个成员变量.继承得来的...

9、以上在pThread->InitInstance()就完成了窗口的各种动作.在这之后我们就要开始消息的循环,那么它又是

在哪完成的呢,其实它是在pThread->Run()中完成的.该函数定义在THRDCORE.CPP中。该函数实际就是一个

for循环,当接收到WM_QUIT消息后退出。

10、经过上面的步骤,一个窗口就创建完成了。

  

爱华网本文地址 » http://www.aihuau.com/a/25101010/34309.html

更多阅读

怎么复制百度文库的文档 自动取款机打印凭条

怎么复制百度文库的文档——简介百度文库是无法复制的,如果我们想复制该怎么办呢?其实很简单,我们无须下载任何东西!就这个问题今天我写了篇经验,希望这篇经验能帮到大家!!!谢谢!!!!!怎么复制百度文库的文档——方法/步骤

如何免费下载百度文库的文档 百度文库表格

如何免费下载百度文库的文档——简介如何免费下载百度文库的文档如何免费下载百度文库的文档——工具/原料百度文库是百度旗下的一个产品,上面有很多文档,我们搜索很多资料时会发现很多时候都搜到百度文库,但是百

怎样更改我的文档和收藏夹的默认位置 精 收藏夹 我的文档

“我的文档”和“收藏夹”都是我们平时储存资料的地方,默认情况下,这两个的路径位于系统分区,那么当重装系统或系统分区的数据遭到损坏时,这些数据也会随之丢失,其实我们是可以更改“我的文档”和“收藏夹”的默认位置。怎样更改我的文

如何忽略word文档中的全部语法错误 word 语法 全部忽略

用户可以借助Word2010中的“拼写和语法”功能检查Word2010文档中存在的单词拼写错误或语法错误,并且可以根据实际需要设置“拼写和语法”选项,使拼写和语法检查功能更适合自己的使用需要。在Word2010中设置“拼写和语法”选项的步骤如

MFC中的文档程序流程图 mfc多文档应用程序

1、首先定义一个全局应用程序变量(CxxxApp theApp),所以运行程序时先构造该变量,构造该变量又导致调用了它的父类的构造函数CWinApp::CWinApp(LPCTSTRlpszAppName),该函数定义在APPCORE.CPP。2、运行到主程序入口点WinMain()函数,该函

声明:《MFC中的文档程序流程图 mfc多文档应用程序》为网友黄昏把影拨弄分享!如侵犯到您的合法权益请联系我们删除