[计算机软件及应用]mfc六大关键技术

上传人:自*** 文档编号:80031822 上传时间:2019-02-18 格式:DOC 页数:33 大小:74.01KB
返回 下载 相关 举报
[计算机软件及应用]mfc六大关键技术_第1页
第1页 / 共33页
[计算机软件及应用]mfc六大关键技术_第2页
第2页 / 共33页
[计算机软件及应用]mfc六大关键技术_第3页
第3页 / 共33页
[计算机软件及应用]mfc六大关键技术_第4页
第4页 / 共33页
[计算机软件及应用]mfc六大关键技术_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《[计算机软件及应用]mfc六大关键技术》由会员分享,可在线阅读,更多相关《[计算机软件及应用]mfc六大关键技术(33页珍藏版)》请在金锄头文库上搜索。

1、MFC六大关键技术之(一) 初始化过程 分类: VC学习2007-05-15 01:241183人阅读评论(7)收藏举报题外话:我并不认为MFC减轻了程序员们的负担,MFC出现的目的虽然似乎是为了让程序员不用懂得太多就可以进行视窗编程,但本人在MFC里徘徊了很久很久(因为那时没有书本详细介绍MFC的原理),毫无收获。可能朋友们会说,怎么一定要了解MFC的具体呢,“黑箱”作业不行吗?这不是微软的初衷吗?不行!如果这样,我宁愿永远不选择MFC!在学电脑之前,本人学习的东西大都与艺术不无关系,小学时参加过全国书画比赛获银奖。儿时的爱好就是在一张纸上随心所欲地画画!MFC“黑箱”就象一幅硕大的抽象画(

2、抽象到你不能理解),它用铅笔勾画好线条,然后请你填颜色。我们怎么能忍受“黑箱”作业?我们选择C+,就是因为它够自由,够艺术,我们可以在此放飞幻想。所以,我们要攻克MFC。伟大孙老师在剖析MFC的时候虽然尽心尽力,但可能由于篇幅所限,说得并不大清楚(我相信许多学员都有这方面的感受)。在此,我突发奇想,想与大家一同分享一下著名的MFC六大关键技术。从什么地方开始讲起好呢?我觉得回到最初摸索MFC的时候,从基本谈起最好。因为我知道,一个走过来程序员,总是忘记了当初自己是怎么走过来的,忘记了一个学员最想知道的是什么。一个小小的问题(一两句话就可以解释的),足学以令手无寸铁的学员头大半个月,所以,我努力

3、回忆当初是怎么让自己豁然开朗的。转入正题:MFC的六大关键技术包括:MFC程序的初始化过程。运行时类型识别(RTTI)。动态创建。永久保存。消息映射。消息传递。MFC程序的初始化过程1、设计一个简单完整MFC程序,产生一个窗口。当然这不能让AppWizard自动为我们生成。我们可以在Win32 Application工程下面那样写:i nclude class MyApp : public CWinApppublic:BOOL InitInstance() /程序入点CFrameWnd *Frame=new CFrameWnd();/构造框架m_pMainWnd=Frame; /将m_pMai

4、nWnd设定为Frame;Frame-Create(NULL,最简单的窗口);/建立框架Frame-ShowWindow(SW_SHOW); /显示框架return true; /返回;MyApp theApp; /建立应用程序。 设定链接MFC库,运行,即可看见一个窗口。 从上面,大家可以看到建立一个MFC窗口很容易,只用两步:一是从CWinApp派生一个应用程序类(这里是MyApp),,然后建立应用程序对象(theApp),就可以产生一个自己需要的窗口(即需要什么样就在InitInstance()里创建就行了)。整个程序,就改写一个InitInstance()函数,创建那么一个对象(the

5、App),就是一个完整的窗口程序。这就是“黑箱”作业的魅力!在我们正想为微软鼓掌的时候,我们突然觉得心里空荡荡的,我们想知道微软帮我们做了什么事情,而我们想编自己的程序时又需要做什么事情,那怕在上面几行的程序里面,我们还有不清楚的地方,比如,干嘛有一个m_pMainWnd指针变量,它从哪里来,又要到哪里去呢?想一想在DOS下编程是多么美妙的一件事呵,我们需要什么变量,就声明什么变量,需要什么样的函数,就编写什么样的函数,或者引用函数库但是现在我们怎么办!我们可以逆向思维一下,MFC要达到这种效果,它是怎么做的呢?首先我们要弄明白,VC不是一种语言,它就象我们学c语言的时候的一个类似记事本的编辑

6、器(请原谅我的不贴切的比喻),所以,在VC里面我们用的是C+语言编程,C+才是根本(初学者总是以为VC是一门什么新的什么语言,一门比C+先进很多的复杂语言,汗)。说了那么多,我想用一句简单的话概括“MFC黑箱就是帮助我们插入了C+代码的东西”。既然MFC黑箱帮我们插入了代码,那么大家想想它会帮我们插入什么样的代码呢?他会帮我们插入求解一元二次方程的代码吗?当然不会,所以它插入的实际上是每次编写窗口程序必须的,通用的代码。再往下想,什么才是通用的呢?我们每次视窗编程都要写WinMain()函数,都要有注册窗口,产生窗口,消息循环,回调函数即然每次都要的东西,就让它们从我们眼前消失,让MFC帮忙写

