【转】第二章 MFC程序框架的剖析

说明:本课对应教学视频的第三课,第二课是C++,被我跳过去。C++我打算另外在用多点的篇幅来讨论。

    重点MFC运行机制

提示:对于不想理解内部运行过程的,可以不看这一章,可以看了后面的界面设计再回头来看这一章,可能感觉更深刻。

这一次课和上一次的课的重点就是MFC的窗口类创建过程,而要反复说明的就是:MFC的程序和C语言的程序,从执行原理上说,是完全一致的。

抓住这一点,那么对于理解MFC程序的运行机制也就相对于简单了。

C中的main函数就相当于MFC中的WinMain函数。

感兴趣的可以利用VC的断点设置自己跟踪下面讲述的各个函数,就明白它的执行顺序了。

一、C语言程序执行步骤

C语言中,大约的步骤如下:

1,  全局变量内存分配

2,  进入main函数

二、MFC程序的运行步骤(主要是初始化)

打开一个MFC APPWizard(exe)工程,跟踪其执行步骤,可以发现,是以下顺序:

1)         CXXApp中的全局变量定义

CXXApp theApp;

2)              调用CXXApp构造函数

CXXApp ::CXXApp(){}

3)              进入Winmain函数(_tWinMain为宏,值为WinMain

_tWinMain(){}

4)              完成初始化工作:包括窗口类注册、窗口产生、显示和更新

pThread->InitInstance()

 

对于MFC程序,MainFrame,View,ToolBarControlbar等都是窗口,所以下面的窗口注册与创建、显示等要反复调用多次,一次对应一个窗口

(1)       注册窗口类

AfxEndDeferRegisterClass

(2)       创建窗口

CMainFrame::PreCreateWindow()//反复调用一次是给我们修改窗口属性的机会

CFrameWnd::Create()

(3)       消息循环

PumpMessage()

补充1

MFC中,由于涉及到(窗口)类定义,所以定义全局变量的时候,需要进行更多的步骤。

全局变量涉及到类定义(类似于C中的类型定义)的话,那么需要遵循以下步骤(以MFC的窗口类为例)

1)  设计一个窗口类

2)  注册窗口类

3)  创建窗口

4)  显示及更新窗口

5)  消息循环

 

补充2其他需要注意的几点

1,  每一个MFC程序,有且只有一个从WinApp类派生的类(应用程序类),也只有一个从应用程序类所事例化的对象,表示应用程序本身。在WIN32程序当中,表示应用程序是通过WINMAIN入口函数来表示的(通过一个应用程序的一个事例号这一个标识来表示的)。在基于MFC应用程序中,是通过产生一个应用程序对象,用它来唯一的表示了应用程序。

2,  _tWinMain函数中通过调用AfxWinMain()函数来完成它要完成的功能。(Afx*前缀代表这是应用程序框架函数,是一些全局函数,应用程序框架是一套辅助生成应用程序的框架模型,把一些类做一些有机的集成,我们可根据这些类函数来设计自己的应用程序)。

3,  设计窗口类:在MFC中事先设计好了几种缺省的窗口类,根据不同的应用程序的选择,调用AfxEndDeferRegisterClass()函数注册所选择的窗口类。

4,  PreCreateWindow()是个虚函数,如果子类有则调用子类的。

5,  CreateWindowEx()函数参数与CREATESTRUCT结构体成员完全一致,CreateWindowEx()函数与CREATESTRUCT结构体参数的对应关系,使我们在创建窗口之前通过可PreCreateWindow(cs)修改cs结构体成员来修改所要的窗口外观。

6,注意两个函数。

::TranslateMessage(&m_msgCur)函数进行消息(如键盘消息)转换

::DispatchMessage(&m_msgCur)函数分派消息到窗口的回调函数处理(实际上分派的消息经过消息映射,交由消息响应函数进行处理。)

7,可以认为View类窗口是CMainFram类窗口的子窗口。DOCument类是文档类。DOC-VIEW结构将数据本身与它的显示分离开。

文档类用于数据的存储,加载;视类用于数据的显示,修改

8,CTEApp::InitInstance()函数中通过文档模板将文档类,视类,框架类的有机组织一起。语句如下:

CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
 IDR_MAINFRAME,
 RUNTIME_CLASS(CTEDoc),
 RUNTIME_CLASS(CMainFrame),       // main SDI frame window
 RUNTIME_CLASS(CTEView));
AddDocTemplate(pDocTemplate);//
增加到模板

 

补充3本课涉及到MFC函数的源文件位置

根目录

找到您安装VC98MFC的位置,比如我的机子上为:D:/Program Files/Microsoft Visual Studio/VC98/MFC。下面提供的就是相对路径了。

 

CWinApp构造函数: MFCèSRCèAPPCORE.CPP

AfxWinMainMFCèSRCèWINMAIN.CPP

AfxEndDeferRegisterClass: MFCèSRCèAPPCORE.CPP

CFrameWnd::PreCreateWindow()函数所在文件:MFCèSRCèWINFRM.CPP

CFrameWnd::Create()函数路径:MFCèSRCèWINFRM.CPP

CWnd::CreateEx()函数路径:MFCèSRCèWINCORE.CPP

CWinThread::Run()方法路径:MFCèSRCèTHRDCORE.CPP

 

    韦伯主页: http://mail.ustc.edu.cn/~bywang(提供此笔记系列相关源程序下载)

    韦伯Blog: http://webbery.tianyablog.com

 

参考书目和网站: 
    (1)孙鑫VC++视频
    (2)1-6章主要参考: hbyufan的BLog
    (3)11-20章主要参考: songpeng的Blog
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值