ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:45.09KB ,
资源ID:17605494      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/17605494.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(剖析MFC六大关键技术文档格式.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

剖析MFC六大关键技术文档格式.docx

1、当然这不能让AppWizard自动为我们生成。我们可以在Win32 Application工程下面那样写:#include class MyApp : public CWinApppublic:BOOL InitInstance() /程序入点CFrameWnd *Frame=new CFrameWnd();/构造框架m_pMainWnd=Frame; /将m_pMainWnd设定为Frame;Frame-Create(NULL,最简单的窗口);/建立框架ShowWindow(SW_SHOW); /显示框架return true; /返回;MyApp theApp; /建立应用程序。设定链接M

2、FC库,运行,即可看见一个窗口。从上面,大家可以看到建立一个MFC窗口很容易,只用两步:一是从CWinApp派生一个应用程序类(这里是MyApp),,然后建立应用程序对象(theApp),就可以产生一个自己需要的窗口(即需要什么样就在InitInstance()里创建就行了)。整个程序,就改写一个InitInstance()函数,创建那么一个对象(theApp),就是一个完整的窗口程序。这就是“黑箱”作业的魅力!在我们正想为微软鼓掌的时候,我们突然觉得心里空荡荡的,我们想知道微软帮我们做了什么事情,而我们想编自己的程序时又需要做什么事情,那怕在上面几行的程序里面,我们还有不清楚的地方,比如,干

3、嘛有一个m_pMainWnd指针变量,它从哪里来,又要到哪里去呢?想一想在DOS下编程是多么美妙的一件事呵,我们需要什么变量,就声明什么变量,需要什么样的函数,就编写什么样的函数,或者引用函数库但是现在我们怎么办!我们可以逆向思维一下,MFC要达到这种效果,它是怎么做的呢?首先我们要弄明白,VC不是一种语言,它就象我们学c语言的时候的一个类似记事本的编辑器(请原谅我的不贴切的比喻),所以,在VC里面我们用的是C+语言编程,C+才是根本(初学者总是以为VC是一门什么新的什么语言,一门比C+先进很多的复杂语言,汗)。说了那么多,我想用一句简单的话概括“MFC黑箱就是帮助我们插入了C+代码的东西”。

4、既然MFC黑箱帮我们插入了代码,那么大家想想它会帮我们插入什么样的代码呢?他会帮我们插入求解一元二次方程的代码吗?当然不会,所以它插入的实际上是每次编写窗口程序必须的,通用的代码。再往下想,什么才是通用的呢?我们每次视窗编程都要写WinMain()函数,都要有注册窗口,产生窗口,消息循环,回调函数即然每次都要的东西,就让它们从我们眼前消失,让MFC帮忙写入!要知道MFC初始化过程,大家当然可以跟踪执行程序。孙老师的第三课跟踪了很长一段时间,我相信大家都有点晕头转向。本人觉得那怕你理解了MFC代码,也很容易让人找不着北,我们完全不懂的时候,在成千上万行程序的迷宫中如何能找到出口?我们要换一种方法

5、,不如就来重新编写个MFC库吧,哗!大家不要笑,小心你的大牙,我不是疯子(虽然疯子也说自己不疯)。我们要写的就是最简单的MFC类库,就是把MFC宏观上的,理论上的东西写出来。我们要用最简化的代码,简化到刚好能运行。既然,我们这一节写的是MFC程序的初始化过程,上面我们还有了一个可执行的MFC程序。程序中只是用了两个MFC类,一个是CWinApp,另一个是 CFrameWnd。当然,还有很多同样重要MFC类如视图类,文档类等等。但在上面的程序可以不用到,所以暂时省去了它(总之是为了简单)。好,现在开始写MFC类库吧唉,面前又有一个大难题,就是让大家背一下MFC层次结构图。天,那张鱼网怎么记得住,

6、但既然我们要理解他,总得知道它是从那里派生出来的吧。考虑到大家都很辛苦,那我们看一下上面两个类的父子关系(箭头代表派生):CObject-CCmdTarget-CWinThread-CWinApp-自己的重写了InitInstance()的应用程序类。CObject(同上)-CCmdTarget(同上)-CWnd-CFrameWnd看到层次关系图之后,终于可以开始写MFC类库了。按照上面层次结构,我们可以写以下六个类(为了直观,省去了构造函数和析构函数)。/class CObiect;/MFC类的基类。class CCmdTarget : public CObject;-class CWinT

7、hread : public CCmdTarget;class CWinApp : public CWinThread;class CWnd :class CFrameWnd : public CWnd;大家再想一下,在上面的类里面,应该有什么?大家马上会想到,CWinApp类或者它的基类CCmdTarget里面应该有一个虚函数virtual BOOL InitInstance(),是的,因为那里是程序的入口点,初始化程序的地方,那自然少不了的。可能有些朋友会说,反正InitInstance() 在派生类中一定要重载,我不在CCmdTarget或CWinApp类里定义,留待CWinApp的派生

8、类去增加这个函数可不可以。扯到这个问题可能有点越说越远,但我想信C+的朋友对虚函数应该是没有太多的问题的。总的来说,作为程序员如果清楚知道基类的某个函数要被派生类用到,那定义为虚函数要方便很多。也有很多朋友问,C+为什么不自动把基类的所有函数定义为虚函数呢,这样可以省了很多麻烦,这样所有函数都遵照派生类有定义的函数就调用派生类的,没定义的就调用基类的,不用写virtual的麻烦多好!其实,很多面向对象的语言都这样做了。但定义一个虚函数要生成一个虚函数表,要占用系统空间,虚函数越多,表就越大,有时得不偿失!这里哆嗦几句,是因为往后要说明的消息映射中大家更加会体验到这一点,好了,就此打往。上面我们

9、自己解决了一个问题,就是在CCmdTarge写一个virtual BOOL InitInstance()。大家再下想,我们还要我们MFC“隐藏”更多的东西:WinMain()函数,设计窗口类,窗口注册,消息循环,回调函数我们马上想到封装想封装他们。大家似乎隐约地感觉到封装WinMain()不容易, 觉得WinMain()是一个特殊的函数,许多时候它代表了一个程序的起始和终结。所以在以前写程序的时候,我们写程序习惯从WinMain()的左大括写起,到右大括弧返回、结束程序。我们换一个角度去想,有什么东西可以拿到WinMain()外面去做,许多初学者们,总觉得WinMain()函数天大的函数,什么

10、函数都好象要在它里面才能真正运行。其实这样了解很片面,甚至错误。我们可以写一个这样的C+程序:/iostream.hclass testtest()coutHINSTANCE hInstance;class CFrameWnd HWND hwnd;CFrameWnd(); /也可以在这里调用Create()virtual CFrameWnd();int Create(); /类就留意这一个函数就行了!BOOL ShowWnd();class CWinApp1 CFrameWnd* m_pMainWnd;/在真正的MFC里面/它是CWnd指针,但这里由于不写CWnd类/只要把它写成CFrameW

11、nd指针CWinApp1* m_pCurrentWinApp;/指向应用程序对象本身CWinApp1();virtual CWinApp1();/MFC原本是必须重载的函数,最重要的函数!virtual BOOL Run();/消息循环CFrameWnd:CFrameWnd()CFrameWnd()int CFrameWnd:Create() /封装创建窗口代码WNDCLASS wndcls;wndcls.style=0;wndcls.cbClsExtra=0;wndcls.cbWndExtra=0;wndcls.hbrBackground=(HBRUSH)GetStockObject(WHI

12、TE_BRUSH);wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);wndcls.hIcon=LoadIcon(NULL,IDC_ARROW);wndcls.hInstance=hInstance;wndcls.lpfnWndProc=DefWindowProc;/默认窗口过程函数。/大家可以想象成MFC通用的窗口过程。wndcls.lpszClassName=窗口类名;wndcls.lpszMenuName=NULL;RegisterClass(&wndcls);hwnd=CreateWindow(,窗口实例标题名,WS_OVERLAPPEDWINDOW,

13、0,0,600,400,NULL,NULL,hInstance,NULL);return 0;BOOL CFrameWnd:ShowWnd()/显示更新窗口ShowWindow(hwnd,SW_SHOWNORMAL);UpdateWindow(hwnd);/CWinApp1:CWinApp1()m_pCurrentWinApp=this;CWinApp1()/以下为InitInstance()函数,MFC中要为CWinApp的派生类改写,/这里为了方便理解,把它放在CWinApp类里面完成!/你只要记住真正的MFC在派生类改写此函数就行了。BOOL CWinApp1:InitInstance(

14、)m_pMainWnd=new CFrameWnd;m_pMainWnd-Create();ShowWnd();Run()/封装消息循环MSG msg;while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(& /封装消息循环CWinApp1 theApp; /应用程序对象(全局)int WINAPI WinMain( HINSTANCE hinst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)hInstance=hinst;CWinApp1*

15、 pApp=theApp.m_pCurrentWinApp;/真正的MFC要写一个全局函数AfxGetApp,以获取CWinApp指针。pApp-InitInstance();Run();代码那么长,实际上只是写了三个函数,一是CFrameWnd类的Create(),第二个是CWinApp类的 InitInstance()和Run()。在此特别要说明的是InitInstance(),真正的MFC中,那是我们跟据自己构造窗口的需要,自己改写这个函数。大家可以看到,封装了上面两个类以后,在入口函数WinMain中就写几行代码,就可以产生一个窗口程序。在MFC中,因为 WinMain函数就是固定的那

16、么几行代码,所以MFC绝对可以帮我们自动完成(MFC的特长就是帮我们完成有规律的代码),所以我们创造MFC应用程序的时候,看不到WinMain函数。写到这里,MFC六大关键技术之一:MFC程序的初始化过程(模拟),就差不多写完了。回头看一下,居然写了八千多字,原本以为写完六大关键技术也不用写那么多字,现在还觉得庆幸的是不把文档、视类牵连进去,否则更不知写到何时。还有五大关键技术没有写,我还应该写下去吗?上面写了八千多字,都是我一个字一个字地敲进去,每个例子都是自己生硬地想出来。用了十多个小时,换来的可能更多是论坛中朋友们的漫骂,讥讽!但我觉得还是值得的,我一向认为VC没有敌人,只有朋友,放眼周

17、围,发觉学VC的朋友越来越少,也没有发现多少招收VC程序员的地方。记得读大学的时候,我遇到一位搞美术的师兄,本来同行如敌国(我曾经搞过美术)。师兄美术功底很好,但他从来没有在学校获过美术一等奖,原因评奖的不懂得欣赏他的作品。我的出现,他深刻地体会到了:多一个朋友,会少一分孤独!有时觉得学习VC的朋友是英雄(但我不是英雄,因为我学VC多年来无甚突破),是值得尊敬的人物,大家交流一下,纠正一下自己的错误,真是一种福份本人的QQ:14653353,E_mail:liyi268 (这是两男两女共用的邮箱,可能不一定是我收到,若注明小李先生收另当别论)欢迎联系。类别:c+ | | 添加到搜藏 | 分享到

18、i贴吧 | 浏览(53) | 评论(0) 追根究底,MFC六大关键技术之剖析(第二部分)小李先生二、运行时类型识别(RTTI)运行时类型识别(RTTI)即是程序执行过程中知道某个对象属于某个类,我们平时用C+编程接触的RTTI一般是编译器的RTTI,即是在新版本的VC+编译器里面选用“使能RTTI”,然后载入typeinfo.h文件,就可以使用一个叫typeid()的运算子,它的地位与在C+编程中的sizeof()运算子类似的地方(包含一个头文件,然后就有一个熟悉好用的函数)。typdid()关键的地方是可以接受两个类型的参数:一个是类名称,一个是对象指针。所以我们判别一个对象是否属于某个类就可以象下面那样:if (typeid (ClassName)= typeid(*ObjectName)(ClassName*)ObjectName)-Fun();象上面所说的那样,一个typeid()运算子就可以轻松地识别一个对象是否属于某一个类,但MFC并不是用typeid()的运算子来进行动态类型识别,而是用一大堆令人费解的宏。很多学员在这里很疑惑,好象MFC在大部分地方都是故作神秘。使们大家编程时很迷惘,只知道在这里加入一组宏,又在那儿加入一

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1