C++通行编程实验--Windows程序设计(2).doc_第1页
C++通行编程实验--Windows程序设计(2).doc_第2页
C++通行编程实验--Windows程序设计(2).doc_第3页
C++通行编程实验--Windows程序设计(2).doc_第4页
C++通行编程实验--Windows程序设计(2).doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

Windows程序设计实验目的1. 了解Windows程序的消息机制和编程模式2. 了解MFC类库结构3. 了解AppWizard自动生成的程序框架4. 了解Windows程序运行结构5. 学习简单的绘图操作6. 了解利用VC+的MFC类库设计面向对象应用程序的过程实验内容内容一 Windows编程模式 Windows程序不同于控制台模式程序。在编程时有以下特点:1. 多任务。 Windows 是一个多任务的操作系统,在同一时间内可以执行多个应用程序。应用程序无法独占所有系统资源(CPU、内存、屏幕、键盘、鼠标等)。Windows操作系统必须小心管理所有系统资源,以便所有应用程序可以分享,而所有Windows应用程序则必须根据Windows操作系统特有的接口来执行操作,以确保Windows操作系统有效地管理系统资源。基于控制台模式的程序假定是在单用户操作系统下运行,运行的应用程序可以独占所有系统资源,不必考虑和其他应用的分享。 2. 通过窗口进行输入输出。Windows环境下,若想执行输入输出操作,必须在屏幕上开一个窗口,然后通过此窗口,执行输入与输出。应用程序也可以开多个窗口,执行多文档操作。而控制台模式下,只要执行简单的函数调用,就可以将信息输出到屏幕上。 3. 通过消息接受数据输入。Windows环境下,所有的用户输入都由系统统一管理,系统接收到用户输入后,进行分析,将该输入以消息的形式发到合适的应用程序的消息队列中,每个应用程序都有一个消息队列。应用程序的运行过程就是不断从消息队列中取消息并进行处理的过程。 4. 数据输出以绘图模式进行。Windows环境下,绘图模式是基本的工作模式,用户所有的输出都需要通过图形设备接口进行。 Windows应用程序的结构 阅读以下内容,然后完成后面实验步骤中的内容WinMain()Windows应用程序都有一个主程序WinMain(),该程序是Windows应用程序的主过程。在MFC应用框架下产生的应用程序不用显式写这个函数,系统自动提供。开发人员只需在自己的应用程序对象(该对象是从类CwinApp派生的应用程序类的实例)中重载有关应用程序初始化、应用程序退出的函数来使程序按照自己的意愿执行。WinMain()的执行过程是:调用应用程序对象的InitInstance 成员函数来初始化应用程序,然后调用它的Run()成员函数来处理应用程序的消息循环。当程序运行结束时,Run()调用应用程序的ExitInstance成员函数来做一些清除工作。下面是这一过程的示意图:注:上图中粗体字表示由系统提供的函数,正常体字表示由程序员提供或重载的函数CWinApp所有使用MFC类库的应用程序都有且只有一个“应用程序对象”,该对象负责应用程序初始化和退出时的清理工作,并且进行应用级的消息处理。应用程序对象所属的类从CWinApp类派生而来。应用程序对象提供初始化应用程序和运行应用程序的成员函数。该对象是整个应用程序创建的第一个对象,在系统调用WinMain()之前就已经生成,因此必须将该对象声明为全局变量。从CWinApp派生的应用程序类必须重载InitInstance成员函数以便建立应用程序的主窗口对象。此外,在应用程序对象中还可以重载以下函数。 Run() 循环进行消息处理。它负责检查消息队列,如果有消息,则分发它进行处理,如果没有消息,则调用OnIdle进行空闲时间处理。Run还调用 ExitInstance来退出应用程序。 ExitInstance() 负责程序退出时的清理工作。它只能由Run函数来调用。 OnIdle() 当应用程序的消息队列为空时,会执行一个缺省的消息循环,在该循环中调用OnIdle()函数。应用程序可以通过重载该函数来完成一些后台工作。 消息用VC写出的应用程序是消息驱动的。诸如鼠标单击、敲键盘、窗口移动之类的事件,由Windows以消息形式分发给正确的窗口进行处理。许多消息是用户与应用程序的交互产生的,当鼠标单击一个菜单项或工具条上的某一按钮时,就会产生命令消息,用户移动一个窗口或是放大、缩小一个窗口时,也会产生消息。程序的启动或停止、窗口失去焦点等都会产生消息。应用程序的run函数就负责检查并分发消息给合适的窗口处理。能够接受消息的类一般会在定义时声明一个“消息映象(MESSAGE_MAPPING)”,该映象说明了该类对象可以接受并处理的消息,并且建立了消息和处理消息的成员函数之间的对应关系。VC+中可以接受消息的类都会定义一个消息映象,消息映象的定义自成一体,形式为:BEGIN_MESSAGE_MAP(类名,父类名)ON_COMMAND(消息名,处理消息的成员函数名)END_MESSAGE_MAP() 实验步骤1. 单击菜单File|New,选择projects标签下的MFC AppWizard(.exe),在项目名字编辑框中输入helloMFC,然后单击OK 2. 在下一个对话框中,选择Single Document创建一个单文档应用。然后按Finish略国后面几个对话框。在最后一个对话框中按OK。此时新的项目产生 3. 在工作区窗口中,选择FileView标签,然后单击窗口中的Header Files前面的+号,在展开的文件名中选文件HelloMFC.h,双击它,在右边显示文件内容。 在该头文件中定义了你的应用程序类CHelloMFCApp,它从类CWinApp派生而来。可以看到,该类中重载了函数InitInstance。4. 在工作区窗口中,选择FileView标CHelloMFCApp签,然后单击窗口中的Source Files前面的+号,在展开的文件名中选文件HelloMFC.cpp,双击它,在右边显示文件内容。在文件中找到下面两行: / The one and only CHelloMFCApp objectCHelloMFCApp theApp;(theApp是你的应用程序类的唯一一个实例,它负责你应用程序的初始化(看到该类重载的函数initInstance的实现吗?)。在你的程序找不到类似于控制台应用程序的main()函数的WinMain()函数,因为系统已经帮你实现好了。)5. 如果你想了解系统是如何执行你的程序的,可以选择菜单Build|Start Debug | Step into或者直接按F11来启动调试程序,跟踪系统的执行路径,你会发现,系统首先执行的是一个WinMain()(也许叫AfxWinMain())函数。 6. 查看你的HelloMFC应用程序,分别打开HelloMFC.CPP, HelloMFCDoc.CPP, HelloMFCView.CPP, MainFrm.CPP,查看每个文件中的消息映象。看看每个类都能接受并处理那些消息。 内容二 MFC类库(选做)阅读以下内容,然后完成后面实验步骤中的内容MFC类库中的所有类一起构成了一个应用程序框架,这个框架提供了一般Windows程序所具有的成分,程序员的任务就是在该框架下填充与应用程序的具体逻辑相关的内容。MFC类库中包含的类大致可以分为以下几类:1. 应用体系结构类。这些类提供应用程序框架,它们提供大多数应用程序所具有的功能,程序员在这些框架下填充具体的应用逻辑。程序员一般是从这些框架类派生出自己的类,然后在派生类中增加新的成员或重载原来的成员函数来实现自己程序的功能。使用AppWizard可以自动生成应用程序框架,构成这个框架的类就是从应用体系结构类中的各个类派生出来的。应用体系结构类中包含: 1)应用、线程支持类;2)文档、视图、框架窗口类;3)命令路由类。 2. 文件、数据库类。通过这些类,应用程序可以将信息存放到数据库或文件中。有两大类数据库类:DAO和ODBC,它们的功能类似。有一些类负责处理标准的文件操作、ActiveX流以及HTML流。 3. 绘图、打印类。Windows中,所有的图形输出都是送到一个称为DC(Device Context)的虚拟的绘图区域,MFC提供了各种类来封装各种类型的DC以及Windows的绘图工具如位图、刷子、调色板、画笔等。 4. 窗口、对话框、控制类。CWnd类是这一分类中的所有类的基类。它们定义了各种类型的窗口。包括框架窗口、视图、对话框、对话框中的各种控制等。 5. 简单数据类型类。这些类封装了各种常用的简单的数据类型,如绘图坐标(CPoint, CSize,CRect)、字符串(CString)、时间与日期信息(CTime, COleDateTime, CTimeSpan, and COleTimeSpan)等。这些对象通常用做Windows类的成员函数的参数。它们都提供了许多有用的成员函数。 6. 数组、表和映象类。这些类用于处理有聚集数据的情形,包括数组、列表和映象(maps)。映象是一种非常有用的类,它可以容纳不同类型的对象的聚集。这些集合类都支持动态分配空间,而且可以用在非Windows程序中。类的使用方式也很灵活,你可以直接使用这些类,可以从它们派生出自己的类,也可以从模板类中构造自己的聚集类。 7. 互联网和网络类。这些类提供了利用ISAPI或者Windows Socket与其他计算机交互的功能。利用这些类,可以编制Internet服务程序、网络通讯程序。 8. OLE类。OLE类可以和其他的应用程序框架类一起工作,提供对ActiveX API的方便的访问方式。 9. 调试及异常类。这些类支持对动态内存分配的调试以及异常信息的产生、捕获与传递。MFC中几个重要的类1. CObject CObject是MFC类库的主要基类。它不仅可以作为库中的类的基类,还作为你所写的类的基类。用CObject作为基类可以提供以下好处: o 串形化(serialization)支持。Serialization是将对象存入永久存储媒体(如磁盘)或从永久存储媒体读取对象信息的过程。MFC的CObject对象内置对Serialization的支持,因此所有从该类派生的类的对象也继承了这一特征。serialization的基本思想是:对象应该能将它的当前状态信息保存起来,在将来的某一时刻能够重新恢复其状态;对象自己应该负责其状态的存取。因此,支持Serialization的对象应该实现一个成员函数完成这一功能。MFC使用类CArchive的对象来担任存储媒体和要存储的对象的中介。这个对象一般会和一个文件类CFile的对象相连。CArchive对象使用重载的抽取()和插入(ShowWindow(SW_SHOW);m_pMainWnd-UpdateWindow();这个主窗口就是整个应用程序的框架窗口。它也是构成文档模板的三要素之一的框架窗口。在HelloMFC程序一启动时,就已经创建了一个文档,因此,该文档对应的框架窗口也自动打开。4. 了解了应用程序框架后,打开你应用程序所在的目录,查看一下该目录下都有哪些文件。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 项目文件helloMFC.DSW工作台文件helloMFC.OPT工作台选项文件,存放关于工作台的所有选项(如工作台布局)helloMFC.DSP项目文件。存放特定于项目的内容,包括项目中包含的文件、编译方式、连接选项等等。与.mak文件的作用相同l C+源文件和头文件:helloMFC.cpp.helloMFC.h项目的主要源文件,该文件中创建类CHelloMFCApp的实例,并重载其成员函数InitInstance。对于可执行程序,CHelloMFC:InitInstance做以下事情:登记文档模板(作为文档和视图之间连接的机制)、创建主框架窗口、创建一个空文档(或如果在命令行指定了一个文档,则打开一个已有文档)。helloMFCDoc.cpp,helloMFCDoc.h实现了文档类CHelloMFCDoc,该类从类CDocument派生而来,可以完成文档的存取、修改等操作。文档内容的显示通过与文档相联系的类CHelloMFCView的对象完成。helloMFCView.cpp, helloMFCView.h实现了视图类CHelloMFCView,视图类用于显示和打印文档数据。CHelloMFCView可以从类CEditView, CFormView, CRecordView, CDaoRecordView, CTreeView, CListView, CRichEditView, CScrollView,或CView派生而来。这个项目中的CHelloMFCView从类CView派生而来。该类中实现了一些框架性函数,包括绘制视图函数、调试诊断语句,如果选择打印支持,则还实现关于打印、打印设置、打印预览等命令处理。MainFrm.cpp,MainFrm.h实现了从类CMainFrame派生而来的类CFrameWnd (SDI应用程序) 或CMDIFrameWnd (MDI应用程序),该类负责处理工具条和状态条的创建。StdAfx.cpp,StdAfx.h预编译头文件,用于建立预编译头文件helloMFC.PCH和预编译类型文件STDAFX.OBJl 资源文件helloMFC.rc, resource.h项目的资源文件及其头文件。资源文件中包含缺省的菜单定义和加速器、字符串表等。还有一个缺省的About对话框和一个icon。资源文件中还包含了标准的MFC资源AFXRES.RC。如果有工具条支持,则还有一个工具条位图文件 (RESTOOLBAR.BMP).helloMFC.ico项目的图标文件,在应用程序变为最小或在对话框中可以出现图标。helloMFC.ic2用于存放那些不是由Developer Studio编辑的资源。helloMFCDoc.ico 项目中文档的图标文件。RESToolbar.bmp工具条位图l 文本文件readme.txt描述项目下由系统的AppWizard或 ControlWizard.自动产生的各个文件的含义。内容四 学习使用画笔和画刷 前面你已经了解了Windows 应用程序的基本结构,知道AppWizard为你生成的文件的作用。这个实验中,你将尝试在这个程序框架上加上自己的应用逻辑:在视图中画个矩形或是椭圆。在实验一中,你已经尝试在窗口中输出一行文字“Hello, World!”,当时是在CHelloMFCView的成员函数OnDraw()中加了一个语句:pDC-TextOut(50,50,Hello, World);这里涉及到Windows程序如何输出信息。Windows程序使用“设备上下文(Device Context)”来向输出设备(显示器、打印机等)输出文字、图形信息。设备上下文设备上下文,简称为DC,是由Windows程序保存的一个结构,该结构里存储着程序向设备显示输出时所需要的设备信息,包括图形对象以及它们相关的属性和输出的图形模式。DC是图形设备接口(GDI)的重要组成部分,在使用任何GDI输出函数之前,你必须建立一个设备上下文。使用设备上下文的最大好处是硬件无关性。因为所有的输出都通过DC进行,程序不需要关心DC对应的具体输出设备。与DC关联的图形对象有画笔、画刷、位图、字体、调色板等。在需要用输出某种图形对象以前,需要先将它与一个设备上下文关联起来,然后通过设备上下文来输出。在Visual C+中,总是通过MFC类来访问设备上下文。这些类封装了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!);在OnDraw函数调用前,MFC框架结构就建立好了OnDraw函数所用的设备上下文,并且将它作为参数传递给OnDraw函数,OnDraw函数然后就可以利用这个pDC进行输出。大多数需要设备上下文的函数都需要用DC作为函数参数。画笔和画刷画笔和画刷是常用的两种GDI对象,画笔是WindowsGDI提供的用来绘制直线和图形的对象,它的作用就想我们通常使用的笔,可以用它绘制直线、正方形、矩形、圆等基本的图形。构造画笔时至少要指定三个属性:画笔的类型(画实线、虚线还是点划线等)、宽度和颜色。Windows中提供的画笔类是CPen,你可以构造这个类的对象来创建自己的画笔。画刷是Windows程序中用来填充一个空间、窗体或其他与区域有关的GDI对象。它主要用来对一个区域着色。画刷具有颜色、图案、填充类型等各种属性。在构造画刷对象时,你至少需要指明画刷的颜色。Windows中提供的画刷类是CBrush,你可以构造这个类的对象来创建自己的画刷。实验步骤1. 在CHelloMFCView:OnDraw()函数中使用画笔和画刷的例子,把这些代码加到你的程序中,2. 运行它,看看运行结果是什么样的?void CHelloMF

温馨提示

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

评论

0/150

提交评论