图形学实验指导书.doc_第1页
图形学实验指导书.doc_第2页
图形学实验指导书.doc_第3页
图形学实验指导书.doc_第4页
图形学实验指导书.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

目录上机实验说明1【实验环境】1【实验要求】1【实验项目及学时分配】1【实验报告和考核】1【实验大纲】见附录A2【Visual C+语言图形系统介绍】见附录B2实验(一)3【实验题目】 基本图元绘制3【实验目的】3【实验内容】3【实验报告要求】4实验(二)5【实验题目】 二维图元的几何变换5【实验目的】5【实验内容】5【实验报告要求】6实验(三)7【实验题目】 线段、多边形裁剪算法实现7【实验目的】7【实验内容】7实验(四)8【实验题目】 三维观察算法实现8【实验目的】8【实验内容】8实验(五)9【实验题目】 光照模型与纹理映射实现9【实验目的】9【实验内容】9【实验报告要求】9附录A10计算机图形学实验教学大纲10附录B12Visual C+语言图形系统介绍12上机实验说明【实验环境】操作系统:Microsoft Windows 2000或以上系统。软件平台:Visual C+6.0程序开发的软件平台及OpenGL图形库。【实验要求】1、每次实验前,熟悉实验目的、实验内容及相关的基本理论知识。2、无特殊要求,原则上实验为1人1组,必须独立完成。3、实验所用机器最好固定,以便更好地实现实验之间的延续性和相关性,并便于检查。4、按要求认真做好实验过程及结果记录。【实验项目及学时分配】本实验共计10学时,实验项目及学时分配如下:序号实验项目实验类型学时要求1基本图元绘制设计2必做2二维图元的几何变换验证2必做3线段、多边形裁剪算法实现验证2必做4三维观察算法实现设计2必做5光照模型与纹理映射实现验证2必做【实验报告和考核】1、实验报告必需采用统一的实验报告纸,撰写符合一定的规范,详见实验报告撰写格式及规范。2、本实验占该课程最终评定成绩的15。【实验大纲】见附录A【Visual C+语言图形系统介绍】见附录B实验(一)【实验题目】 基本图元绘制【实验目的】1、通过本实验,掌握在VC6.0环境下基于OpenGL程序开发的运行环境配置,了解基于OpenGL图形库的控制台图形程序开发框架,并对二维观察变换中相关函数的使用及参数有所了解。2、掌握OpenGL基本图元的绘制方法和属性控制方法,并编程实现综合使用多种图形函数绘制复杂图形。【实验内容】1. VC6.0环境下基于OpenGL程序开发的运行环境配置由于VC6.0应用程序开发系统只支持OpenGL核心库函数,而在程序开发中需使用大量核心库所不具有的函数,因此,在进行图形开发前需进行OpenGL程序开发的运行环境配置。在此需将有关的函数库文件拷贝到指定的文件目录下即可。过程如下:将OpenGL开发库子目录下INCLUDE所有文件拷贝到VC所在子目录的includegl目录下。将OpenGL开发库子目录下LIB所有文件拷贝到VC所在子目录的lib目录下。将OpenGL开发库子目录下DLL所有文件拷贝到windows所在子目录的system32目录下。2OpenGL控制台应用程序框架OpenGL控制台应用程序框架及各函数的作用、参数情况说明见教材2.2.1节 OpenGL控制台应用程序框架。3基本图元绘制该实验将综合利用第二章、第三章中有关基本图元及其属性控制的函数,自我设计能够将下属图形要素涵盖的图形,并编程实现。基本图元:应包括点、线段、各种多边形;属性控制:应包括颜色设置、不同大小的点(如1像素点、3像素点等)、不同类型的线段(实线、点划线等);绘制出屏幕坐标系的2个坐标轴,并利用多边形绘制函数绘制1个圆。【实验报告要求】1简述VC+环境下OpenGL图形系统开发的一般过程。2总结在程序设计和实现过程中遇到的主要问题及解决过程。3图形坐标与世界坐标系、屏幕视口坐标系之间的关系是什么?在放大、缩小观察图形时应调节那些函数的那些参数?实验(二)【实验题目】 二维图元的几何变换【实验目的】1、了解和掌握二维坐标系中物体坐标、观察坐标、屏幕坐标之间的关系,能够在合适的位置定义物体的几何形状,并通过定义合适的观察坐标系在视口中显示出物体。2、了解和掌握以坐标原点、坐标轴为中心的物体几何变换方式,包括平移、旋转和缩放对应的函数。3、了解和掌握矩阵操作函数的原理和过程,并实现绕任意点或任意轴为中心进行平移、旋转、缩放程序。【实验内容】1 了解和掌握二维坐标系中物体坐标、观察坐标、屏幕坐标之间的关系。要求:对上一次编写的程序中的几何物体改变其几何位置和大小,改变gluOrtho2D函数中的参数,改变glViewport中的参数,观察所要绘制的图形和视口的位置发生了什么变化,并思考原因。2 了解和掌握以坐标原点、坐标轴为中心的物体几何变换方式。要求:绘制一个二维图形,并使用以坐标原点、坐标轴为中心的物体几何变换(包括平移、旋转和缩放)函数,对其进行相应的几何变换,并以不同颜色加以区分。3了解和掌握矩阵操作函数的原理和过程。要求:采用矩阵操作方式实现与第二步中相同的几何变换过程。4实现绕任意点或任意轴为中心进行平移、旋转、缩放程序。要求:根据课堂上所讲的绕任意点或任意轴为中心进行几何变换的原理,编写相应的平移、旋转和缩放函数,并采用所实现的函数对所绘制的图形实现绕任意点或任意轴为中心的几何变换。【实验报告要求】1总结并简述绕任意点或任意轴为中心进行几何变换的原理。2总结在程序设计和实现过程中遇到的主要问题及解决过程。3用矩阵操作实现几何变换有何优点?实验(三)【实验题目】 线段、多边形裁剪算法实现【实验目的】1、深入了解和掌握Cohen_Sutherland线段裁剪算法的原理和程序实现过程。2、深入了解和掌握Sutherland-Hodgman多边形裁剪算法的原理和程序实现过程。【实验内容】1. 根据Cohen-Sutherland直线裁剪算法的原理,实现用矩形对某线段的裁剪过程。要求:根据Cohen-Sutherland直线裁剪算法的原理,编写实现该算法的各个子函数,并在屏幕上画出用于裁剪的矩形窗口,用不同的颜色和线型标注被裁剪的线段及裁剪后的结果。2. 根据Sutherland-Hodgman多边形裁剪算法的原理,实现用矩形对某线段的裁剪过程。要求:根据Sutherland-Hodgman多边形裁剪算法的原理,编写实现该算法的各个子函数,并在屏幕上画出用于裁剪的矩形窗口,用不同的颜色和线型标注被裁剪的多边形及裁剪后的结果。【实验报告要求】1总结在程序设计和实现过程中遇到的主要问题及解决过程。2在Cohen-Sutherland直线裁剪算法中若改变9个区域的编码方式会对裁剪结果产生什么影响?3在OpenGL中如何实现对二维图形的裁剪?实验(四)【实验题目】 三维观察算法实现【实验目的】1. 了解和掌握三维空间中几何物体的绘制方法。2. 了解和掌握三维观察变换的原理及OpenGL中实现三维观察变换函数的参数对三维观察的影响。【实验内容】1、了解和掌握三维空间中几何物体的绘制方法。要求:了解在三维空间坐标系中三维物体的定义方法,注意多边形内部和外部定义,并绘制一个包含内、外部的三维物体。2、实现三维观察变换。要求:利用gluPerspective等相关三维观察变换函数,实现对上面所绘制的三维物体进行三维裁剪和三维变换,并对函数中的参数进行改变,并观察屏幕显示结果,进一步了解三维观察变换的原理。【实验报告要求】1总结三维观察变换相关函数中参数的不同变化对三维观察结果的影响。2总结在程序设计和实现过程中遇到的主要问题及解决过程。3glMatrixMode函数对三维观察变换有何影响?实验(五)【实验题目】 光照模型与纹理映射实现【实验目的】1 熟悉三维空间中光照模型的原理,掌握OpenGL中光照模型的定义方法。2 了解三维物体纹理映射的基本原理,掌握OpenGL中纹理映射的基本方法。【实验内容】1、 OpenGL中光照模型的定义方法的实现。要求:绘制一个空间三维物体,并在三维空间中定义不同的光源,涉及不同的光源类型、光的颜色,并开启光源,观察通过改变定义光源的不同参数,说得到的绘制结果有何不同。2、 OpenGL中纹理映射的实现。要求:画出一个二维图形,并采用程序生成纹理或读入纹理图像的方法,对所绘制的二维图形进行纹理映射,通过改变不同的参数观察所得到的结果有何不同。【实验报告要求】1总结三维空间中定义光照模型的过程,及定义光照模型相关函数中参数的不同变化对观察结果的影响。2总结三维空间中纹理映射的过程,及纹理映射相关函数中参数的不同变化对观察结果的影响。2总结在程序设计和实现过程中遇到的主要问题及解决过程。附录A计算机图形学实验教学大纲一、制定实验教学大纲的依据根据本校2006级本科指导性培养计划和2005年6月制定的计算机图形学课程教学大纲制定。二、本实验课在专业人才培养中的地位和作用计算机图形学是电子信息工程专业(图文处理方向)必修的一门专业基础课。通过本课程的学习,可以使学生了解计算机图形学所研究的内容、广泛的应用,掌握计算机图形的基本生成算法、图形几何变换的原理及实现方法、二维和三维观察、图形表示、曲线、曲面的图形生成技术及真实感图形等。同时结合OpenGL图形库的使用,使学生掌握图形程序开发的基本技术和方法。三、本实验课程讲授的基本实验理论主要讲授利用OpenGL图形库函数进行二维、三维图形的绘制的基本方法,从而使学生能将计算机图形学的基本理论与OpenGL图形开发实践有机结合起来,加深对理论的理解和应用实践能力。主要涉及图形光栅化原理,及基于光栅化原理的所进行的基本图元的生成、填充、裁剪算法、二维图形变换、二维和三维观察变换、光照模型和纹理映射等。1OpenGL运行环境配置及基本图元绘制;2二维观察变换及二维图形几何变换;3线段裁剪、多边形裁剪算法;4三维观察变换;5真实感图形绘制中光照模型的设置和纹理映射过程。四、本实验课学生应达到的能力本实验开设的目的:一方面使学生通过实验对图形学基本理论和算法在实践中的应用有一个直观、深刻的认识,从而使学生掌握将理论应用于实践的方法,同时对理论的认识得到深化;另一方面,通过编程训练加强了学生对基于OpenGL图形库的基本图形算法、二维图形变换、二三维观察变换、真实感图形处理等实际编程动手能力的训练;为学生进一步了解和掌握包括图形用户界面、CAD、数字图像处理等的原理、技术、方法打下坚实的理论和实践基础。五、学时、教学文件及形式学时:本课程总学时为48学时,其中实验为10学时,占总学时的20%。教学文件:校编计算机图形学实验指导书;实验报告学生自拟。要求学生实验前预习实验指导书,并理解相关算法思想及软件实现过程,具体编程过程由学生独立完成。六、实验考核办法与成绩评定实验课成绩占本课程总成绩15%,对缺少实验成绩者,本课程不予通过(对实验成绩的考核包括上机编程结果占50%,实验报告占40%,考勤占10%)。七、仪器设备及注意事项仪器设备:有快速的较高性能微机和较大内存与硬盘的设备注意事项:注意保护设备八、实验项目的设置及学时分配序号实 验 项 目学时实验类型要求适用专业备注1基本图元绘制2设计必修电子信息工程专业(图文处理方向)上机2二维图元的几何变换2验证必修电子信息工程专业(图文处理方向)上机3线段、多边形裁剪算法实现2验证必修电子信息工程专业(图文处理方向)上机4三维观察算法实现2设计必修电子信息工程专业(图文处理方向)上机5光照模型与纹理映射实现2验证必修电子信息工程专业(图文处理方向)上机制 定 人:吴学毅审 核 人:张二虎批 准 人:周世生制定日期:2005.7附录BVisual C+语言图形系统介绍一VC环境设置及调试1VC环境设置VC的处理流程大致分为两步:编译和连接。源文件通过编译生成了.obj文件;所有.obj文件和.lib文件通过连接生成.exe文件或.dll文件。VC的处理流程如下: 图1 VC的处理流程1.1 编译参数的设置。主要通过VC的菜单项Project-Settings-C/C+页来完成。可以看到这一页的最下面Project Options中的内容,一般如下:1) General:一些总体设置。Warning level用来控制警告信息,其中None表示不显示警告信息,Level 1只显示很严重的警告信息,其他级别依次增加一些次严重的警告信息;Warnings as errors将警告信息当作错误处理;Optimizations是代码优化,可以在Category的Optimizations项中进行更细的设置。2) C+ Language:pointer_to_member representation用来设置类定义/引用的先后关系,一般为Best-Case Always表示在引用类之前该类肯定已经定义了;Enable Exception Handling,进行同步的异常处理;Enable Run-Time Type Information迫使编译器增加代码在运行时进行对象类型检查;Disable Construction Displacements,设置类构造/析构函数调用虚函数问题。3) Code Generation:Processor表示代码指令优化,可以为80386、80486、Pentium、Pentium Pro,或者Blend表示混合以上各种优化。Use run-time library用以指定程序运行时使用的运行时库(单线程或多线程,Debug版本或Release版本),有一个原则就是,一个进程不要同时使用几个版本的运行时库。4) Customize:Disable Language Extensions,表示不使用微软为标准C做的语言扩展;Eliminate Duplicate Strings,主要用于字符串优化(将字符串放到缓充池里以节省空间)。5) Listing Files:Generate browse info的功能上面已经提到过。这里可以进行更多的设置。Exclude Local Variables from Browse Info表示是否将局部变量的信息放到.SBR文件中。6) Optimizations:代码优化设置。可以选择Maximize Speed生成最快速的代码,或Minimize Size生成最小尺寸的程序,或者Customize定制优化。7) Precompiled Headers:预编译头文件的设置。使用预编译可以提高重复编译的速度。VC一般将一些公共的、不大变动的头文件(比如afxwin.h等)集中放到stdafx.h中,这一部分代码就不必每次都重新编译(除非是Rebuild All)。8) Preprocessor:预编译处理。可以定义/解除定义一些常量。Additional include directories,可以指定额外的包含目录,一般是相对于本项目的目录,如.Include。1.2 连接参数的设置。主要通过VC的菜单项Project-Settings-Link页来完成。1) General:一些总体设置。可以设置生成的文件路径、文件名;连接的库文件;Generate debug info,生成Debug信息到.PDB文件(具体格式可以在Category-Debug中设置);Ignore All Default Libraries,放弃所有默认的库连接;Link Incrementally,通过生成. ILK文件实现递增式连接以提高后续连接速度,但一般这种方式下生成的文件(EXE或DLL)较大;Generate Mapfile,生成.MAP文件记录模块相关信息;Enable Profiling,这个参数通常与Generate Mapfile参数同时使用,而且如果产生Debug信息的话,不能用.PDB文件,而且必须用Microsoft Format。2) Customize:这里可以进行使用程序数据库文件的设置。Force File Output ,强制产生输出文件(EXE或DLL);Print Progress Messages,可以将连接过程中的进度信息输出到Output窗口。3) Debug:设置是否生成调试信息,以及调试信息的格式。格式可以有Microsoft Format、COFF Format(Common Object File Format)和Both Formats三种选择;Separate Types,表示将Debug格式信息以独立的.PDB文件存放,还是直接放在各个源文件的.PDB文件中。选中的话,表示采用后者的方式,这种方式调试启动比较快。4) Input:这里可以指定要连接的库文件,放弃连接的库文件。还可以增加额外的库文件目录,一般是相对于本项目的目录,如.Lib。Force Symbol References,可以指定连接特定符号定义的库。5) Output:Base Address可以改变程序默认的基地址(EXE文件默认为0x400000,DLL默认为0x10000000),操作系统装载一个程序时总是试着先从这个基地址开始。Entry-Point Symbol可以指定程序的入口地址,一般为一个函数名(且必须采用_stdcall调用约定)。一般Win32的程序,EXE的入口为WinMain,DLL的入口为DllEntryPoint;最好让连接器自动设置程序的入口点。2调试2.1为了调试一个程序,首先必须使程序中包含调试信息。一般情况下,一个从AppWizard创建的工程中包含的DebugConfiguration自动包含调试信息,但是不是Debug版本并不是程序包含调试信息的决定因素,程序设计者可以在任意的Configuration中增加调试信息,包括Release版本。为了增加调试信息,可以按照下述步骤进行: 打开Projectsettings对话框(可以通过快捷键ALT+F7打开,也可以通过IDE菜单Project/Settings打开) 选择C/C+页,Category中选择general,则出现一个DebugInfo下拉列表框,可供选择的调试信息方式包括:命令行Projectsettings说明无None没有调试信息/ZdLineNumbersOnly目标文件或者可执行文件中只包含全局和导出符号以及代码行信息,不包含符号调试信息/Z7C7.0-Compatible目标文件或者可执行文件中包含行号和所有符号调试信息,包括变量名及类型,函数及原型等/ZiProgramDatabase创建一个程序库(PDB),包括类型信息和符号调试信息。/ZIProgramDatabaseforEditandContinue除了前面/Zi的功能外,这个选项允许对代码进行调试过程中的修改和继续执行。这个选项同时使#pragma设置的优化功能无效 选择Link页,选中复选框GenerateDebugInfo,这个选项将使连接器把调试信息写进可执行文件和DLL 如果C/C+页中设置了ProgramDatabase以上的选项,则Linkincrementally可以选择。选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译),而不必每次都从头开始编译。 2.2断点断点是调试器设置的一个代码位置。当程序运行到断点时,程序中断执行,回到调试器。断点是最常用的技巧。调试时,只有设置了断点并使程序回到调试器,才能对程序进行在线调试。设置断点:可以通过下述方法设置一个断点。首先把光标移动到需要设置断点的代码行上,然后 按F9快捷键 弹出Breakpoints对话框,方法是按快捷键CTRL+B或ALT+F9,或者通过菜单Edit/Breakpoints打开。打开后点击Breakat编辑框的右侧的箭头,选择合适的位置信息。一般情况下,直接选择linexxx就足够了,如果想设置不是当前位置的断点,可以选择Advanced,然后填写函数、行号和可执行文件信息。 去掉断点:把光标移动到给定断点所在的行,再次按F9就可以取消断点。同前面所述,打开Breakpoints对话框后,也可以按照界面提示去掉断点。条件断点:可以为断点设置一个条件,这样的断点称为条件断点。对于新加的断点,可以单击Conditions按钮,为断点设置一个表达式。当这个表达式发生改变时,程序就被中断。底下设置包括“观察数组或者结构的元素个数”,似乎可以设置一个指针所指向的内存区的大小。最后一个设置可以让程序先执行多少次然后才到达断点。数据断点:数据断点只能在Breakpoints对话框中设置。选择“Data”页,就显示了设置数据断点的对话框。在编辑框中输入一个表达式,当这个表达式的值发生变化时,数据断点就到达。一般情况下,这个表达式应该由运算符和全局变量构成,例如:在编辑框中输入g_bFlag这个全局变量的名字,那么当程序中有g_bFlag=!g_bFlag时,程序就将停在这个语句处。消息断点:VC也支持对Windows消息进行截获。有两种方式进行截获:窗口消息处理函数和特定消息中断。在Breakpoints对话框中选择Messages页,就可以设置消息断点。如果在上面那个对话框中写入消息处理函数的名字,那么每次消息被这个函数处理,断点就到达。如果在底下的下拉列表框选择一个消息,则每次这种消息到达,程序就中断。二、Visual C+语言图形系统介绍1图形设备接口(GDI)的基本概念图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,向打印机输出和屏幕输出。2三种图形输出类型 应用程序可以使用GDI创建三种类型的图形输出:矢量输出、光栅图形输出和文本输出。矢量图形输出:矢量图形输出指的是创建线条和填充图形,包括点、直线、曲线、多边形、扇形和矩形的绘制。光栅输出:光栅图形的输出是指光栅图形函数对以位图形式存储的数据进行操作,它包括各种位图和图标的输出。在屏幕上表现为对若干行和列的像素的操作,在打印机上则是若干行和列的点阵的输出。 文本输出:与DOS字符方式下的输出不同,Windows是按图形方式输出的。这样,在输出文本时,必须以逻辑坐标为单位计算文本的输出位置,而不是象DOS下以文本行为单位输出文本。这比DOS下的文本输出要难一些。但是,按图形方式输出文本也给文本输出带来很大的灵活性。用户可以通过调用各种GDI函数,制造出各种文本输出效果,包括加粗、斜体、设置颜色等。Windows还提供了一种TrueType(写真字体)。TrueType字体用一组直线和曲线命令及一些参数来描述字体的轮廓。Windows可以通过参数来调整直线的长度和曲线的形状,从而实现对字体的自由缩放。3. MFC中与GDI有关的类 MFC提供了两种重要的类:设备上下文类,用于设置绘图属性和绘制图形;绘图对象类,封装了各种GDI绘图对象,包括画笔、刷子、字体、位图、调色板和区域。3.1设备上下文类设备上下文类包括CDC和它的派生类CClientDC、CPaintDC、CWindowDC、CMetaFileDC。CDC是设备上下文类的基类,除了一般的窗口显示外,还用于基于桌面的全屏幕绘制和非屏幕显示的打印机输出。CDC类封装了所有图形输出函数,包括矢量、光栅和文本输出。CClientDC(客户区设备上下文)用于客户区的输出,它在构造函数中封装了GetDC(),在析构函数中封装了ReleaseDC()函数。一般在响应非窗口重画消息(如键盘输入时绘制文本、鼠标绘图)绘图时要用到它。用法是:CClientDC dc(this);/this一般指向本窗口或当前活动视图dc.TextOut(10,10,str,str.GetLength();/利用dc输出文本,如果是在CScrollView中使用,还要注意调 /用OnPrepareDC(&dc)调整设备上下文的坐标。CPaintDC用于响应窗口重绘消息(WM_PAINT)是的绘图输出。CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。CWindowDC用于窗口客户区和非客户区(包括窗口边框、标题栏、控制按钮等)的绘制。除非要自己绘制窗口边框和按钮(如一些CD播放程序等),否则一般不用它。CMetaFileDC专门用于图元文件的绘制。图元文件记录一组GDI命令,可以通过这一组GDI命令重建图形输出。使用CMetaFileDC时,所有的图形输出命令会自动记录到一个与CMetaFileDC相关的图元文件中。 3.2图形对象类图形对象类包括CGdiObject、画笔、刷子、字体、位图、调色板、区域等。CGdiObject是图形对象类的基类,但该类不能直接为应用程序所使用。要使用GDI对象,必须使用它的派生类:画笔、刷子、字体、位图、区域等等。使用图形对象要注意两点:1.同其他MFC对象一样,GDI对象的创建也要分为两步:第一步,是定义一个GDI绘图对象类的实例;第二步调用该对象的创建方法真正创建对象。2.创建对象:使用该对象,首先要调用CDC:SelectObject()将它选入到设备上下文中,同时保存原来的设置到一个GDI对象指针比如说pOldObject中。在使用完后,再用SelectObject(pOldObject)恢复原来的设置。但是,如果该设备上下文是用户自己创建的,则不必恢复原来设置,因为框架会在该设备上下文生存期结束时删除该设备上下文,同时也就删除了原来存放于该设备上下文中的绘图对象设置。3.3 图形对象的用法画笔(CPen):封装GDI画笔,可被选中设备上下文中当前所用得笔。画笔用于绘制对象的边框以及直线和曲线。缺省画笔画一条与一个像素等宽的黑色实线。要使用画笔,首先要定义一个画笔:CPen pen;然后创建画笔。创建画笔有两种方法:一是使用CPen:CreatePen(int nPenStyle,int nWidth,DWORD crColor)进行初始化。第一个参数是笔的风格。nPenStyle可选值有:PS_SOLID 实线;PS_DOT 虚线;PS_INSIDEFRAME 在一个封闭形状的框架内画线,若设定的颜色不能在调色板种找到且线宽大于1,Windows会使用一种混色;PS_NULL 空的画笔,什么也不画。第二个参数是线的宽度,按逻辑单位。若线宽设为0,则不管是什么映射模式下,线宽始终为一个像素。第三个参数是线的颜色,可以选16种VGA颜色中的一种。颜色的设置用一个RGB宏来指定。RGB宏形式如下COLORREF RGB(cRed,cGreen,cBlue)cRed、cGreen、cBlue分别代表颜色的RGB三个分量,它们的取值在0-255之间。可以使用RGB组合成各种色彩。但是,这种表示法并不是很直观,因此我们把常见的RGB组合定义成新的宏并放在一个colors.h中,如清单1。清单1 常见色彩定义/*COLORS.H -常见色彩定义 */#ifndef _COLORS_H#define _COLORS_H/Main Colors#define WHITE RGB(255,255,255)#define BLACK RGB(0,0,0)#define DK_GRAY RGB(128,128,128)#define LT_GRAY RGB(192,192,192)#endif刷子(CBrush):封装GDI刷子,可用作设备上下文中当前刷子。刷子用来填充一个封闭图形对象(如矩形、椭圆)的内部区域。缺省的刷子将封闭图形的内部填充成全白色。我们以前所创建的窗口内部都是白色就是窗口使用缺省刷子填充的结果。可以用以下几种方法创建刷子:(1)CreateSolidBrush(DWORD crColor)创建一个实心刷子,用一种颜色填充一个内部区域。(2)CreateHatchBrush(int nIndex,DWORD crColor);创建一个带阴影的刷子,nIndex代表一种影线模式:(3)用CreatePatternBrush(CBitmap* pBitmap)用一个位图作刷子,一般采用8X8的位图,因为刷子可以看作8X8的小位图。当Windows桌面背景采用图案(如weave)填充时,使用的就是这种位图刷子。(4)同样可以使用SelectStockObject()从库存刷子中选取一个:BLACK_BRUSH 黑色刷子;WHITE_BRUSH 白色刷子;DKGRAY_BRUSH 暗灰刷子;GRAY_BRUSH 灰色刷子;LTGRAY_BRUSH 淡灰色刷子;NULL_BRUSH 空刷子,内部不填充字体(CFont):封装了GDI字体对象,用户可以建立一种GDI字体,并使用CFont的成员函数来访问它。关于CFont类,我们在前面已经作了一些介绍,这里不再赘述,读者可以参见前一章内容。位图(CBitmap):封装一GDI位图,它提供成员函数装载和操作位图。调色板(CPalette):封装GDI调色板,它保存着系统可用的色彩信息,是应用程序和彩色输出设备上下文的接口。区域CRgn类:封装GDI区域。区域是窗口内的一块多边形或椭圆形的区域。CRgn用于设备环境(通常是窗口)内的区域操作。CRgn通常与CDC的有关剪裁(clipping)的成员函数配合使用。3.4 常见的绘图任务输出文本字体大小计算:通过调用GetTextMetrics()返回当前使用字体的尺寸描述,如前面文本编辑所演示的那样。字体颜色设置:设置前景色:CDC:SetTextColor(int nColor);设置背景色:CDC:SetBkColor(int nColor);例如:dc.SetTextColor(WHITE);dc.SetBkColor(DK_BLUE);dc.TextOut(10,10,“White Text on blue background”,30);除了我们前面介绍的文本输出函数TextOut()之外,还有其他几个函数可用于文本输出:TabbedTextOut:象TextOut一样显示正文,但用指定的制表间隔扩充制表键Tab。 在前面的文本编辑器中,当输入一个Tab时,TextOut在屏幕上输出一个黑色方块。ExtTextOut:在指定的矩形中显示正文。可以用该函数删去超出矩形的正文,用正 文背景填充矩形,调整字符间隔。DrawText:在指定矩形种显示正文,可以用这个函数扩展制表键Tab。在格式化矩 形时调整正文左对齐、右对齐或居中;还可以在一个词中断开以适应矩形边界。画点SetPixel在指定坐标处按指定色彩画一点。画线MoveToEx将直线起点移动到指定坐标处,LineTo从起点开始画直线到终点处。使用的线型由当前所用画笔指定。画弧Arc(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);封闭图形矩形Rectangle圆角矩形RoundRect()Ellipse在一个矩形内画椭圆Chord弦形图Pie画饼形图Polygon生成封闭的多边形PolyPolygon画完整的一组多边形其它常用的绘图函数FillRect:用指定颜色填充矩形且不画边线Draw3dRect:这是一个非常实用的函数,用于绘制各种3D边框。它的函数原型如下:void Draw3dRect( LPCRECT lpRect, COLORREF clrTopLeft, COLORREF clrBottomRight );void Draw3dRect( int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight );通过设置上下边框的颜色clrTopLeft和clrBottomRight,可以绘制出凸出或 凹陷等各种效果的3D边框。DrawFocusRect:用点线画一个矩形框,内部不填充,边线是用于屏幕上当前色的相反色画出来的,故第二次画时,会擦除原来所画的线。ExtFloodFill:用给定的颜色,利用当前刷子填充表面被一个边线包围的区域,用户可以有选择地填充一个由指定颜色组成的区域。FloodFill:用给定的颜色,利用当前所选的刷子填充显示的底面被一个边线所包围的区域,如多边形区域的填充。FrameRect:绘制矩形边框时内部不填充。InvertRect:在某一矩形区域内反显现有颜色。4对话框的创建 4.1无模式对话框的创建无模式对话框与有模式对话框不同的是在创建后其他窗口都可以继续接收用户输入,因此无模式对话框有些类似一个弹出窗口。创建无模式对话框需要调用 BOOL CDialog:Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );之后还需要调用 BOOL CDialog:ShowWindow( SW_SHOW);进行显示,否则无模式对话框将是不可见的。相关代码如下: void CYourView:OnOpenDlg(void) /*假设IDD_TEST_DLG为已经定义的对话框资源的ID号*/ CTestDlg *dlg=new CTestDlg; dlg-Create(IDD_TEST_DLG,NULL); dlg-ShowWindows(SW_SHOW); /*不要调用 delete dlg;*/ 在上面的代码中新生成了一个对话框对象,而且在退出函数时并没有销毁该对象。因为如果此时销毁该对象(对象被销毁时窗口同时被销毁),而此时对话框还在显示就会出现错误。那么这就提出了一个问题:什么时候销毁该对象。使用的方法有两个: 在对话框退出时销毁自己:在对话框中重载OnOK与OnCancel在函数中调用父类的同名函数,然后调用DestroyWindow()强制销毁窗口,在对话框中映射WM_DESTROY消息,在消息处理函数中调用delete this;强行删除自身对象。相关代码如下: void CTestDlg1:OnOK() CDialog:OnOK(); DestroyWindow(); void CTestDlg1:OnCancel() CDialog:OnCancel(); DestroyWindow(); void CTestDlg1:OnDestroy() CDialog:OnDestroy(); AfxMessageBox(call delete this); delete this; 这种方法的要点是在窗口被销毁的时候,删除自身对象。所以你可以在任何时候调用DestroyWindow()以达到彻底销毁自身对象的作用。(DestroyWindow()的调用会引起OnDestroy()的调用) 通过向父亲窗口发送消息,要求其他窗口对其进行销毁:首先需要定义一个消息用于进行通知,然后在对话框中映射WM_DESTROY消息,在消息处理函数中调用消息发送函数通知其他窗口。在接收消息的窗口中利用ON_MESSAGE映射处理消息的函数,并在消息处理函数中删除对话框对象。相关代码如下: /*更改对话框的有关文件*/ CTestDlg2:CTestDlg2(CWnd* pParent /*=NULL*/) : CDialog(CTestDlg2:IDD, pParent) /*m_pParent为一成员变量,用于保存通知窗口的指针,所以该指针不能是一个临时指针*/ ASSERT(pParent); m_pParent=pParent; /AFX_DATA_INIT(CTestDlg2) / NOTE: the ClassWizard will add member initialization here /AFX_DATA_INIT void CTestDlg2:OnOK() CDialog:OnOK(); DestroyWindow(); void CTestDlg2:OnCancel() CDialog:OnCancel(); DestroyWindow(); void CTestDlg2:OnDestroy() CDialog:OnDestroy(); /*向其他窗口发送消息,将自身指针作为一个参数发送*/ m_pParent-PostMessage(WM_DELETE_DLG,(WPARAM)this); /*在消息接收窗口中添加消息映射*/ /*在头文件中添加函数定义*/ afx_msg LONG OnDelDlgMsg(WPARAM wP,LPARAM lP); /*添加消息映射代码*/ ON_MESSAGE(WM_DELETE_DLG,OnDelDlgMsg) END_MESSAGE_MAP() /*实现消息处理函数*/ LONG CMy53_s1View:OnDelDlgMsg(WPARAM wP,LPARAM lP) delete (CTestDlg2*)wP; return 0; /*创建对话框*/ void CMy53_s1View:OnTest2() CTestDlg2 *dlg=new CTestDlg2(this); dlg-Create(IDD_TEST_DLG_2); dlg-ShowWindow(SW_SHOW); 在这种方法中利用消息来进行通知,在Window系统中利用消息进行通知和传递数据的用法是很多的。 同样无模式对话框的另一个作用还可以用来在用户在对话框中的输入改变时可以及时的反映到其他窗口。下面的代码演示了在对话框中输入一段文字,然后将其更新到视图的显示区域中,这同样也是利用了消息进行通知和数据传递。 /*在对话框中取出数据,并向其他窗口发送消息和数据,将数据指针作为一个参数发送*/ void CTestDlg2:OnCommBtn() char szOut30; GetDlgItemText(IDC_OUT,szOut,30); m_pParent-SendMessage(WM_DLG_NOTIFY,(WPARAM)szOut); /*在消息接收窗口中*/ /*映射消息处理函数*/ ON_MESSAGE(WM_DLG_NOTIFY,OnDlgNotifyMsg) /*在视图中绘制出字符串 m_szOut*/ void CMy53_s1View

温馨提示

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

评论

0/150

提交评论