learnvc VC学习 教程 计算机.docx

上传人:夺命阿水 文档编号:1416087 上传时间:2024-06-15 格式:DOCX 页数:181 大小:469.37KB
返回 下载 相关 举报
learnvc VC学习 教程 计算机.docx_第1页
第1页 / 共181页
learnvc VC学习 教程 计算机.docx_第2页
第2页 / 共181页
learnvc VC学习 教程 计算机.docx_第3页
第3页 / 共181页
learnvc VC学习 教程 计算机.docx_第4页
第4页 / 共181页
learnvc VC学习 教程 计算机.docx_第5页
第5页 / 共181页
点击查看更多>>
资源描述

《learnvc VC学习 教程 计算机.docx》由会员分享,可在线阅读,更多相关《learnvc VC学习 教程 计算机.docx(181页珍藏版)》请在课桌文档上搜索。

1、一走进ViSUaIC+*1理解VC工程*2 MFC编程特点七3 使用WiZard*二MFC程序结构分析*1WlNDOWS程序工作原理三2建立应用程序*3程序结构剖析*3. 1类CMyAPPt4. 2类CMAlNFRAMEt5. 3类CMyVieW与CMyDoC*三深入MFC类库*6. 理用户输入*7. 1定义对话框资源*1.2定义对话框类*2有关屏幕输出*2. 1设备上下文工作原理*2. 2实例绘图原理剖析*2. 3绘图操作实现*8. 4有关屏幕映射方式*3文件处理由9. 1对象持续化简述*10. 2实例分析专4DAo技术汇4. 1DAo与ODBC11. 2使用MFC实现DAO技术*5打印*5

2、. 1打印和显示土5.2打印分页*5. 3打印工作的开始和结束12. 4打印程序实例*四、VC程序调试*1.1调试环境的建立*1.2调试的一般过程*1.3如何设置断点*1.4控制程序的运行*1.5查看工具的使用*2高级调试技术*2.1TRACE宏的利用*2.2ASSERT宏的利用*2.3ASSERT_VA1.ID宏的利用以及类的ASSertVaIid()成员函的重载*2.4对象的DUNP函数的利用*3内存漏洞的检查*五ViSUalC+与多媒体汇1对声音的处理*1.1媒体控制接口*2多媒体文件I/O*3多媒体图形图像技术*4图像合成士5F1.C动画主6热点*一走进ViSUaIC+VisualC+

3、作为一个功能非常强大的可视化应用程序开发工具,是计算机界公认的最优秀的应用开发工具之一。Microsoft的基本类库MFC使得开发Windows应用程序比以往任何时候都要容易。本光盘教学软件的目的就是为了让你学会在ViSUalC+环境下,利用微软的基本类库MFC开发出功能强大的WindoWS应用程序。在本章节的内容当中,我们将向您介绍使用VC开发软件需要用到的一些基本概念,使用MFC进行编程的基本特点,以及VlSUA1.C+集成开发环境提供的一系列编程辅助工具一一WIZARD的使用方法。1理解VC工程VisualC+作为一种程序设计语言,它同时也是一个集成开发工具,提供了软件代码自动生成和可视

4、化的资源编辑功能。在使用ViSUalC+开发应用程序的过程中,系统为我们生成了大量的各种类型的文件,在本节中将要详细介绍VisualC+中这些不同类型的文件分别起到什么样的作用,在此基础上对VisualC+如何管理应用程序所用到的各种文件有一个全面的认识。首先要介绍的是扩展名为dsw的文件类型,这种类型的文件在VC中是级别最高的,称为WOrkSPaCe文件。在VC中,应用程序是以PrOjeCt的形式存在的,ProjeCt文件以.dsp扩展名,在WorkSPaCe文件中可以包含多个ProjeCt,由Workspace文件对它们进行统一的协调和管理。与dsw类型的Workspace文件相配合的一个

5、重要的文件类型是以OPt为扩展名的文件,这个文件中包含的是在Workspace文件中要用到的本地计算机的有关配置信息,所以这个文件不能在不同的计算机上共享,当我们打开一个WOrkSPaCe文件时,如果系统找不到需要的OPt类型文件,就会自动地创建一个与之配合的包含本地计算机信息的OPt文件。上面提到Project文件的扩展名是dsp,这个文件中存放的是一个特定的工程,也就是特定的应用程序的有关信息,每个工程都对应有一个dsp类型的文件。以Clw为扩展名的文件是用来存放应用程序中用到的类和资源的信息的,这些信息是VC中的ClassWizard工具管理和使用类的信息来源。对应每个应用程序有一个re

