MFC框架程序剖析

MFC框架程序剖析

一、MFCAppWizard

1、MFC(MicrosoftFoundation Class,微软基础类库)是微软为了简化程序员的开发工作所开发的一套C++

类的集合,是一套面向对象的函数库,以类的方式提供给用户使用

2、MFCAppWizard是一个辅助我们生成源代码的向导工具,它可以帮助我们自动生成基于MFC框架的源代码

二、基于MFC的程序框架剖析

1、MFC程序的ClassView标签页(图)

2、继承关系

(1)CMainFrame继承于CFrameWnd

(2)CTestApp继承于CWinApp

(3)CTestDoc继承于CDocument

(4)CTestView继承于CView

注:CFrameWnd和CView都继承于CWnd

3、CWnd类是MFC中一个非常重要的类,它封装了与窗口相关的操作

4、MFC类的简化组织结构图(图)

5、MFC程序也有一个WinMain函数,程序是在编译时,由链接器将它链接到程序中

6、MFC程序具有一个CTestApp类的全局对象theApp,在MFC程序运行时,程序执行的顺序为:theApp全局对象定义

处->CTestApp构造函数->WinMain函数

7、对于普通的VC++控制台程序,无论全局变量还是全局对象,程序运行时,在加载main函数之前,就已经为它们

分配了内存空间。对于一个全局对象来说,此时就会调用该对象的构造函数,构造该对象,并进行初始化操作

8、实例句柄与全局对象

(1)对于Win32SDK程序,应用程序的实例是由实例句柄(WinMain函数的hInstance参数)来标识的

(2)对于MFC程序,应用程序的实例是由全局对象(每一个MFC程序有且仅有一个从应用程序类CWinApp派生的类,

如CTestApp,它实例化theApp全局对象)来标识的

9、基类构造函数中this指针的指向问题

在构造子类对象时,会自动调用父类的构造函数,此时在父类的构造函数中的this指针所指向的是子类对象地

10、AfxWinMain函数

MFC程序的WinMain函数是通过调用AfxWinMain函数来完成它的功能的

注:Afx前缀的函数代表应用程序框架(ApplicationFramework)函数,它们可以在程序的任何地方被调用

11、CTestApp::InitInstance函数

在AfxWinMain函数中,通过调用InitInstance函数来完成MFC内部管理方面的工作

12、AfxEndDeferRegisterClass函数

MFC提供了一些默认的标准窗口类,我们只需要选择所需的窗口类就行。然后,调用AfxEndDeferRegisterClass

数来注册窗口类

13、CMainFrame::PreCreateWindow函数

MFC程序具有两个窗口(框架窗口和视类窗口),在框架窗口产生之前会调用PreCreateWindow函数

14、CWnd::CreateEx函数

在MFC程序中,窗口的创建是由CreateEx函数实现的

15、CWnd::CreateWindowEx函数

主要作用是当修改了CreateEx函数的CREATESTRUCT参数时,CreateWindowEx函数会根据参数发生的相应变化来创

建一个符合我们要求的窗口

注:MFC中后缀名为Ex的函数都是扩展函数

16、CMainFrame::ShowWindow函数和CMainFrame::UpdateWindow函数

用于显示应用程序框架窗口和更新这个窗口

17、CWinThread::Run函数和CWinThread::PumpMessage函数

用于完成消息循环

18、DefWindowProc函数

默认的窗口过程,但MFC程序对消息的处理实际上是通过消息映射机制来完成的

19、MFC程序的运行过程

(1)首先利用全局应用程序对象theApp启动应用程序

(2)调用全局应用程序对象的构造函数,从而就会调用其基类CWinApp的构造函数,以完成应用程序的一些初始化

(3)进入WinMain函数

(4)进入消息循环

20、MFC程序的主要过程

theApp->

CTestApp::CTestApp构造函数->

CWinApp::CWinApp构造函数->

_tWinMain(WinMain函数的宏)->

