通行编程实验Windows程序设计2_第1页
通行编程实验Windows程序设计2_第2页
通行编程实验Windows程序设计2_第3页
通行编程实验Windows程序设计2_第4页
通行编程实验Windows程序设计2_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、Windows程序设计实验目的1. 了解Windows程序的消息机制和编程模式2. 了解MFC类库结构3. 了解AppWizard自动生成的程序框架4. 了解Windows程序运行结构5. 学习简单的绘图操作6. 了解利用VC+的MFC类库设计面向对象应用程序的过程实验内容内容一 Windows编程模式 Windows程序不同于控制台模式程序。在编程时有以下特点:1. 多任务。 Windows 是一个多任务的操作系统,在同一时间内可以执行多个应用程序。应用程序无法独占所有系统资源(CPU、内存、屏幕、键盘、鼠标等)。Windows操作系统必须小心管理所有系统资源,以便所有应用程序可以分享,而所

2、有Windows应用程序则必须根据Windows操作系统特有的接口来执行操作,以确保Windows操作系统有效地管理系统资源。基于控制台模式的程序假定是在单用户操作系统下运行,运行的应用程序可以独占所有系统资源,不必考虑和其他应用的分享。 2. 通过窗口进行输入输出。Windows环境下,若想执行输入输出操作,必须在屏幕上开一个窗口,然后通过此窗口,执行输入与输出。应用程序也可以开多个窗口,执行多文档操作。而控制台模式下,只要执行简单的函数调用,就可以将信息输出到屏幕上。 3. 通过消息接受数据输入。Windows环境下,所有的用户输入都由系统统一管理,系统接收到用户输入后,进行分析,将该输入

3、以消息的形式发到合适的应用程序的消息队列中,每个应用程序都有一个消息队列。应用程序的运行过程就是不断从消息队列中取消息并进行处理的过程。 4. 数据输出以绘图模式进行。Windows环境下,绘图模式是基本的工作模式,用户所有的输出都需要通过图形设备接口进行。 Windows应用程序的结构 阅读以下内容,然后完成后面实验步骤中的内容WinMain()Windows应用程序都有一个主程序WinMain(),该程序是Windows应用程序的主过程。在MFC应用框架下产生的应用程序不用显式写这个函数,系统自动提供。开发人员只需在自己的应用程序对象(该对象是从类CwinApp派生的应用程序类的实例)中重

4、载有关应用程序初始化、应用程序退出的函数来使程序按照自己的意愿执行。WinMain()的执行过程是:调用应用程序对象的InitInstance 成员函数来初始化应用程序,然后调用它的Run()成员函数来处理应用程序的消息循环。当程序运行结束时,Run()调用应用程序的ExitInstance成员函数来做一些清除工作。下面是这一过程的示意图:注:上图中粗体字表示由系统提供的函数,正常体字表示由程序员提供或重载的函数CWinApp所有使用MFC类库的应用程序都有且只有一个“应用程序对象”,该对象负责应用程序初始化和退出时的清理工作,并且进行应用级的消息处理。应用程序对象所属的类从CWinApp类派

5、生而来。应用程序对象提供初始化应用程序和运行应用程序的成员函数。该对象是整个应用程序创建的第一个对象,在系统调用WinMain()之前就已经生成,因此必须将该对象声明为全局变量。从CWinApp派生的应用程序类必须重载InitInstance成员函数以便建立应用程序的主窗口对象。此外,在应用程序对象中还可以重载以下函数。· Run() 循环进行消息处理。它负责检查消息队列,如果有消息,则分发它进行处理,如果没有消息,则调用OnIdle进行空闲时间处理。Run还调用 ExitInstance来退出应用程序。 · ExitInstance() 负责程序退出时的清理工作。它只能由

6、Run函数来调用。 · OnIdle() 当应用程序的消息队列为空时,会执行一个缺省的消息循环,在该循环中调用OnIdle()函数。应用程序可以通过重载该函数来完成一些后台工作。 消息用VC写出的应用程序是消息驱动的。诸如鼠标单击、敲键盘、窗口移动之类的事件,由Windows以消息形式分发给正确的窗口进行处理。许多消息是用户与应用程序的交互产生的,当鼠标单击一个菜单项或工具条上的某一按钮时,就会产生命令消息,用户移动一个窗口或是放大、缩小一个窗口时,也会产生消息。程序的启动或停止、窗口失去焦点等都会产生消息。应用程序的run函数就负责检查并分发消息给合适的窗口处理。能够接受消息的类一

