MFC应用程序调用流程

MFC应用程序调用流程 - [C/C++]

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://cjbskysea.blogbus.com/logs/31147444.html

MFC应用程序启动后,操作系统通过该应用程序类来创建一个应用程序对象myapp(CMyApp myapp),应用程序类其实都是继承CWinApp类,而CWinApp类 是继承CThreadWin类,然后系统通过该应用程序对象myapp按下面步骤进行调用相应函数:


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(…)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值