AfxWinMain函数->

CTestApp::InitInstance函数->

AfxEndDeferRegisterClass函数->

CMainFrame::PreCreateWindow函数->

CFrameWnd::PreCreateWindow函数->

AfxDeferRegisterClass(AfxEndDeferRegisterClass函数的宏)->

CFrameWnd::Create函数->

CWnd::CreateEx函数->

CMainFrame::PreCreateWindow函数->

CWnd::CreateEx函数->

CMainFrame::ShowWindow函数->

CMainFrame::UpdateWindow函数->

CWinThread::Run函数->

CWinThread::PumpMessage函数

21、框架窗口(整个应用程序外框所包括的部分)是视类窗口(框架窗口中空白的地方)的一个父窗口

22、MFC提供了一个文档/视类的结构,文档是指CDocument类,视类是指CView类。前者用于数据的存储和加载,

后者用于数据的显示和修改

23、框架对象、文档对象和视类对象是通过一个单文档模板指针来有机地组织在一起,并利用AddDocTemplate函数

把这个单文档模板添加到文档模板中,从而把这三个类组织成为一个整体

24、MFC程序的CAboutDlg类继承于CDialog类,用于为用户提供一些与程序相关的帮助信息

三、窗口类、窗口类对象与窗口

1、以“::”开始的函数是一个全局函数,表示调用的是Platform SDK的函数

2、如果我们关闭了一个窗口,这个窗口就销毁了,那么该窗口对应的C++窗口类对象销毁了吗?

(1)当一个窗口销毁时,它会调用CWnd::DestroyWindow函数,该函数销毁窗口后,将CWnd::m_hWnd设为NULL

(2)窗口的生命周期和C++窗口类对象的声明周期不是一致的。当一个窗口销毁时,与C++窗口类对象没有关系,它

们之间的纽带仅仅在于这个C++窗口类内部的成员变量m_hWnd,该变量保存了与这个C++窗口类对象相关的哪个窗口

的句柄

(3)但是,当C++窗口类对象销毁时,与之相关的窗口也将销毁,因为它们之间的纽带m_hWnd已经断了

3、示例---在窗口中显示按钮

(1)CButton按钮类继承于CWnd

(2)对于一个CButton对象,在定义之后就可以使用了;但是,如果要显示这个按钮的话,还需调用

CButton::Create函数,把按钮窗口与CButton对象关联起来

(3)MFC程序的窗口创建时都会产生WM_CREATE消息,该消息通过OnCreate函数来捕获。对于框架窗口来说,MFC直

接把OnCreate函数提供到了CMainFrame中;而在视类窗口中没有提供该函数,如需使用,要用户自行添加

(4)通常对MFC程序的操作,都是在CTestView视类窗口中进行的

(5)在窗口创建之后,要显示该窗口可以通过调用ShowWindow函数或指定窗口风格为WS_VISIBLE来实现

(6)实现过程

A:在CTestView类中,添加CButton类型的私有成员m_btn

B:在CTestView类中,添加WM_CREATE消息的OnCreate处理函数

C:在CTestView类中,通过GetParent函数可以获得CMainFrame框架窗口对象的指针

D:实现一(在视类窗口中通过ShowWindow函数显示按钮)

intCTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

...

m_btn.Create("按钮",WS_CHILD|BS_DEFPUSHBUTTON,CRect(0,0,100,100),this,123);

m_btn.ShowWindow(SW_SHOWNORMAL);

return 0:

}

E:实现二(在视类窗口中通过WS_VISIBLE风格显示窗口)

int CTestView::OnCreate(LPCREATESTRUCTlpCreateStruct)

{

...

m_btn.Create("按钮",WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,CRect(0,0,100,100),this,123);

return 0:

}

F:实现三(在框架窗口中显示按钮)

intCTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

...

m_btn.Create("按钮",WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,CRect(0,0,100,100),GetParent(),123);

return 0:

}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值