7、般会在定义时声明一个“消息映象(MESSAGE_MAPPING)”,该映象说明了该类对象可以接受并处理的消息,并且建立了消息和处理消息的成员函数之间的对应关系。VC+中可以接受消息的类都会定义一个消息映象,消息映象的定义自成一体,形式为:BEGIN_MESSAGE_MAP(类名,父类名)ON_COMMAND(消息名,处理消息的成员函数名)END_MESSAGE_MAP() 实验步骤1. 单击菜单File|New,选择projects标签下的MFC AppWizard(.exe),在项目名字编辑框中输入helloMFC,然后单击OK 2. 在下一个对话框中,选择Single Document创建

8、一个单文档应用。然后按Finish略国后面几个对话框。在最后一个对话框中按OK。此时新的项目产生 3. 在工作区窗口中,选择FileView标签,然后单击窗口中的Header Files前面的+号,在展开的文件名中选文件HelloMFC.h,双击它,在右边显示文件内容。 在该头文件中定义了你的应用程序类CHelloMFCApp,它从类CWinApp派生而来。可以看到,该类中重载了函数InitInstance。4. 在工作区窗口中,选择FileView标CHelloMFCApp签,然后单击窗口中的Source Files前面的+号,在展开的文件名中选文件HelloMFC.cpp,双击它,在右边显

9、示文件内容。在文件中找到下面两行: / The one and only CHelloMFCApp objectCHelloMFCApp theApp;(theApp是你的应用程序类的唯一一个实例,它负责你应用程序的初始化(看到该类重载的函数initInstance的实现吗?)。在你的程序找不到类似于控制台应用程序的main()函数的WinMain()函数,因为系统已经帮你实现好了。)5. 如果你想了解系统是如何执行你的程序的,可以选择菜单Build|Start Debug | Step into或者直接按F11来启动调试程序,跟踪系统的执行路径,你会发现,系统首先执行的是一个WinMain(

10、)(也许叫AfxWinMain())函数。 6. 查看你的HelloMFC应用程序,分别打开HelloMFC.CPP, HelloMFCDoc.CPP, HelloMFCView.CPP, MainFrm.CPP,查看每个文件中的消息映象。看看每个类都能接受并处理那些消息。 内容二 MFC类库(选做)阅读以下内容,然后完成后面实验步骤中的内容MFC类库中的所有类一起构成了一个应用程序框架,这个框架提供了一般Windows程序所具有的成分,程序员的任务就是在该框架下填充与应用程序的具体逻辑相关的内容。MFC类库中包含的类大致可以分为以下几类:1. 应用体系结构类。这些类提供应用程序框架,它们提供

11、大多数应用程序所具有的功能,程序员在这些框架下填充具体的应用逻辑。程序员一般是从这些框架类派生出自己的类,然后在派生类中增加新的成员或重载原来的成员函数来实现自己程序的功能。使用AppWizard可以自动生成应用程序框架,构成这个框架的类就是从应用体系结构类中的各个类派生出来的。应用体系结构类中包含: 1)应用、线程支持类;2)文档、视图、框架窗口类;3)命令路由类。 2. 文件、数据库类。通过这些类,应用程序可以将信息存放到数据库或文件中。有两大类数据库类:DAO和ODBC,它们的功能类似。有一些类负责处理标准的文件操作、ActiveX流以及HTML流。 3. 绘图、打印类。Windows中

12、,所有的图形输出都是送到一个称为DC(Device Context)的虚拟的绘图区域,MFC提供了各种类来封装各种类型的DC以及Windows的绘图工具如位图、刷子、调色板、画笔等。 4. 窗口、对话框、控制类。CWnd类是这一分类中的所有类的基类。它们定义了各种类型的窗口。包括框架窗口、视图、对话框、对话框中的各种控制等。 5. 简单数据类型类。这些类封装了各种常用的简单的数据类型,如绘图坐标(CPoint, CSize,CRect)、字符串(CString)、时间与日期信息(CTime, COleDateTime, CTimeSpan, and COleTimeSpan)等。这些对象通常用