6、adme,txt文件,这个文件中列出了应用程序中用到的所有的文件的信息,打开并查看其中的内容就可以对应用程序的文件结构有一个基本的认识。在应用程序中大量应用的是以h和CPP为扩展名的文件,以h为扩展名的文件称为头文件。以CPP为扩展名的文件称为实现文件,一般说来h为扩展名的文件与cpp为扩展名的文件是对应配合使用的,在h为扩展名的文件中包含的主要是类的定义,而在cpp为扩展名的文件中包含的主要是类成员函数的实现代码。在应用程序中经常要使用一些位图、菜单之类的资源,VC中以rc为扩展名的文件称为资源文件,其中包含了应用程序中用到的所有的WindOwS资源,要指出的一点是rc文件可以直接在VC集成

7、环境中以可视化的方法进行编辑和修改。最后要介绍的是以rc2为扩展名的文件,它也是资源文件,但这个文件中的资源不能在VC的集成环境下直接进行编辑和修改,而是由我们自己根据需要手工地编辑这个文件。对于以ico,bmp等为扩展名的文件是具体的资源,产生这种资源的途径很多。使用rc资源文件的目的就是为了对程序中用到的大量的资源进行统一的管理。2 MFC编程特点如果你曾经使用过传统的windows编程方法开发应用程序,你会深刻地体会到,即使是开发一个简单的windows应用程序也需要对windows的编程原理有很深刻的认识,同时也要手工编写很多的代码。因为程序的出错率几乎是随着代码长度的增加呈几何级数增

8、长的,这就使得调试程序变得非常困难。所以传统的windows编程是需要极大的耐心和丰富的编程经验的。近几年来,面向对象技术无论是在理论还是实践上都在飞速地发展。面向对象技术中最重要的就是“对象”的概念,它把现实世界中的气球、自行车等客观实体抽象成程序中的“对象”。这种“对象”具有一定的属性和方法,这里的属性指对象本身的各种特性参数。如气球的体积,自行车的长度等,而方法是指对象本身所能执行的功能,如气球能飞,自行车能滚动等。一个具体的对象可以有许多的属性和方法,面向对象技术的重要特点就是对象的封装性,对于外界而言,并不需要知道对象有哪些属性,也不需要知道对象本身的方法是如何实现的,而只需要调用对

9、象所提供的方法来完成特定的功能。从这里我们可以看出,当把面向对象技术应用到程序设计中时,程序员只是在编写对象方法时才需要关心对象本身的细节问题,大部分的时间是放在对对象的方法的调用上,组织这些对象进行协同工作。MFC的英文全称是MiCroSoftFundationClasses,即微软的基本类库,MFC的本质就是一个包含了许多微软公司已经定义好的对象的类库,我们知道,虽然我们要编写的程序在功能上是千差万别的,但从本质上来讲,都可以化归为用户界面的设计,对文件的操作,多媒体的使用,数据库的访问等等一些最主要的方面。这一点正是微软提供MFC类库最重要的原因,在这个类库中包含了一百多个程序开发过程中

10、最常用到的对象。在进行程序设计的时候,如果类库中的某个对象能完成所需要的功能,这时我们只要简单地调用已有对象的方法就可以了。我们还可以利用面向对象技术中很重要的“继承”方法从类库中的已有对象派生出我们自己的对象,这时派生出来的对象除了具有类库中的对象的特性和功能之外,还可以由我们自己根据需要加上所需的特性和方法,产生一个更专门的,功能更为强大的对象。当然,你也可以在程序中创建全新的对象,并根据需要不断完善对象的功能。正是由于MFC编程方法充分利用了面向对象技术的优点,它使得我们编程时极少需要关心对象方法的实现细节,同时类库中的各种对象的强大功能足以完成我们程序中的绝大部分所需功能,这使得应用程

11、序中程序员所需要编写的代码大为减少,有力地保证了程序的良好的可调试性。最后要指出的是MFC类库在提供的对象的各种属性和方法都是经过谨慎的编写和严格的测试,可靠性很高,这就保证了使用MFC类库不会影响程序的可靠性和正确性。3 使用WizardVisualC+是一种功能强大的通用程序设计语言,它提供了各种向导和工具帮助我们来实现所需的功能,在一定程度上实现了软件的自动生成和可视化编程。下面就为你介绍VC集成环境中几个最主要的开发工具的使用方法。首先要介绍的是Appwizard工具,这个工具的作用是帮助我们一步步地生成一个新的应用程序,并且自动生成应用程序所需的基本代码。下面我们就介绍使用Appwi

