MFC对话框应用程序思想以及运行初探.doc_第1页
MFC对话框应用程序思想以及运行初探.doc_第2页
MFC对话框应用程序思想以及运行初探.doc_第3页
MFC对话框应用程序思想以及运行初探.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MFC对话框应用程序思想以及运行初探 今天进行了对话框应用程序的初探,发现其中是有规律的,并且主要是有“人性化”。 现在以对话框程序,名为test2的工程文件来讲。假如我们只按使用向导生成的应用程序来分析,使用向导的工程有三个类,分别为:CAbouDlg、CTest2App、CTest2Dlg,还有一个全局变量:theApp。 theApp变量的类型为CTestApp,每个MFC工程都有这样一个全局变量,用来表示当前应用程序的实例。因为是全局变量,所以在进入WinMain函数前,先进行创建CTest2App的一个对象,以表示该应用程序产生了,于才进入到WinMain函数 当然,这过程,其实系统已经做了很多的处理了,因为MFC实际上就是封装了大量的API函数,我们在使用这些现成的类时,间接调用的都是API函数。在windows程序设计中,其实一个标准的用C/C+构成的应用程序框架为:1、进入WinMain函数,2、定义窗口类,3、根据情况进行填充窗口类,4、注册窗口类、5、使用CreateWindow函数创建窗口,6、使用ShowWindow显示窗口,7、使用UpdateWindow更新窗口,8、进入消息循环。八个步聚,已成了八古文了。 但是,如果我们在MFC下如果安照上面的八个步骤进行深入地分析,那么就把问题复杂化了,特别是对初学者。人产生于大自然中,也在大自然中发展,我们要改变大自然是很难的,而要改变自己是比较容易的。大自然的澳妙在于变化无穷,给人以美丽、神秘,和憧憬,我们要发展,就要不断地吐故纳新,接受新的事物,欣然地接受它,转个角度,为已所用! 于是,对于MFC所封装的API,我们不讨论,完全以对象的思维来进行考虑问题,暂时去除经典,建立适合自已的思维模型。可以这样地考虑:在MFC的世界里,任何所看得见的,都可以把它看成是一个对象(这个对象可以看作windows下的对象,也可以看作面向对象设计中的对象),对象之间可以是独立的,也可以是相互联系的。 独立在于,每个对象可以看作对外界封闭,自己可以对自己进行任何的属性修改,使改变自己的形态,也可以操作自己的方法从而使自己产生不同的行为,这些行为(函数或方法)可以独立于其它而进行设计,这就是所谓的独立。例如:我们拖了一个按钮在窗口上,这时,它以资源的形式存在,但实际上它已经和一个CButton类进行关联了,于是,我们就把这个按钮看成是一个对象,这个对象本身有大小,型状等属性,还有方法,(CButton类里装封有很多函数),这些方法可以改变它的文字、改变该按钮本身等操作。这些操作或属性是不受外界影响的(除非别的对象获得了和该对象的联系的纽带-对象指针或句柄,下边讨论到),无论你把它移到窗口的任何地方。同时,如果我们要在这个对象上添加我们新的方法或属性,我们就要创建一个新的类来继承它,再在这个新的类上添加我们想添加的方法或属性,不然如果我们不新建新类,那么我们新添加的新方法或新属性放在哪里?我们总该有地方来放我们新的代码吧?于是新建一个新类,并继承一个CButton是必要的,因此我们可以创建一个新类,如myCButton,其基类为CButton,myCButton这个对象比原来的特性多点,这是没关系的,我们也以一样的方法关联到一个控件按钮上,并且以一样的思维把它看成是一个对象,只不过它”大“点而已嘛,也一样有同类对象的特点。OK这就是它的独立性。 相互联系在于,每个对象都有一个句柄和一个对象指针,只要外界的其它类型 的对象获得了,哪么其它的对象就可以和它联系了,并且可以对它进行操作,甚至完全控制。比如说我们在上边的test2工程中,有这几个类,其们之间都有联系,CAboutDlg类和CTest2Dlg有父子的关系,在CAboutDlg中通过GetParent()函数,就可以获取父类的指针,于是子类就可以向父窗口进行操作或通信了;同理,CTest2App和CTest2Dlg 也有关联,theApp这对对象就是指向CTest2Dlg的,可以通过AfxGetApp()函数获取CTest2App类对象的指针,当然也可直接使用theApp对象进行对CTest2App的操作;而theApp对象里有一个成员变量m_pMainWnd,它是CTest2Dlg的指针类型,于是,CTest2App对象就可以对CTest2Dlg对象进行操作了。这就是在MFC中,每个对象都可以找得到关联,关且都可以对对方进行一定的操作。 我们知道如下的一个hello word的程序:#include int main() printf(hello word!n); return 0; 它的执行入口是main函,我们知道C语主的入口函数都是从main函数开始的,而MFC程序的入口函数不是main,而是WinMain,但我们在我们使用MFC向导生成的程序中,进行搜索,并没有发现WinMain函,这是何故呢?这是因为微软早已经把很多底层的API函数进行封装起来了,我们并不看得见,这样的封装可以使我们更好地编程,在它的框架下添加相应的程序就行了,但这也使我们的深入理解带来了不便。不过不要紧,我们不用知道太多,我们关心的是如何使用,关心的是怎么样写出我们想要的应用程序。于是,我们就使用我们自己的思维方式考虑问题。 其实MFC的应用程序,开始时,都是从theApp(InitInstance)开始,我们就把它看成我们的WinMain函数,程序执行theApp这句时,就开始创建一个CTest2App的对象,于是进入构造函数CTest2App();构造函数执行完了,就进入到InitInstance()函数,我们看看InitInstance()函数的代码:BOOL CTest2App:InitInstance()AfxMessageBox(InitInstance1);AfxEnableControlContainer();/ Standard initialization/ If you are not using these features and wish to reduce the size/ of your final executable, you should remove from the following/ the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls();/ Call this when using MFC in a shared DLL#elseEnable3dControlsStatic();/ Call this when linking to MFC statically#endifCTest2Dlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse = IDOK)/ TODO: Place code here to handle when the dialog is/ dismissed with OKelse if (nResponse = IDCANCEL)/ TODO: Place code here to handle when the dialog is/ dismissed with Cancel/ Since the dialog has been closed, return FALSE so that we exit the/ application, rather than start the applications message pump.AfxMessageBox(InitInstance2);return FALSE;其它的我们不关注,只关注:CTest2Dlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse = IDOK)/ TODO: Place code here to handle when the dialog is/ dismissed with OKelse if (nResponse = IDCANCEL)/ TODO: Place code here to handle when the dialog is/ dismissed with Cancel这几行请看CTest2Dlg dlg这句,其就创建了一个对象dlgm_pMainWnd=&dlg把CTest2Dlg对象的指针赋给CTest2App的成员变量m_pMainWnd(这个成员变量在它的父类里),使CTest2App能和CTest2Dlg产生关联。CTest2Dlg的构造函数调用完之后,就调用DoDataExchange数据交换函数,为什么这么早就要调用这个函数呢?因为一旦我们的窗口要初始化和窗口显示了,就是使用到数据了,所以要先调用这个函数;接下来就调用到OnInitDialog()初始化窗口的函数,初始化之后就要显示了,于是接着就要调用OnPaint()函数,在窗口上画一些东西;还有一个OnSysCommand()函数,这个函数是响应标题栏上的操作的。当我们把这个对话框关了之后,就会反回一个值给nResponse变量,于是执行到int nResponse = dlg.DoModal();语句的下面的语句,于早,当InitLnstance函数执行结束了,整个应用程序就结束了。由此可见,整个应用程序从theApp开始进入InitInstance函数进行执行,再在里面绕了九曲十八弯(在里面执行调用了其它的函数),然后又回到InitInstance函数,入从InitInstance,而出又从InitInstance,由此可见,InitInstance是不是蛮像main函数的?总结一下:其执行的路线为:CTest2App:CTest2App()-CTest2App:InitInstance()-CTest2Dlg:CTest2Dlg(CW

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论