13、做Windows类的成员函数的参数。它们都提供了许多有用的成员函数。 6. 数组、表和映象类。这些类用于处理有聚集数据的情形,包括数组、列表和映象(maps)。映象是一种非常有用的类,它可以容纳不同类型的对象的聚集。这些集合类都支持动态分配空间,而且可以用在非Windows程序中。类的使用方式也很灵活,你可以直接使用这些类,可以从它们派生出自己的类,也可以从模板类中构造自己的聚集类。 7. 互联网和网络类。这些类提供了利用ISAPI或者Windows Socket与其他计算机交互的功能。利用这些类,可以编制Internet服务程序、网络通讯程序。 8. OLE类。OLE类可以和其他的应用程序框

14、架类一起工作,提供对ActiveX API的方便的访问方式。 9. 调试及异常类。这些类支持对动态内存分配的调试以及异常信息的产生、捕获与传递。MFC中几个重要的类1. CObject CObject是MFC类库的主要基类。它不仅可以作为库中的类的基类,还作为你所写的类的基类。用CObject作为基类可以提供以下好处: o 串形化(serialization)支持。"Serialization"是将对象存入永久存储媒体(如磁盘)或从永久存储媒体读取对象信息的过程。MFC的CObject对象内置对Serialization的支持,因此所有从该类派生的类的对象也继承了这一特征。

15、serialization的基本思想是:对象应该能将它的当前状态信息保存起来,在将来的某一时刻能够重新恢复其状态;对象自己应该负责其状态的存取。因此,支持Serialization的对象应该实现一个成员函数完成这一功能。MFC使用类CArchive的对象来担任存储媒体和要存储的对象的中介。这个对象一般会和一个文件类CFile的对象相连。CArchive对象使用重载的抽取(>>)和插入(<<) 操作符来完成读写操作。 o 运行时类(Run-time class)信息支持。从CObject派生的所有类都与一个 CRuntimeClass结构相关联,这个类可以在运行时提供你对

16、象的有关信息,如对象所属的类的名字、对象是否是从某个类派生而来等,还支持对象的动态创建。这在某些程序中非常有用。 o 对象诊断输出。从CObject派生的类可以重载Dump()成员函数,将对象的成员以文本的形式写入一个dump设备,这些信息可以用作调试时的诊断信息。 o 与集合(collection)类的兼容。集合类中存放的对象要求以CObject为基类。这样可以提供多态性。所有从CObject派生出来的类的实例都可以作为对象存放到CObList的实例中。 2. CWnd CWnd是CObject的派生类,也是所有Windows类的基类,它提供MFC中所有窗口类的基本功能。它可以接受并处理与窗

17、口操作有关的消息(OnMessage成员函数),你可以在你的CWnd派生类中重载其成员函数OnMessage来控制其对消息的响应。在你的应用程序中可以创建若干子窗口。在MFC类库中,有很多类从CWnd派生出来以提供不同的功能。其中很多类如CFrameWnd, CMDIFrameWn d, CMDIChildWnd, CView, CDialog又都是设计成由用户进一步派生而用。另外一些控制类,如CButton,则既可以直接使用,也可以进一步派生。 实验步骤1. 启动Developer Studio。 2. 启动MSDN,选择“Visual C+ Document”为活动子集,选择“目录”标签,

18、单击”MSDN Library Visual Studio 6.0”左边的加号。 3. 在上面打开的目录中查找关于MFC Class Library Reference的内容 4. 双击上面所展开的目录下的Hierachy Chart,右边的文档显示窗口显示Visual C+MFC类库中的所有类的层次结构。你会看到,除很少一部分类外,大多数MFC类都是从类CObject派生而来。 5. 单击你想了解的类名,阅读有关该类的一些说明信息。当你看完,想返回到前面一页时,按”Standard”工具条上的后退符号(ß )返回。 内容三 文档、视图与框架窗口阅读以下内容,了解WindowsMFC