12、zard生成一个应用程序的具体步骤。单击FiIe菜单NeW菜单项,系统弹出的对话让我们选择所要创建的文件类型,这里的文件分成了Files,Project,Workspaces,Otherdocuments四种大类型,每一个类型下面又包含许多具体的文件类型,选中Projects标签,标签下的工作区中列出的是各种不同的应用程序类型,比如d11类型的动态链接库,exe类型的可执行程序等,这里选中MFCAPPWiZard(exe)选项,表示要创建的是一个使用MFC基本类库进行编程的可执行程序。如下图1.l所示:1.1 选好后在ProjeCtnanIe一栏中为程序起一个名字为test,在IoCation

13、一栏中为程序定义文件存放的目录,对话框右下角的platforms一栏中的Win32项表示要创建的程序是建立在32位的windows平台基础上。单击OK按钮,就启动了使用MFC方式开发应用程序的APPWiZarCi功能。图1.2 WiZard让我们选择程序的类型和程序中的资源所用的语种,这里不妨选择程序类型为单文档界面,语种为英语,然后单击NEXT按钮。图1.3Wizard让我们选择是否需要提供数据库方面的支持,这里选择NONE,然后单击NEXT按钮。图1.4下面选择程序中对复合文档的支持,这里选择NONE。接着选择程序的其它一些特性,如提供对WlNSOCK的支持等。这里对系统的缺省值不作改变,

14、如下图1.6所示。单击NEXT按钮。在第五步中,对话框上部选择是否为程序自动生成注释,对话框的下部用来选择使用MFC类库的方式是动态链接库方式还是静态链接方式,使用动态链接库方式时在以后生成的可执行应用程序中并不真正包含MFC类库中的对象,而使用静态链接方式时,则把MFC库中的代码生成为应用程序的一部分,这时生成的应用程序也就相对大一些。选好后单击按钮。图1.7进入APPwIZARD的最后一个步骤,对话框中的提示信息指明了系统将要自动创建的对象和相关文件,以及派生出这些对象的MFC的基类等内容。在这一步当中,我们还可以对视图类的基类进行选择,单击FINISH按钮。图1.8游览一下对话框中对将要

15、生成的程序的有关信息的描述后单击OK按钮。系统就自动为我们生成一个使用MFC基本类库的应用程序的基本框架,在以后将会对这个框架的内容作详细的介绍。接下来介绍VC集成环境中提供的一个很重要的工具C1.ASSWIZARD,它主要是用来管理程序中的对象和消息的,这个工具对于MFC编程显得尤为重要。单击VlEW菜单的C1.ASSWlZARD项,就可以运行MFCC1.ASSWIZARD,在这个对话框中就可以对程序中的对象和消息进行管理了。图1.10在对话框中的MESSAGEMAPS标签下,PRoJECT栏中的内容代表当前程序的名字。C1.ASSwNAME下拉列表框列出的就是程序当前用到的所有类的名字,在

16、MESSAGE一栏中列出的就是一个选中的类所能接收到的所有的消息,在WINDOWS程序设计中,消息是个极为重要的概念,用户通过窗口界面的各种操作最后都转化为发送到程序中的对象的各种消息,下面就向您介绍在WINDOWS程序设计中最常用的一些消息:1 窗口消息:WM.CREATE,WM_DESTROY,WM.C1.OSE我们创建一个窗口对象的时候,这个窗口对象在创建过程中收到的就是WMfREATE消息,对这个消息的处理过程一般用来设置一些显示窗口前的初始化王作,如设置窗口的大小,背景颜色等,WMDESTROY消息指示窗口即将要被撤消,在这个消息处理过程中,我们就可以做商口撤消前的一些工作。WMC1

