MFC的内部过程

本文详细解析了MFC程序的启动过程,包括CTestApp类的实例化、窗口类的注册与创建、消息循环等关键步骤。通过跟踪从WinMain到各组件的初始化,揭示了MFC框架内部的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class CTestApp::CWinApp{...};      //每个mfc程序有且只有一个从CWinApp派生出来的类(CTestApp)

CTestApp theApp;       //只有一个从(CTestApp)实例化的对象(theApp),此对象唯一表示该应用程序

------------------------------------------------------------------------------------

APPCORE.CPP中有CWinApp的代码。

CWinApp::CWinApp()                                //  CWinApp的构造函数  

{

pThreadState->m_pCurrentWinThread = this;         //this指向 (CTestApp) 的对象 (theApp)

 }

------------------------------------------------------------------------------------------

 APPMODUL.CPP中有_tWinMain()即WinMain()代码。

_tWinMain(...)
{
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}

---------------------------------------------------------------------------------------------
WINMAIN.CPP中有AfxWinMain()的代码。CWinApp是由CWinThread派生出的子类。

AfxWinMain(...)

{

CWinThread* pThread = AfxGetThread();                 //  AfxGetThread 返回(CTestApp)对象(theApp)的指针

CWinApp* pApp = AfxGetApp();                             //AfxGetApp返回(CTestApp)对象(theApp)的指针

pThread->InitInstance();                                     // InitInstance是虚函数,即(theApp)->InitInstance() 

nReturnCode = pThread->Run();                        //消息循环

-------------------------------------------------------------------------------------------

CTestApp::InitInstance() 

{

ProcessShellCommand(cmdInfo);                    //完成窗口的注册创建,见 **** 部分 

m_pMainWnd->ShowWindow(SW_SHOW);    //m_pMainWnd指向CMainFrame创建的窗口对象  
m_pMainWnd->UpdateWindow();                   //显示及更新窗口

-------------------------------------------------------------------------------------------

******************************************************* 

WINCORE.CPP中有AfxEndDeferRegisterClass()的代码

AfxEndDeferRegisterClass(...)

{

...                                                       //给窗口类成员赋值 

AfxRegisterClass(&wndcls);                //注册窗口类

}

---------------------------------------------------------------------------------------- 

CMainFrame类是CFrameWnd类的子类,而CFrameWnd类又是CWnd类的子类

CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
CFrameWnd::PreCreateWindow(cs);            
 //调用父类的PreCreateWindow函数  
}

------------------------------------------------------------------------------------------
WINFRM.CPP中有
CFrameWnd::PreCreateWindow()的代码

CFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
{
if (cs.lpszClass == NULL)                                
//判断类名是否为空 

{
    VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG));  
// AFXIMPL.H中指出AfxDeferRegisterClass宏指代 AfxEndDeferRegisterClass()
    cs.lpszClass = _afxWndFrameOrView;
}
}
-----------------------------------------------------------------------------------------------

WINFRM.CPP中有CFrameWnd::LoadFrame()的代码

CFrameWnd::LoadFrame(...)

{

Create(...);              //调用CFrameWnd::Create函数

-------------------------------------------------------------------------------------------- 

WINFRM.CPP中有CFrameWnd::Create()的代码

CFrameWnd::Create(...)

{

CreateEx(...);                //CreateEx是父类CWnd的成员函数

}

------------------------------------------------------------------------------------------------- 

WINCORE.CPP中有CWnd::CreateEx()的代码

CWnd::CreateEx(...)

{

...                                   //为cs赋值,可自定义类

PreCreateWindow(cs);     //调用CMainFrame::PreCreateWindow注册窗口类

::CreateWindowEx(...);      //创建窗口

}

********************************************************** 

---------------------------------------------------------------------------------------------- 

THRDCORE.CPP中有CWinThread::Run()的代码

CWinThread::Run()

{

PumpMessage();               //消息循环

---------------------------------------------------------------------------------------------

THRDCORE.CPP中有CWinThread::PumpMessage()的代码

CWinThread::PumpMessage() 

{

::GetMessage(...);

::TranslateMessage(&m_msgCur);
::DispatchMessage(&m_msgCur);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值