19、应用程序框架结构。然后再次查看你生成的HelloMFC应用程序,进一步理解应用程序的各个组成部分。MFC程序框架的核心概念是由文档、视图和框架窗口组成的文档模板。1. 文档是一个用户可以与之交互(如编辑、阅读)的数据对象,它通过使用文件菜单中的New或者Open命令创建,通常可以存放在一个文件中。2. 视图是一个窗口对象,文档的内容显示在这个窗口中,用户也只有通过这个窗口对象才能与一个文档交互。视图对象可以控制用户如何看到文档中的数据以及如何与之交互。一个文档可以有多个视图。3. 框架窗口提供了视图生存的场所。视图显示在框架窗口内部,框架窗口提供了工具条(以便接受用户命令)和状态条(以便显示文

20、档状态)。4. 文档模板是用来组织文档、视图和框架窗口之间关系的一个类。它可以控制在一个文档打开时,创建相应的框架窗口和视图来显示文档。MFC中提供文档、视图、框架窗口和文档模板的基类,应用程序可以从这些基类派生出自己的类来实现自己的应用逻辑。文档类可以从类CDocument派生,视图类可以从类CView, CScrollView, CEditVie等类派生,框架窗口类可以从类CFrameWnd(在SDI应用中)或者类CMDIFrameWnd(在MDI应用中)派生;文档模板类可以从类CDocTemplate派生而来,一种文档模板类控制一类文档的创建和显示。支持多种文档类型的应用需要定义多个文档

21、模板。SDI应用程序使用模板类CSingleDocTemplate而MDI应用使用模板类CMultiDocTemplate。所有这些类对象都是从应用程序对象直接或间接地生成出来。在程序运行开始,只有一个应用程序对象。应用程序对象可以创建文档模板。文档模板然后可以控制文档的创建、打开和关闭,在文档打开时,相应的框架窗口和视图也由文档模板自动创建,文档关闭时,相应的框架窗口和视图也会自动关闭。实验步骤1. 在你的HelloMFC应用程序中,查看文件HelloMFC.cpp中的应用程序类CHelloMFCApp的成员函数InitInstance的实现,在其中找到创建文档模板的语句: CSingleD

22、ocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CHelloMFCDoc),RUNTIME_CLASS(CMainFrame), / main SDI frame windowRUNTIME_CLASS(CHelloMFCView);AddDocTemplate(pDocTemplate);可以看到,文档模板创建时使用了三个类(文档类、视图类和框架窗口类)作为其参数。2. 分别打开定义CHelloMFCDoc、CMainFrame和CHelloMFCView这三

23、个类的头文件,看看它们都是从哪个类继承而来。CHelloMFCView中定义了一个函数GetDocument(),这个函数可以返回视图所对应的文档的指针。3. 打开HelloMFC.cpp,在InitInstance函数的最后两行是显示主窗口的语句: m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();这个主窗口就是整个应用程序的框架窗口。它也是构成文档模板的三要素之一的框架窗口。在HelloMFC程序一启动时,就已经创建了一个文档,因此,该文档对应的框架窗口也自动打开。4. 了解了应用程序框架后,打开你应用程序所在

24、的目录,查看一下该目录下都有哪些文件。5. 打开helloMFCView.cpp文件,修改函数CHelloMFCView:OnDraw(),在视图窗口的客户区输出“Hello World!” void CHelloMFCView:OnDraw(CDC* pDC)CHelloMFCDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data herepDC->TextOut(50,50,"Hello,World!");AppWizard自动生成的文件l 项目文件hel

25、loMFC.DSW工作台文件helloMFC.OPT工作台选项文件,存放关于工作台的所有选项(如工作台布局)helloMFC.DSP项目文件。存放特定于项目的内容,包括项目中包含的文件、编译方式、连接选项等等。与.mak文件的作用相同l C+源文件和头文件:项目的主要源文件,该文件中创建类CHelloMFCApp的实例,并重载其成员函数InitInstance。对于可执行程序,CHelloMFC:InitInstance做以下事情:登记文档模板(作为文档和视图之间连接的机制)、创建主框架窗口、创建一个空文档(或如果在命令行指定了一个文档,则打开一个已有文档)。helloMFCDoc.cpp,h

26、elloMFCDoc.h实现了文档类CHelloMFCDoc,该类从类CDocument派生而来,可以完成文档的存取、修改等操作。文档内容的显示通过与文档相联系的类CHelloMFCView的对象完成。helloMFCView.cpp, helloMFCView.h实现了视图类CHelloMFCView,视图类用于显示和打印文档数据。CHelloMFCView可以从类CEditView, CFormView, CRecordView, CDaoRecordView, CTreeView, CListView, CRichEditView, CScrollView,或CView派生而来。这个项目