17、.OSEWmClOSe消息发生在窗口将要被关闭之前,在收到这个消息后,一般性的操作是回收所有分配给这个窗口的各种资源。在WineIOWS系统中资源是很有限的,所以回收资源的工作还是非常重要的。2 键盘消息:WM.CHAR,WM_KEYDOWN,WM_KEYUP这三个消息用来处理用户的键盘数据,当用户在键盘上按下某个键的时候,会产生WMj(EYDOWN消息,释放按键的时候又回产生WMJ(EYUP消息,所以WMj(EYDowN与B1.KEYUP消息一般总是成对出现的,至于WM_CHAR消息是在用户向键盘输入能产生有效的ASeIl码时才会发生。这里特别短醒要注意前两个消息与WM_CHAR消息在使用上

18、是有区别的。在前两个消息中,伴随消息传递的是按键的虚拟键码,所以这两个消息可以处理非打印字符,如方向键,功能键等。而伴随WN1.CHAR消息的参数是所按的键的ASCII码,ASCII码是可以区分字母的大小写质。而虚拟键码是不能区分大小写的。3 鼠标消息:WM_MOUSEMOVE,WM_1.BUHONDOTO,WM_1.BUTTONUP,WM_1.BUTTONDBC1.ICK,WM_RBUTTONDOTO,WM_RBUTTONUP,WM_RBUTTONDBC1.ICK这组消息是与鼠标输入相关的,WMMOUSEMOVE消息发生在鼠标移动的时候,剩余的六个消息则分别对应于鼠标左君键的按下、释放、双击

19、事件,要指出的是WINDOWS系统并不是在鼠标每移动一个像素时都产生MOUSEMOVE消息,这一点要特别注意。4 另一组窗口消息:WM_MOVE,WM_SIZE,WM_PAINT当窗口移动的时候产生WM_MOVE消息,窗口的大小改变的时候产生WM_SIZE消息,而当窗口工作区中的同容需要重画的时候就会产生WM-PAINT消息。5 焦点消息WM1.SETFoeUS,WM_KI1.1.FOCUS当一个窗口从非活动状态变为具有输入焦点的活动状态的时候,它就会收到Blsetfocus消息,而当窗口失去输入焦点的时候它就会收到WMja1.1.FOCUS消息。6定时器消息:WM,TIMER当我们为一个窗口

20、设置了定时器资源之后,系统就会按规定的时间间隔向窗口发送WMTlMER消息,在这个消息中就可以处理一些需要定期处理的事情。最后要指出的一点是,在WlNDoWS环境下,消息的来源是多方面的,最常见的是用户的操作产生消息,系统在必要的时候也会向程序发送系统消息,其他在运行中的程序也可以向程序发送消息。此外,在程序的内部,也可以根据需要在适当的时候主动产生消息,比如主动产生WMPAINT消息以实现需要的重画功能。上面介绍了MESSAGE栏中主要的消息,在MEMBERFUNCTlON一栏中列出的是目前被选中的类已经有的成员函数。这些成员函数一般说来是与这个类可以接收的消息一一对应的。也就是说,一个成员

21、函数一般总是用来处理某个特定的消息。如果在MESSAGE栏中的某个消息在程序中需要处理,但目前还没有相应的类成员函数,比如这里选中WMTlMER这个消息,它目前还没有相应的对应的类的成员函数,单击ADDFUNCTloN按钮,系统就自动为WMJmIER消息在类中添加了对应的成员函数ONTIMER,单击editcode按钮,Z以发现系统已经自动生成了完成ontimer函数所需的基本代码,我们只要在这些基本代码的基础上再添加所需要的代码就可以了。注意对话框中的ADDC1.ASS按钮,它用来往当前应用程序中添加一个新的类。单击后选中NEW菜单,图1.12系统弹出了NEWC1.ASS对话框用于生成一个新

22、的类。在这个对话框中需要为类起个名字,设置类文件的名字,另外还要在BASEC1.ASS一栏的下拉列表框中选择某个己有的类作为基类,设好需要的信息后单击OK就生成了一个新的类。图1.13C1.ASSWIZARD还有一些很强大的功能,这里就不再详细介绍,你会在不断的学习中慢慢地了解和掌握。最后介绍一下集成环境提供的一个重要工具RESOiJCREDITOR,也就是资源编辑器。在VC开发的应用程序中要用到大量的位图,菜单,工具条,对话框等各种资源。这些资源对于程序而言是相对独立的,所以可以对它们进行单独的编辑,然后使用在程序中。而RESoUCEEDITOR正是为编辑资源提供了一种可视化的开发方法。极大

23、地减轻了程序员的负担。单击Fl1.E菜单的OPEN菜单项,然后在对话框中选择打开TEST.RC文件,就可以开始使用资源编辑器了。在左边的工作区中按类型列出了程序中用到的所有的资源,双击其中的某个类型,比如双击MENU资源,MENU目录的下面列出的就是系统已经有的MENU类型的资源,选中其中一个并双击,在右边的工作区中列出了这个资源当前的样子,我们就可以在工作区中对资源进行可视化的编辑和修改了。图1.14如何添加一个资源呢?单击INSERT菜单,选中RESOURCE菜单项,系统弹出INSERTRESOURCE对话框。如图1.15。图1.15在图1.15这个对话框,在这个对话框中选中一种资源类型,

24、比如选择CURSOR类型,然后单击NEW按钮。在左边的工作区中就出现了我们新生成的资源的标识符,双击这个标识符,在右边的工作区中就可以对这个新的指针形状资源进行可视化编辑了。如图1.16。通过这部分内容的介绍,相信您己经对使用VISUA1.C+开发MFC应用程序的图1.16基本步骤有了认识。在下一章的内容当中,我们将结合WINDoWS的工作原理,详细地向您解释MFC类库的基本结构,以及MFC应用程序的基本框架一一文档/视图结构。二MFC程序结构分析1WINDOWS程序工作原理WINDOWS程序设计是一种完全不同于传统的DOS方式的程序设计方法,它是一种事件驱动方式的程序设计模式。在程序提供给用

25、户的界面中有许多可操作的可视对象。用户从所有可能的操作中任意选择,被选择的操作会产生某些特定的事件,这些事件发生后的结果是向程序中的某些对象发出消息,然后这些对象调用相应的消息处理函数来完成特定的操作。WINDOWS应用程序最大的特点就是程序没有固定的流程,而只是针对某个事件的处理有特定的子流程,WINDOWS应用程序就是由许多这样的子流程构成的。从上面的讨论中可以看出,WINDoWS应用程序在本质上是面向对象的。程序提供给用户界面的可视对象在程序的内部一般也是一个对象,用户对可视对象的操作通过事件驱动模式触发相应对象的可用方法。程序的运行过程就是用户的外部操作不断产生事件,这些事件又被相应的

26、对象处理的过程。下面是WINDOWS程序工作原理的示意图。2建立应用程序在介绍APPWiZard的时候,我们己经建立了一个名字为TEST的工程,事实上这个框架程序已经可以编译运行了。在BUI1.D菜单中选择REBUI1.DA1.1.菜单项,系统开始编译由APPTyIZARD自动生成的程序框架中所有文件中的源代码,并且链接生成可执行的应用程序。在BUl1.D菜单中选择EXECUTE菜单项,应用程序就开始开始运行了,虽然我们没有编写一行代码,但是可以看出由系统自动生成的应用程序的界面已经有了一个标准WINDOWS应用程序所需的几个组成部分,我们要做的事情是往这个应用程序添加必要的代码以完成我们所需

27、要的功能。接下来将要对WINDOWS自动生成的这个应用程序框架作详细的介绍,让你对MFC方式的WINDOWS应用程序的工作原理有全面的认识,只有这样你才会知道应该如何往程序框架当中添加需要的代码。图2.13程序结构剖析为了让您对MFC方式的程序的框架有一个总体的认识,这里设计了一个表示程序中的主要类之间的关系的图表:这个图表表示了使用MFC方式的应用程序的四个主要类之间的关系,从中可以看出,CMYAPP类主要的作用是用来处理消息的,它统一管理程序收到的所有的消息,然后把消息分配到相应的对象。CMAINFRAME是CMYVIEW的父类,也就是说视窗VIEW显示在主框窗MAINFRAME的客户区中

28、。类CMYVIEW的作用是显示数据,而数据的来源是类CMYDOC,在MFC程序中,程序的数据是放在文档当中的,而显示数据则是利用视窗方式,文档与视窗分离带来的好处就是一个文档可以同时具有多个视窗,每个视窗只显示文档中的一部分数据,或者以特定的风格显示文档中的数据。文档与视窗分离的另一个好处就是在程序中可以处理多个文档,通过对不同的视窗的处理达到对不同的文档分别处理的目的。使用过传统的WINDOWS编程方法的人都知道,在应用程序中有一个重要的函数WI三IN(),这个函数是应用程序的基础,用户的操作所产生的消息正是经过这个函数的处理派送到对应的对象中进行处理。在MFC方式的WINDOWS应用程序中

29、,用来处理消息的是系统自动生成的MFC中的类CWINAPP的派生类CMYAPP,下面就从这个类开始介绍应用程序的框架。3.1类CMYAPP类CMYAPP是应用程序运行的基础,注意这一行代码,可以看出这个类是由MFC中的类CWlNAPP派生来的。在这个类中除了有一般类都有的构造函数,一个重要的成员函数就是INmNSTANCE,我们知道,在以NDOWS环境下面可以运行同一程序的多个实例,函数Initinstance的作用就是在生成的一个新的实例的时候,完成一些初始化的工作。注意这一行代码,它的作用就是生成一个CMYAPP类型的对象,生成的时候系统会主动调用INITlNSTANCE函数完成一些必要的

30、初始化工作。下面研究INmNSTANCE函数所做的事情,注意这一行代码,它定义了一个文档模板对象指针PDOCTEMP1.ATE,通过NEw操作符,系统动态生成了这个文档模板对象,然后使用adddoctemplate函数把这个文档模板对象加入到应用程序所维护的文档模板链表当中,这个文档模板PDoCTEMP1.ATE的作用就是把程序用到的框架窗口,Cmainframe,文档CMYDoc,视窗CMYVlEW与应用对象CMYAPP联系起来。CMYAPP类提供了用户与WINDOWS应用程序之间进行交流的界面。在生成这个类的对象后,这个对象自动地把自身与WINDOWS系统建立联系,接收TyINDOWS传送

31、的消息,并交给程序中相应的对象去处理,这就免去了程序员许多的工作,使得开发C+的WINDOWS程序变得简单方便。3.2类CMAlNFRAME类cminfrme是由MFC中的cfrmewnd派生来的,所以它也是一个框架窗口。前面已经指出,CMAINFRAME是类CMYVIEW的父类,也就是说CMYVIEW类的对象显示在主框架窗口的客户区中。在类CMAINFRAME中,系统已经从类CFRAMEWND那里继承了处理窗口的一般事件的WlNDOWS消息,比如改变窗口的大小,窗口最小化等等的成员函数,因此编程的时候程序员不需要再关心此类消息的处理,从而减轻了程序员的负担。当然,如果确实需要重新编写处理此类

32、消息的成员函数,则需要对原有的成员函数进行重载。在MFC程序中,我们并不需要经常对CMAlNFRAME类进行操作,更多的是对视窗类进行操作,达到对程序中的数据进行编辑和修改的目的。最后要指出的是,在MFC方式的程序中,当程序的一个实例被运行的时候,系统根据前面在CMYapp类中介绍的文档模板对象自动生成类Cmainframe,CMYVIEW,CMYDoC的对象,而不需要程序员主动地去创建这些类的对象。3.3类CMyVieW与CMyDoC之所以把CMyView类和CMyDoc类一起介绍是因为这两个类是密切相关的,下面的框图可以说明文档与视窗的关系。在这个框图当中,文档是由文档模板对象生成的,并由

33、应用程序对象管理,而用户则是通过与文档相联系的视窗对象来存储、管理应用程序的数据,用户与文档之间的交互则是通过与文档相关联的视窗对象来进行的。生成一个新的文档的时候,MFC程序同时生成一个框架窗口,并且在框架窗口的客户区中生成一个视窗对象作为框架窗口的子窗口,这个子窗口以可视化的方式表现文档中的内容。视窗的重要功能就是负责处理用户的鼠标、键盘等操作,通过对视窗对象的处理达到处理文档对象的目的。要指出的一点是,WINDOWS应用程序分单文档界面SDI和多文档界面MDI两种,在单文档界面中,文档窗口与主框架窗口是同一概念。而这时的视窗对象则是显示在文档窗口的客户区当中。我们先前生成的TEST程序使

34、用的就是单文档界面方式,此时文档窗口是主框架窗口,即类CMAINFRAME的对象。下面将以一个例子来说明这两个类之间的关系。前面已经提到,文档类是用来存放程序中的数据的,所以我们首先在文档类CMyDoc中加入一个成员变量用来存放数据。在左边的工作区用右键单击CMyDoc选项,在弹出的菜单中选中Addmembervariable菜单项。系统弹出ACIClMemberVariabIe对话框。VariableTyPe一栏用来输入成员变量的类型。这里设置为CString,即字符串类型,VariableDeClaratiOn一栏用来输入变量的名字,这里不妨输入为mystring,ACCeSS组合框用来设

35、置成员变量的访问权限,缺省为PUblic,设好后单击OK按钮关闭对话框。如下图2.3所示:这时,如果打开类CMyDOC的头文件、可以发现其中已经自动加入了我们定义的公有变量ITIyString。这个变量就可以作为我们的文档类的数据存储空间,因为mystring是公有成员,它就可以被文档对应的视窗所处理了。在VlEW菜单中选择CIaSSWiZarCi菜单项,系统打开MFCCIaSSWiZarCi对话框,接下来我们要为视窗类添加处理键盘事件的成员函数。在Classname一栏中选中类CMyView,然后在messages一栏中选中消息Wmchar,单击addfunction按钮,系统就自动往CMy

36、VieW类中添加了处理WmChar消息的成员函数的框架。单击editCOde按钮,接下来对Onehar这个成员函数进行编辑和修改。可以看出系统己经自动在这个成员函数中添加了CMyView的基类CView的WN1.eHAR消息的处理函数。注意这一行代码:BEGIN_MESSAGE_MAP(CMyViewzCView)/AFX_MSG_MAP(CMyView)ON_WM_CHAR()ON_WM_1.BUTTONDOWN()ON_WM_CANCE1.MODE()/AFX_MSG_MAP/StandardprintingcommandsON_COMMAND(ID_FI1.E_PRINTZCView:O

37、nFilePrint)ON_COMMAND(ID_FI1.E_PRINT_DIRECT,CView:ZOnFilePrint)ON_COMMAND(ID_FI1.E_PRINT_PREVIEWZCView:OnFilePrintPreview)END_MESSAGE_MAP()它被放在mfc的消息映射宏BEGlNJIESSAGEJfAP中,它的作用就是把windows系统发来的WN1.CHAR消息连接到CMyView类的成员函数OnChar上,即把这个成员函数作为处施B1.CHAR消息的过程。接下来我们就往这个成员函数中添加处理WMCHAR消息的具体代码。首先在OnChar函数中添加如下的代码

38、:voidCMyView:OnChar(UINTnCharzUINTnRepCntzUINTnFlags)(/TODO:Addyourmessagehandlercodehereand/orcalldefaultCMyDoc*pdoc;Pdoc=GetDocument();这段代码的作用是首先定义一个指向文档类对象的指针Pdoc,然后利用CMyVieW类的成员函数getdocument()获取指向当前视窗类所对应的文档类对象的指针,并把这个指针赋给定义的文档类型指针Pdoc,这样我们在后面就可以用“pdoc_mystring”的方式访问文档类中定义的公有数据成员mystringTo接着往函数O

39、nChar中添加如下的代码:pdoc_mystring=nChar;CClientDCmydc(this);mydc.TextOut(。,。,PdOjmystring,pdoc_mystring.Get1.ength();这段代码中的第一行代码的作用是根据从消息WMCHAR中传来的参数nchar,也就是键盘中输入的字符的ASCn码,把输入的李符添加到文档中的字符串对象mystring中。在介绍第二行代码前要先介绍设备描述表的概念。设备描述表也称为设备上下文,在WindOWS环境中,当需要对一个对象,如打印机,屏幕,窗口等进行输出时,就必须先获取这个对象的设备描述表,然后通过这个设备描述表来进行

40、输出。使用设备描述表带来的最大的好处就是输出格式的一致性,因为输出不再是直接针对具体的设备,而是通过统一格式的设备描述表间接地实现。第二行代码的作用就是定义并生成了一个当前视窗的客户区的设备描述表对象MYDC,其中的参数THlS是面向对象语言中的一个重要的关键字。指代成员函数所在类的对象的指针。在生成了视窗的客户区的设备描述表MYDC之后,我们可以利用它在视窗的客户区中输出数据了。这段代码的第三行就是调用设备描述表MYDC的方法TEXTOUT,在视窗的客户区中输出文档中的字符串MYSTRlNG了。我们在前面曾经指出,一个文档可以对应多个视窗。如果用户通过某个视窗更改了文档中的数据,就比如上面的

41、代码当中,我们通过视窗CMYWlVE更改了文档中的字符串对象MYSTRING,那么系统又如何维护同一文档的不同的视窗显示的数据的一致性呢?我们接着在OnChar函数中输入如下的代码:pdoc_UpdateAlIViews(this,01.,0);这行代码的作用就是通知本视窗所在的文档的所有其他的视窗,文档中的数据已经更新,这些视窗应该重新从文档中取回数据用来显示,这样就维持了同一文档的所有视窗的数据的一致性。这一行是视窗类中对文档的数据作了修改以后需要加的一条典型语句。接下来运行这个程序,在BUI1.D菜单中选择REBUI1.DA1.1.菜单项来编译连接应用程序,然后单击BUI1.D菜单的EX

42、ECUTE菜单项运行程序,从键盘上输入一些字符,可以发现这些字符显示在视窗也就是主窗口的客户区当中。而这些字符的实际位置是存放在文档对象的成员变量Mystring这个字符串中。改变一下窗口的大小,可以发现显示的数据都没有了,这是因为我们在窗口尺寸改变的时候没有把数据重新输出到窗口的客户区中。关闭应用程序,找到CMyView类的成员函数ONDRA肌在其中添加如下的代码:voidCMyView:OnDraw(CDC*pDC)CMyDoc*pDoc=GetDocument();ASSERT_VA1.工D(PDOC);/TODO:adddrawcodefornativedataherepDC_Text

43、Out(0,0rpDoc_mystring);当窗口的大小改变的时候,应用程序会调用ONDRAw这个函数,我们添加的这行代码的作用就是把字符串对象MYSTRING重新显示在窗口的客户区当中,这样在窗口大小改变的时候,数据依然显示在窗口客户区中。再次编译运行这个程序,可以发现窗口大小的改变不再影响数据的显示了。在前面的内容当中,我们已经介绍了使用MFC编制程序的基本结构。MFC的内容非常丰富,下面我们将针对软件的基本任务:接受用户输入、处理程序输出、进行文件处理以及数据库访问技术,向您介绍如何使用MFC编写程序,实现这些基本的功能。三深入MFC类库1处理用户输入程序从用户那里得到数据,经过自己的

44、处理,再把计算的结果输出到屏幕、打印机或者其他的输出设备上,这是软件工作的基本模型。消息和键盘消息是最基本的输入信息,除此之外,MFC封装了一系列的使用户可以进行可视化的输入的界面对象,比方说对话框以及可以布置在上面的编辑框、按钮、列表控件、树形控件等等。使程序支持用户输入的手段更加丰富。图3.11.1定义对话框资源下面我们通过一个例子来介绍如何设计一个基于对话框的界面,接受用户输入的数据,并且将它们以图形化的方式显示出来。我们将制作这样的一个有用的程序。它访问一个保存歌曲曲目的数据库,用户可以通过对话框让用户定义一个曲目表,并选定一张背景图,然后在一个没有系统菜单的窗口客户区上滚动显示曲目的

45、名字。在许多的娱乐场所的大屏幕上我们都可以看到类似的东西。在这部分的内容当中,我们着重介绍如何获得和处理用户输入数据的工作,在后面的处理用户输出的内容当中,我们还将使用这个例子来说明如何在屏幕上进行输出工作。下面我们来介绍如何定义一个对话框资源。在WORKSPACE窗口当中RESOURCE一页,在DIA1.oG小图标上面单击鼠标右键,弹出菜单,选择INSERT命令,如图3.2所示:接下来在弹出的资源类型对话框中选择DIA1.oG,表示添加一个对话框资源。单击NEW按钮。图3.3接下来我们就开始布置这个对话框。对话框上面已经有了两个按钮:OK和C三E1.o如下图3.4所示。它们的作用分别是确认用

46、户通过对话框进行的输入和取消前面的输入工作。把它们的标题分别改为确定和取消。布置其它的控件。每一个对话框以及对话框上面的每一个控件都有一个ID号码,它们的定义包括在RESOURCE.H这个头文件当中。比方说,这个对话框的H)号是IDD_DIA1.0G2,确认按钮的ID号是IDOK,取消按钮的ID号是IDCANCE1.,MFC将通过ID号来访问这些资源。单击DIA1.OG工具条上面的TEST按钮可以测试对话框运行的效果。需要注意的是我们这里我们定义的对话框只是一个资源,如果要使这个对话框真正实现它的功能,必须在程序当中定义一个使用这个资源的对话框类。图3.41. 2定义对话框类下面我们就定义一个

47、对话框类。在VlEW菜单当中选择C1.ASSWlZARD命令,单击ADDC1.ASS按钮,在弹出的菜单当中选择NEW命令,在NAME一栏当中输入新类的名字,在BASEC1.ASS列表框当中选择需要继承MFC当中的哪一个类。在DIA1.OGID列表框当中选择对话框资源的ID号码,在这个实例当中,我们不使用O1.EAUTOMATION,所以在这个组框当中选择NoNE。在FI1.ENAME一栏显示的是这个类的定义写在哪一个文件当中。单击图3.5中所示CHANGE按钮,在HEADERFI1.E和IMP1.EMENTATIONFI1.E当中分别敲入新类的声明和定义分别写在哪个文件当中,单击OK按钮确认,

48、这样我们就完成了对新的对话框类的定义。单击OK按钮,C1.ASSTyIZARD将按照我们刚才的要求进行对话框类定义的工作。打开WORKSPACE,选择FI1.EVlEW一页,在SOURCEFI1.ES和HEADERFI1.ES组当中到C1.ASSWlZARD已经新建了两个文件,并将它们加入了工程当中。SOngDIg.h当中内容是CSOngDIg这个类的声明,SOngDIg.cpp这个文件当中的内容是这个类的实现。但是目前的程序只是包含了实现一个对话框的最基本功能的代码,调用这个对话框类的DOMOdal函数之后可以运行它。但是用户通过对话框进行的所有的输入工作都不会被接受。下面,我们就着手完成实现对话框接受用户输入功能的工作。这里核心的工作就是实现对布置在对话

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号