7、入!要知道MFC初始化过程,大家当然可以跟踪执行程序。孙老师的第三课跟踪了很长一段时间,我相信大家都有点晕头转向。本人觉得那怕你理解了MFC代码,也很容易让人找不着北,我们完全不懂的时候,在成千上万行程序的迷宫中如何能找到出口?我们要换一种方法,不如就来重新编写个MFC库吧,哗!大家不要笑,小心你的大牙,我不是疯子(虽然疯子也说自己不疯)。我们要写的就是最简单的MFC类库,就是把MFC宏观上的,理论上的东西写出来。我们要用最简化的代码,简化到刚好能运行。既然,我们这一节写的是MFC程序的初始化过程,上面我们还有了一个可执行的MFC程序。程序中只是用了两个MFC类,一个是CWinApp,另一个是

8、CFrameWnd。当然,还有很多同样重要MFC类如视图类,文档类等等。但在上面的程序可以不用到,所以暂时省去了它(总之是为了简单)。好,现在开始写MFC类库吧唉,面前又有一个大难题,就是让大家背一下MFC层次结构图。天,那张鱼网怎么记得住,但既然我们要理解他,总得知道它是从那里派生出来的吧。考虑到大家都很辛苦,那我们看一下上面两个类的父子关系(箭头代表派生):CObject-CCmdTarget-CWinThread-CWinApp-自己的重写了InitInstance()的应用程序类。CObject(同上)-CCmdTarget(同上)-CWnd-CFrameWnd 看到层次关系图之后,终

9、于可以开始写MFC类库了。按照上面层次结构,我们可以写以下六个类(为了直观,省去了构造函数和析构函数)。/class CObiect;/MFC类的基类。class CCmdTarget : public CObject;-class CWinThread : public CCmdTarget;class CWinApp : public CWinThread;-class CWnd : public CCmdTarget;class CFrameWnd : public CWnd;/大家再想一下,在上面的类里面,应该有什么?大家马上会想到,CWinApp类或者它的基类CCmdTarget里面

10、应该有一个虚函数virtual BOOL InitInstance(),是的,因为那里是程序的入口点,初始化程序的地方,那自然少不了的。可能有些朋友会说,反正InitInstance()在派生类中一定要重载,我不在CCmdTarget或CWinApp类里定义,留待CWinApp的派生类去增加这个函数可不可以。扯到这个问题可能有点越说越远,但我想信C+的朋友对虚函数应该是没有太多的问题的。总的来说,作为程序员如果清楚知道基类的某个函数要被派生类用到,那定义为虚函数要方便很多。也有很多朋友问,C+为什么不自动把基类的所有函数定义为虚函数呢,这样可以省了很多麻烦,这样所有函数都遵照派生类有定义的函数

11、就调用派生类的,没定义的就调用基类的,不用写virtual的麻烦多好!其实,很多面向对象的语言都这样做了。但定义一个虚函数要生成一个虚函数表,要占用系统空间,虚函数越多,表就越大,有时得不偿失!这里哆嗦几句,是因为往后要说明的消息映射中大家更加会体验到这一点,好了,就此打往。上面我们自己解决了一个问题,就是在CCmdTarge写一个virtual BOOL InitInstance()。大家再下想,我们还要我们MFC“隐藏”更多的东西:WinMain()函数,设计窗口类,窗口注册,消息循环,回调函数我们马上想到封装想封装他们。大家似乎隐约地感觉到封装WinMain()不容易, 觉得WinMai

12、n()是一个特殊的函数,许多时候它代表了一个程序的起始和终结。所以在以前写程序的时候,我们写程序习惯从WinMain()的左大括写起,到右大括弧返回、结束程序。我们换一个角度去想,有什么东西可以拿到WinMain()外面去做,许多初学者们,总觉得WinMain()函数天大的函数,什么函数都好象要在它里面才能真正运行。其实这样了解很片面,甚至错误。我们可以写一个这样的C+程序:/i nclude class testpublic:test()cout请改变你对main()函数的看法!endl;test test1;/*/void main()/在上面的程序里,入口的main()函数表面上什么也不

13、做,但程序执行了(注:实际入口函数做了一些我们可以不了解的事情),并输出了一句话(注:全局对象比main()首先运行)。现在大家可以知道我们的WinMain()函数可以什么都不做,程序依然可以运行,但没有这个入口函数程序会报错。那么WinMain()函数会放哪个类上面呢,请看下面程序:i nclude class MyApp : public CWinApppublic:BOOL InitInstance() /程序入点AfxMessageBox(程序依然可以运行!);return true; MyApp theApp; /建立应用程序。 大家可以看到,我并没有构造框架,而程序却可以运行了弹出

14、一个对话框(如果没有WinMain()函数程序会报错)。上面我这样写还是为了直观起见,其实我们只要写两行程序:i nclude CWinApp theApp; /整个程序只构造一个CWinApp类对象,任可事情,程序就可以运行!所以说,只要我们构造了CWinApp对象,就可以执行WinMain()函数。我们马上相信WinMain()函数是在CWinApp类或它的基类中,而不是在其他类中。其实这种看法是错误的,我们知道编写C+程序的时候,不可能让你在一个类中包含入口函数,WinMain()是由系统调用,跟我们的平时程序自身调用的函数有着本质的区别。我们可以暂时简单想象成,当CWinApp对象构造完的时候,WinMain()跟着执行。现在大家明白了,大部分的“通用代码(我们想封装隐藏的东西)”都可以放到CWinApp类中,那么它又是怎样运行起来的呢?为什么构造了CWinApp类对象就“自动”执行那么多东西。大家再仔细想一下,CWinApp类对象构造之后,它会“自动”

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号