27、中的CHelloMFCView从类CView派生而来。该类中实现了一些框架性函数,包括绘制视图函数、调试诊断语句,如果选择打印支持,则还实现关于打印、打印设置、打印预览等命令处理。MainFrm.cpp,MainFrm.h实现了从类CMainFrame派生而来的类CFrameWnd (SDI应用程序) 或CMDIFrameWnd (MDI应用程序),该类负责处理工具条和状态条的创建。StdAfx.cpp,StdAfx.h预编译头文件,用于建立预编译头文件helloMFC.PCH和预编译类型文件STDAFX.OBJl 资源文件helloMFC.rc, resource.h项目的资源文件及其头文件

28、。资源文件中包含缺省的菜单定义和加速器、字符串表等。还有一个缺省的About对话框和一个icon。资源文件中还包含了标准的MFC资源AFXRES.RC。如果有工具条支持,则还有一个工具条位图文件 (RESTOOLBAR.BMP).helloMFC.ico项目的图标文件,在应用程序变为最小或在对话框中可以出现图标。helloMFC.ic2用于存放那些不是由Developer Studio编辑的资源。helloMFCDoc.ico 项目中文档的图标文件。RESToolbar.bmp工具条位图l 文本文件readme.txt描述项目下由系统的AppWizard或 ControlWizard.自动产生

29、的各个文件的含义。内容四 学习使用画笔和画刷 前面你已经了解了Windows 应用程序的基本结构,知道AppWizard为你生成的文件的作用。这个实验中,你将尝试在这个程序框架上加上自己的应用逻辑:在视图中画个矩形或是椭圆。在实验一中,你已经尝试在窗口中输出一行文字“Hello, World!”,当时是在CHelloMFCView的成员函数OnDraw()中加了一个语句:pDC->TextOut(50,50,"Hello, World");这里涉及到Windows程序如何输出信息。Windows程序使用“设备上下文(Device Context)”来向输出设备(显示器

30、、打印机等)输出文字、图形信息。设备上下文设备上下文,简称为DC,是由Windows程序保存的一个结构,该结构里存储着程序向设备显示输出时所需要的设备信息,包括图形对象以及它们相关的属性和输出的图形模式。DC是图形设备接口(GDI)的重要组成部分,在使用任何GDI输出函数之前,你必须建立一个设备上下文。使用设备上下文的最大好处是硬件无关性。因为所有的输出都通过DC进行,程序不需要关心DC对应的具体输出设备。与DC关联的图形对象有画笔、画刷、位图、字体、调色板等。在需要用输出某种图形对象以前,需要先将它与一个设备上下文关联起来,然后通过设备上下文来输出。在Visual C+中,总是通过MFC类来

31、访问设备上下文。这些类封装了DC数据结构,并提供一些有用的功能来简化应用程序。CDC是所有设备上下文类的基类,在上面实验中修改了函数CHelloMFCView:OnDraw(),该函数用于视图窗口在它的窗口区输出内容,其中就用到了CDC:void CHelloMFCView:OnDraw(CDC* pDC)CHelloMFCDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data herepDC->TextOut(50,50,"Hello,World!");在O

32、nDraw函数调用前,MFC框架结构就建立好了OnDraw函数所用的设备上下文,并且将它作为参数传递给OnDraw函数,OnDraw函数然后就可以利用这个pDC进行输出。大多数需要设备上下文的函数都需要用DC作为函数参数。画笔和画刷画笔和画刷是常用的两种GDI对象,画笔是WindowsGDI提供的用来绘制直线和图形的对象,它的作用就想我们通常使用的笔,可以用它绘制直线、正方形、矩形、圆等基本的图形。构造画笔时至少要指定三个属性:画笔的类型(画实线、虚线还是点划线等)、宽度和颜色。Windows中提供的画笔类是CPen,你可以构造这个类的对象来创建自己的画笔。画刷是Windows程序中用来填充一个空间、窗体或其他与区域有关的GDI对象。它主要用来对一个

温馨提示

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

评论

0/150

提交评论