计算机图形学实验指导书_第1页
计算机图形学实验指导书_第2页
计算机图形学实验指导书_第3页
计算机图形学实验指导书_第4页
计算机图形学实验指导书_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

《计算机图形学》实验指导书郗润平编制西北工业大学计算机学院二○一一年四月修订说明根据我院《计算机图形学》教学大纲规定及课堂教学内容,参阅其它院校本课程教学与实验课的内容,并结合学生和实验室的情况,特编制本实验指导书供学生在上机实验课时参考使用。本实验大纲择选与课程教学较为密切的若干实验,每个实验分别给出了参考机时数,实验时可根据具体的机时安排情况选做。在附录中简朴地介绍了OpenGL和DirectX3D两个三维图形开发平台基本概念和相关的重要函数,供感爱好同学入门学习参考使用。XRP于2023.3.15补充了MFC中几种常用DC的使用说明等;(附录二1314)补充了VC下OpenGL编程框架细节。(附录三)于2023.4.24补充MFC菜单使用;(附录二10)补充了对话框使用;(附录二11)鼠标拾取点示例。(附录二12)于2023.4.26补充了工具条的使用(附录二13) 于2023.3.14增长三(二)9修改OnEraseBkgnd()函数,严禁重绘背景,避免动画时闪烁。 于Sydney2023.1.18目录TOC\o"1-3"\h\u实验一直线生成算法 1实验二圆弧生成算法 2实验三窗口菜单交互界面 2实验四区域填充算法 3实验五裁剪算法算法 3实验六图形软件开发包/库应用 3实验七曲线的生成算法 4实验八曲面生成算法 4实验九二维图形变换 5实验十三维图形变换 5实验十一真实感图形 6附录 7一、C语言中图形函数及其用法 7二、VC集成开发环境下基于MFC绘图 16三、OpenGL绘图 30四、DirectX3D绘图 35五、实验报告模板 39六、《计算机图形学》上机实验评分标准 40实验一直线生成算法一、实验教学目的与基本规定1.了解光栅图形显示器的工作原理和特点;2.学习C/VC环境下的基本绘图方法;3.实践与巩固直线的基本生成算法。

4.掌握直线扫描转换算法的原理及实现;二、实验课程内容(2学时)基于光栅图形显示器,在C环境中生成不同粗细和线型的任意直线。1.了解光栅图形显示器的特点;2.熟悉C环境下图形程序的绘图方法;3.实践DDA、中点及Bresenham基本算法,并至少用两种基本算法生成任意直线;i.任意斜率:-1≤k<0,(50,400)(500,50);0≤k≤1,如(50,50)(300,200):1<|k|<∞,如(50,50)(300,400);k=∞,如(200,50)(200,400)。ii.任意起始点:如(200,500)(100,200),(300,200)(50,50)4.改善方法,实现对直线实现线宽和线型(虚线、点划线等)的控制。三、实验参考有关C环境下绘图介绍请参见附录一,以下实例为绘制一条直线(TC编译环境),供上机实验时参考使用。#include"graphics.h"#include"string.h"main(){ intx0=50,y0=50, x1=450,y1=450,color=3; //定义点(50,50),(450,450)和颜色color intx,y; intgdriver=DETECT,gmode; //定义图形驱动程序和显示模式 initgraph(&gdriver,&gmode,""); //图形方式初始化 cleardevice(); //清屏 y=y0; for(x=x0;x<=x1;x++) { putpixel(x,y,color); //用colo颜色绘制点(x,y) y=y+1; } getch(); //让画面停住,等按一下键盘再继续 closegraph(); //关闭图形方式 return(0);}注:VC集成开发环境下基于MFC绘图可参考附录二实验二圆弧生成算法一、实验教学目的与基本规定1.学习圆(弧)的基本生成算法;2.了解光栅图形显示器的工作原理和特点;3.实践圆(弧)的基本生成算法;4.掌握圆弧扫描转换算法的原理及实现;5.了解反走样技术。二、实验课程内容(2学时)基于光栅图形显示器,在C环境中生成任意圆弧,并实践反走样技术。1.巩固C环境下的绘图方法;2.用中点和Bresenham算法生成任意位置圆(弧);3.改善方法,实现线宽和线型的控制;4.运用反走样技术改善直线和圆弧的生成算法。实验三窗口菜单交互界面一、实验教学目的与基本规定1.了解窗口系统有关概念,学习相关知识;2.了解和学习菜单相关与知识;3.理解交互的重要意义。二、实验课程内容(3学时)MS-Windows环境下窗口、菜单交互界面实现。三、实验参考 Win32编程方式参考教材P108-128有关内容,MFC编程方式可参考附录二10-12。实验四区域填充算法一、实验教学目的与基本规定1.掌握区域填充的基本算法原理;2.会使用字符的图形输出。二、实验课程内容(4学时)1.多边形的扫描线、边标志及扫描线种子填充算法(至少实现两个算法);2.在屏幕上输出矢量或点阵字符。三、实验参考 参考教材有关内容。实验五裁剪算法算法一、实验教学目的与基本规定熟悉裁剪算法的基本原理。二、实验课程内容(2学时)实现直线的Cohen-Sutherland、中点分割和参数化裁剪算法(至少实现两种裁剪算法)。三、实验参考 参考教材有关内容。实验六图形软件开发包/库应用一、实验教学目的与基本规定1.会使用一种图形软件开发包;2.学习窗口下图形界面设计;3.能使用图形软件开发包绘制简朴的图形/形体。(为实验十一做准备)二、实验课程内容(3学时)学习并实践使用图形软件开发包(OpenGL或DirectX3D等)绘图。1.熟悉图形开发平台程序设计过程;2.使用图形库绘制简朴图形/形体。三、实验参考有关OpenGL或DirectX3D绘图介绍请参见附录三、四。实验七曲线的生成算法一、实验教学目的与基本规定1.掌握曲线生成的基本算法原理;2.能实现曲线的生成;3.掌握课本所介绍的图形算法的原理和实现。二、实验课程内容(4学时)实现Bezier曲线和B样条曲线生成算法。1.Bezier曲线生成算法实现(参见教材P304~306):三次Bezier曲线及deCasteljau算法。2.B样条曲线生成算法实现(参见教材P314~316):B样条曲线的分割,节点插入算法(选做)。三、实验参考 参考教材有关内容。实验八曲面生成算法一、实验教学目的与基本规定1.学习曲面生成、隐藏的基本算法;2.了解z缓冲器算法的应用;3.掌握课本所介绍的图形算法的原理和实现。

二、实验课程内容(4学时) 曲面的隐藏线消除和z缓冲器的应用。 1.曲面的隐藏线消除算法; 2.用z缓冲器算法绘出一个立方体的真实感图形。三、实验参考 参考教材有关内容。实验九二维图形变换一、实验教学目的与基本规定1.掌握图形变换的基本算法原理;2.实现若干典型二维图形变换算法。二、实验课程内容(4学时)1.生成前几次实验中的基本图形; 2.对生成的基本图形进行平移、旋转、放缩、对称等变换。实验十三维图形变换一、实验教学目的与基本规定1.实习三维图形的坐标系之间的变换;2.三维图形几何变换;3.掌握三维图形的坐标系之间的变换算法及三维图形几何变换的原理和实现。二、实验课程内容(4学时)实现三维图形的坐标系之间的变换(世界坐标、物坐标、屏幕坐标)以及三维图形几何变换。三、实验参考 参考教材有关内容。实验十一真实感图形一、实验教学目的与基本规定初步实现真实感图形,并实践图形的造型与变换等。二、实验课程内容(6学时)运用几何造型,几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。1.用给定地形高程数据绘制出地形图;2.绘制一(套)房间,参数自定。三、实验参考 参考教材及附录三、四有关内容。附录一、C语言中图形函数及其用法TurboC2.0/3.0具有丰富的图形功能,它提供了70多个图形函数。在这里只介绍最常用的一部分,其余的图形函数及用法可参阅相关书籍。图形函数均在头文献"graphics.h"中定义,所以在程序中调用这些图形函数时,必须在程序文献的开头写上文献包含命令:#include"graphics.h"。

1.图形系统管理

PC机的显示器有两种工作模式,一种是图形模式,此外一种是文本模式(缺省模式)。在文本方式下,屏幕分为80列、25行,在该方式下,图形函数不能对的工作。因此在使用图形函数绘图之前,必须将屏幕显示适配器设立为图形模式,这就是通常所说的"图形方式初始化"。在绘图工作完毕之后,又要使屏幕回到文本方式,以便进行文本方式下的工作。

1)图形方式初始化图形方式初始化是通过函数initgraph()来完毕的。其调用格式为:Initgraph(*gdriver,*gmode,*path);函数initgraph()的功能是通过从磁盘上装入一个图形驱动程序来初始化图形系统,并将系统设立为图形方式。调用该函数必须用三个参数,其含义为:

gdriver是一个整型值,用来指定要装入的图形驱动程序,假如给其赋值为DETECT(该值在头文献"graphics.h"已经中定义),则系统自动检测图形适配器的最高分辨率模式,并装入相应的图形驱动程序。gmode是一个整型值,用来设立图形显示模式。不同的图形驱动程序有不同的图形显示模式;即使是在同一个图形驱动程序下,也也许会有几种图形显示模式。图形显示模式决定了显示的分辨率、可同时显示的颜色的多少、调色板的设立方式以及存储图形的一页数。path是一个字符串,用来指明图形驱动程序所在的途径。假如驱动程序就在用户当前目录下,则该参数可认为空字符串,否则应给出具体的途径名。以上介绍了initgraph函数中的三个参数的含义。注意,前两个参数事实上是整形指针,调用时应加上地址运算符"&"。例:intgdriver=DETECT,gmode;

initgraph(&gdriver,&gmode,"");使用DETECT模式,由系统自动对硬件进行检测,并把图形显示模式设立为检测到的驱动程序的最高分辨率。2)关闭图形方式 在运营图形程序绘图结束后,要回到文本方式,以进行其他工作,这时应关闭图形方式。关闭图形方式要用函数closegraph()。其调用格式为: closegraph();函数closegraph()的作用是:释放所有图形系统分派的存储区,恢复到调用initgraph()之前的状态。函数closegraph()不需要参数。2.屏幕管理TurboC2.0提供了11个函数用于对屏幕和视图区等进行控制管理。1)设立视图区 在图形模式下,可以用函数setviewport()在屏幕上定义一个视图区(视图区相称于一个用于绘图的窗口)。视图区的位置用屏幕绝对坐标定义,并且可以把视图区设立为剪裁和不剪裁两种状态。函数setviewport()的调用格式为: setviewport(x1,y1,x2,y2,c);

函数调用中的五个参数均为整型,其中: x1,y1:为视图区的左上角坐标。X2,y2:为视图区的右下角坐标。C:为裁剪状态参数。当c=1时,则超过视图区的图形部分被自动裁剪掉;当c=0时,则对超过视图区的图形不作裁剪解决。注意:视图区建立以后,所有的图形输出坐标都是相对于当前视图区的,即视图区左上角为坐标(0,0)点,而与图形在屏幕上的位置无关。2)清除视图区清除视图区可以使用函数clearviewport()。它的作用是清除掉当前的视图区,将当前点位置设立于屏幕作上角(0,0)点。执行后,原先设立的视图区将不复存在。函数的调用格式为:clearviewport();3)清屏清除屏幕使用函数cleardevice()。它的作用是立即清除全屏幕内容,并将当前点位置设立为原点(0,0)。但是其他的图形系统设立保持不变,如线型,充填模式等;假如设立了视图区,则视图区的设立不变,涉及当前点位置设立在视图区的左上角。清屏函数的调用格式为:cleardevice();3.绘图函数绘图函数是进行图形操作的基础。用象素点几乎可以画出任何图形,但效率太低。为此TC提供了大量的基本绘图函数,以方便图形设计。

在使用绘图函数时,要随时注意画图的"当前点位置",它是绘图的起始位置。也就是说,图形总是从当前点开始画。画完一个图形后,有时当前点的位置不变,仍在本来的位置;有时则要把当前点移到新的位置。此外,为了从指定位置开始作图,有时需要先改变当前点位置,然后再作图。在调用绘图函数的时候要注意这些问题。

1)直线类函数用直线类函数绘制直线图形,可以用两种坐标:一种时绝对坐标;另一种是相对坐标。

Line()函数 用line()函数可以在指定的两点之间画一条直线段。其调用格式为:line(x1,y1,x2,y2);

参数x1,y1,x2,y2均为整型,使用绝对坐标。其中(x1,y1)和(x2,y2)分别为直线的两个端点坐标。用line函数画线时,其当前点的位置不变。例如:已知三角形的两个顶点坐标分别为:(x1,y1)、(x2,y2)和(x3,y3),则用下面的语句可以把该三点连成一个三角形:line(x1,y1,x2,y2);

line(x2,y2,x3,y3);

line(x3,y3,x1,y1);lineto()函数lineto()函数用于从当前点位置到指定位置画一条直线,并改变当前点的位置。在画线到指定点的同时也把当前点的位置移到了指定点(即直线的终点)。其调用格式为:lineto(x,y);

参数x,y位指定点坐标,均为整型。moveto()函数函数moveto()用于移动当前点位置,并不画线。其调用格式为:moveto(x,y);

参数x,y用于指定新的当前点位置坐标(用整型,使用绝对坐标)。调用的结果是将当前点位置移到点(x,y)处。例如:moveto(400,10);

结果是将当前点位置移到了(400,10)处。moveto()函数和lineto()函数配合使用,可以在两点之间画直线。例如:moveto(400,10);

lineto(240,360);上面的语句实现把当前点移到(400,10)处,然后从该点画线到(240,360)处。画线结束后,当前点位置在(240,360)处。linerel()函数 linerel()函数用相对坐标画线。其功能是从当前点位置开始画线到指定点位置,该指定点位置的坐标不是以绝对坐标的形式给出,而是以其相对于当前点(即直线起点)位置的坐标增量给出的(相对坐标)。其调用格式为: linerel(dx,dy);

参数是相对于直线起点的坐标增量。Linerel()函数改变当前点位置到指定点处。moverel()函数 moverel()函数的功能与moveto()函数相似,但它使用的是相对坐标,它使当前点位置在x和y方向上分别移动一个增量。其调用格式为:moverel(dx,dy);

参数dx,dy为整型,是相对于当前点位置的增量。下面举几个实际的绘图例子,来说明上面这些函数在使用上的差别:例1:用line函数过四点画一个矩形。#include"graphics.h"

#include"stdio.h"

main()

{intgdriver=DETECT,,gmode;

initgraph(&gdriver,&gmode,"");

cleardevice();

line(100,100,100,400);

line(100,400,300,400);

line(300,400,300,100);

line(300,100,100,100);

getch();

closegraph();}2)圆弧类函数circle()函数 函数circle()用于以指定圆心和半径的方式画圆。其调用格式为circle(x,y,r);

参数x,y,r均为整型。其中x,y为指定的圆心坐标,r为圆的半径。例如:

circle(300,200,100);的调用结果是:以点(300,200)为圆心,以100为半径画一个整圆。arc()函数 arc()函数用于画圆弧。其调用格式为:arc(x,y,args,ange,r);

函数调用时所需的五个参数均为整型。其中:

x,y为圆弧所在圆的圆心坐标。angs,ange分别为圆弧的起始角和终止角(单位为度),r为圆弧的半径。例如:

arc(300,200,90,180,200)的结果是以点(300,200)为圆心,200为半径,从90度到180度画了四分之一圆弧。当圆弧的起始角angs=0,终止角angs=360时,则可以画出一个整圆。ellipse()函数 函数ellipes()用于画椭圆弧或椭圆。其调用格式为:ellipse(x,y,angs,ange,xr,yr);

函数的参数均为整型。其中:

x,y为椭圆的中心坐标,angs,ange分别为椭圆弧的起始角和终止角(单位为度),xr,yr分别为椭圆的水平轴半轴和垂直轴半轴。假如args=0,ange=360,则可以画出一个完整的椭圆。此外:

xr>yr:则画出长轴为水平方向的椭圆或椭圆弧;

xr<yr:则画出长轴为垂直方向的椭圆或椭圆弧;

xr=yr:则可以画出圆或圆弧。例2:调用函数ellipse画出一个椭圆群。#include"graphics.h"

#include"stdio.h"

main()

{inta=150,i;

intgdriver=EDTECT,gmode;

initgraph(&gdriver,&gmode,"");

cleardevice()

for(i=10;i<=140;i+=10);

ellips(320,240,0,360,a-i,i);

getch();

closegraph();}3)多边形rectangel()函数 函数rectangle()用于绘制矩形。其调用格式为:rectangle(x1,y1,x2,y2);

参数x1,y1,x2,y2均为整型。函数的功能是以点(x1,y1)为矩形的左上角点,以点(x2,y2)为矩形的右下角点,画一个矩形。drawpoly()函数 函数drawpoly()可用于画一条多边折线或者一个多边形。其调用格式为:drawpoly(nps,*pxy);

它有两个参数。第一个参数nps是一个整型数据,它表时所画多边折线的顶点数,第二个参数pxy是一个整型数组的数组名,该数组中存放了nps个顶点的坐标值序列。例如,有一个名为d_poly的数组中存放了4个顶点的坐标为[x1,y1,x2,y2,x3,y3,x4,y4],则调用方式为:drawpoly(4,d_poly);假如最后一个点的坐标与第一个点的坐标相同,则运用drawpoly()函数便可以画出一个封闭的多边形。此时,坐标点的数目应当是多边形的顶点数加1,即让最后一个顶点和第一个点重合。例如,有一个名为d_poly的数组中存放了6个顶点的坐标为[x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x1,y1],则调用方式为:drawpoly(6,d_poly);便可以画出一个具有5个顶点的封闭的多边形。4.图形属性控制图形的属性控制涉及控制颜色和线型。颜色有背景色和前景色之分。背景色指屏幕的颜色(即绘图时的底色),前景色指绘图时图形线条所用的颜色。任何绘图函数都是在当前的颜色(涉及背景色和前景色)和线型的状态下进行绘图的。前面所举的例子中没有提当前的颜色和线型,是由于用了系统的缺省值(系统的缺省值是:背景色为黑色,前景色为白色,线型为实线)。假如绘图时要使用系统缺省值以外的颜色和线型,则可以运用图形属性控制函数另行设立。

setbkcolor()函数 函数setbkcolor()用于设立绘图时的背景色。调用格式为:setbkcolor(color);

参数color为一个整型数据,代表所取的颜色,可以用整型常数(0~15),也可以用符号常数。例如,要把背景色设立成浅蓝,可以如下调用:setbkcolor(9);;9表达浅蓝。setcolor()函数 函数setcolor()用于设立前景颜色,即绘图用的颜色。调用格式为:setcolor(color);

参数color的含义和用法同setbkcolor()函数。下面的例程序可以演示16种颜色。

例3:显示16种颜色#include"graphics.h"

#include"stdio.h"

main(){intcb,cf;

intgdriver=DETECT,gmode;

initgraph(&drive,&gmode,"");

cleardevice();

for(cb=0;cb<=15;cb++)

{setbkcolor(cb);

for(cf=0;cf<=15;cf++)

{setcolor(cf);

circle(100+cf*25,240,100);}

getch();

}getch();

closegraph();}setlinestyle()函数 函数setlinestyle()用于设立当前绘图所用的线型和宽度,这些设立限于对

直线类图形有效。其调用格式如下: setlinestyle(sty,pat,b);该函数所用的三个函数含义如下:sty为整型值,用来定义所画直线的类型(0~4);pat为无符号整型数,该参数在需要用户自定义线型时使用,假如是使用系统定义的线型,则该参数可取0值;b为整型数,指定所画直线的粗细,以象素为单位(1或3)当函数setlinestyle的第一个参数为USERBIT-LINE(或4)时,可以由用户自己定义直线类型。例4:编写程序,显示系统预定义的四种线型。#include"graphics.h"

#include"stdiio.h"

main()

{inti,j,c,x=50,y=50,k=1;

intgdrive=DETECT,gmode;

printf("inputcolornumber.\n")

scanf("%d",&c);

initgraph(&gdriver,&gmode,"");

cleardevice();

setbkcolor(11);

setcolor(c);

for(j=1;j<=2;j++);

{

for(i=0;i<4;i++)

{

setlinestyle(i,0,k);

rectangle(x,y,x+210,y+80);

x=x+110;

y=y+40;

}

k=3;

x=50;

y=250;

}

getch();

closegraph();}5.充填setfillstyle()函数 函数setfillstyle()用来设立当前充填的模式和充填的颜色,以便用于充填一个指定的封闭区域。其调用格式为:setfillstyle(pattern,color);

参数pattern用于指定充填的模式(取值:0~11),第二个参数color指定充填用颜色。

Floodfill()函数 函数floodfill()实行对一指定区域进行充填操作,其充填模式和颜色已由setfillstyle()函数指定。其调用格式为:floodfill(x,y,bcolor);参数x,y指位于充填区域内任意一点的坐标,该点作为充填的起始点。bcoloor为充填区域的边界颜色。例5:下面的例程序演示充填情况。#include"graphics.h"

#include"stdio.h"

main()

{

inti,c,x=5,y=6;

intgdriver=DETECT,gmode;

printf("inputcolornumber.\n");

scanf("%d",&c);

initgraph(&gdriver,&gmode,"");

cleardevice();

setbkcolor(9);

for(i=c;i<c+8;i++)

{

setcolor(i);

rectangle(x,y,x+140,y+104);

x=x+70;

y=y+52;

setfillstyle(1,i);

floodfill(x,y,i);

}

getch();

closegraph();

}6.图形方式下的文本输出settextstyle(font,direction,csize)函数。设立字符的显示风格。函数的三个参数的含义如下font:是一个整型数据,用于指明所要使用的文字的字体(0表达8*8位图字体;1表达三重矢量字体;2表达小号矢量字体;3表达无衬线矢量字体;4表达哥特矢量字体)。direction:是一个整型数据,表达指定文本的输出方向(0表达从左向右输出;1表达从上向下输出)。csize:是一个整型数据,表达字符的大小(实际是一个放大系数,表达对8*8点阵字符的放大倍数,取值范围是1~10)。outtext(char*text);在当前位置输出一个文本字符串。

outtextxy(intx,inty,char*text);在x,y位置输出一个文本字符串。综合举例

例6:渔网图案绘制#include"graphics.h"

#include"stdio.h"

main()

{intx,y,x1,y1,x0=320,y0=50;

inti,j,n=5,r=20;

intgdriver=DETECT,gmode;

initgraph(&gdriver,&gmode,"");

cleardevice();

setbkcolor(9);

for(i=0;i<2*n;i++)

{x1=x0-i*r;

y1=y0+i*r;

for(j=0;j<=n-1;j++)

{x=x1+2*j*r;y=y1+2*j*r;

arc(x,y,180,270,r);

arc(x,y+2*r,0,90,r);}}x1=x0-2*r;

y1=y0;

for(i=0;i<2*n;i++)

{x1=x1+r;

y1=y1+r;

for(j=0;j<=n-1;j++)

{x=x1-2*j*r;y=y1+2*j*r;

arc(x,y,90,180,r);

arc(x-2*r,y,270,360,r);}}getch();

closegraph();}例7:图形模式下的文本输出#include"graphics.h"

#include"stdio.h"

#include"dos.h"

main()

{inti,t,x=300,y=50;

intgdriver=DETECT,gmode;

initgraph(&gdriver,&gmode,"");

cleardevice();

setbkcolor(9);

setcolor(4);

for(i=1;i<=10;i++)

{x=x-15;

y=y+15;

settextstyle(1,0,i);

cleardevice();

outtextxy(x,y,"itisok");

delay(200);/*时间延迟*/}getch();

closegraph();}二、VC集成开发环境下基于MFC绘图0.MFC简介MFC(MicrosoftFoundationClassLibrary)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简朴的方法。由于总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。MicrosoftVisualC++提供了相应的工具来完毕这个工作:AppWizard可以用来生成初步的框架文献(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文献;最后,编译,则通过类库实现了应用程序特定的逻辑。MFC提供了一个Windows应用程序开发模式,对程序的控制重要是由MFC框架完毕的,并且MFC也完毕了大部分的功能,预定义或实现了许多事件和消息解决,等等。框架或者由其自身解决事件,不依赖程序员的代码;或者调用程序员的代码来解决应用程序特定的事件。MFC是C++类库,程序员就是通过使用、继承和扩展适当的类来实现特定的目的。例如,继承时,应用程序特定的事件由程序员的派生类来解决,不感爱好的由基类解决。实现这种功能的基础是C++对继承的支持,对虚拟函数的支持,以及MFC实现的消息映射机制。1.运用VC工程向导建立一个工程工程名可认为班号+学号+姓名+实验序号,如8_04888_张三_1,这里以test为示例,如图1所示。图1建立工程2.点击“OK”拟定后,如图2所示图2选择单文档3.选择“Singledocument”后,点击“Finish”,如图3所示图3确认4.点击“OK”拟定后,在左则选择“ClassView”项,点击开“testclass”前“+”,再点击“CTestView”类前“+”,双击“OnDraw(CDC*pDC)”,如图4所示图4编写代码5.在OnDraw()函数中使用pDC对象进行绘图,如 pDC->SetPixel(x,yy,255);设立(x,yy)象素点颜色为255。可在其中加入自己的代码,如DDA程序如下: intx,yy;floatdx,dy,k,y; intx0=1,y0=1,x1=500,y1=400; COLORREFcolor=RGB(100,25,108); //定义一个RGB颜色常量dx=x1-x0;dy=y1-y0; k=dy/dx;y=y0;for(x=x0;x<=x1;x++){ yy=(int)(y+0.5); pDC->SetPixel(x,yy,color255); y=y+k;}如图4所示。此外,也可以在这里调用自己声明定义好的函数,详见7-9。6.点击菜单“Build”中的“BuildAll”编译程序,如图5所示,无错误后可执行(Ctrl+F5)。图5编译或执行7.声明一个CTestView类成员函数:双击CTestView类可打开TestView.h文献,如图6所示,可在public后声明函数voidDDALine(intx1x0,inty1y0,intx2x1,inty2y1,COLORREFintcolor);图6成员函数声明8.返回TestView.CPP文献定义函数voidCTestView::DDALine(intx1x0,inty1y0,intx2x0,inty2y0,COLORREFintcolor){加入自己的程序代码。}图7自定义函数9.在OnDraw(CDC*pDC)中调用定义好的函数,如DDALine(100,100,400,500,200);图8自定义成员函数调用10.MFC菜单实现i.设立菜单项 在VC集成开发环境界面左侧工作区,打开“Resourse”中的“Menu”,选择默认菜单资源“IDR_MAINFRAME”,添加菜单项,并定义标题、ID及提醒等属性,如图9所示。图9ii.添加命令函数 按Ctrl+W快捷键进入MFC类向导,选择View类、刚才定义好的菜单项ID、COMMAND消息,如图10所示。然后点击“AddFunction…”按钮,再单击“OK”添加成员函数,如图11所示。图10MFC类向导图11添加成员函数iii.编辑相应的函数 点击“EditCode”按钮进入相应的函数编辑区域,可编写相应的程序代码,也可调用定义的DDA函数,如图12所示。图12编写菜单响应函数通过编辑即可选择添加的菜单项执行相应的程序代码/函数,如图13。图13执行菜单项反复以上环节可添加其它菜单项。11.MFC对话框输入/输出i.设立对话框 在VC集成开发环境界面左侧工作区,打开“Resourse”中的“Dialog”,在其上单击鼠标右键,在POP菜单上选择资源“Insert…”,添加对话框“”,点击“N新建”按钮项,并定义标题、ID及提醒等属性,如图9所示。图14添加对话框ii.添加对话框控件添加静态文字和文本输入框,如图15所示,并设立文本输入框ID分别为IDC_X1、IDC_Y1、IDC_X2和IDC_Y1。图15添加对话框控件iii.对话框类及成员变量定义按Ctrl+W进入类设计向导,点OK添加对话框类,并命名为Dialog1如图16,并点击OK按钮确认。图16定义对话框类选择类向导中“MemberVariables”选项来设立成员变量,选中控件IDC_X1后,点击右侧“AddVariable…”,如图17设立变量名称为m_pt1_X及变量类型int后,点击“OK”确认,此时可设立变量的输入值的有效范围(初始值在对话框的构造函数中设立)。同样设立控件IDC_Y1、IDC_X2和IDC_Y1的变量名称为m_pt1_Y、m_pt2_X和m_pt2_Y,变量类型均设立为int型。图17定义成员变量iv.使用对话框在View类.CPP文献中包含对话类,并定义对话框对象dlg。在菜单选项响应函数中加入dlg.doModel()来执行定义好的对话框,并添写获取对话框中的输入数据的语句,如图18所示。图18使用对话框此时可编译运营程序,点击相应的菜单选项即可执行对话框内容。12.鼠标拾取点 运用类向导(Ctrl+W),在View类中添加WM_LBUTTONUP消息,如图19。图19添加鼠标左键消息然后点“EditCode”按钮进入代码编写区,输入以下代码: if(ipt%2!=0) //区分点击前后两点 { point1=point;//记录点1 OnDDALine(point0.x,point0.y,point1.x,point1.y); //两点绘线 } else point0=point;//记录点0 ipt=ipt+1; //点击计数器加一 在相应view.CPP文献前增长变量声明 Intipt=0; //鼠标点击计数器 CPointpoint0,point1; //点击的一对点坐标现在就可以编译运营,实现用鼠标左键拾取两点绘线了。13.工具条的使用 在VC集成开发环境界面左侧工作区,打开“Resourse”中的“Toolbar”,可选择默认菜单资源“IDR_MAINFRAME”,绘制新图标项,如图20所示。图20工具栏新图标绘制双击工具栏中绘制好的图标按钮,在弹出对话框中为其选择相应的命令函数,如图21所示。保存编译后即可实现工具新添加的图标按钮执行所选择的命令函数。图21工具栏标相应函数设立134.VC、MFC与绘图有关内容1)点与颜色等 CPointpoint; //定义点变量,包含x和y两个值 COLORREFrgb; //定义RGB颜色变量 COLORREFGetPixel(intx,inty); //获取像素点RBG颜色值 Invalidate(); //发送重新绘制消息2)几种设备描述定义与使用示例HDChdc=::GetDC(m_hWnd);SetPixel(hdc,x,y,RGB(125,34,180));::ReleaseDC(m_hWnd,hdc);//::GetDC和::ReleaseDC应配对使用,否则也许会导致错误CDC*pDC=GetDC();pDC->SetPixel(x,y,255);ReleaseDC(pDC);CClientDCdc(this);CWindowDCdc(this);

CWindowDCdc(GetDesktopWindow());//获得整个桌面的句柄,一些桌面特效程序使用CPaintDCdc(this); dc.SetPixel(x,y,RGB(25,34,128));3)几种设备说明Windows应用程序通过为指定设备(屏幕,打印机等)创建一个设备描述表(DeviceContext,DC)在DC表达的逻辑意义的“画布”上进行图形的绘制。DC是一种包含设备信息的数据结构,它包含了物理设备所需的各种状态信息。Win32程序在绘制图形之前需要获取DC的句柄HDC,并在不继续使用时释放掉。在c++编程中常会见到HDC、CDC、CClientDC、CPaintDC、CWindowDC这样的类。

HDC是DC的句柄,API中的一个类似指针的数据类型。.

CDC是MFC的DC的一个类,CDC等设备上下分类,都具有一个类的成员变量:m_nHdc,即HDC类型的句柄。CDC及其派生类的继承视图:CObject

public|CDC

public||CClientDC

public||CPaintDC

public||CWindowDC

public||CMetaFileDC

(注意:除CMetaFileDC以外的三个派生类用于图形绘制.)CDC类定义了一个设备描述表相关的类,其对象提供成员函数操作设备描述表进行工作,如显示器,打印机,以及显示器描述表相关的窗口客户区域。通过CDC的成员函数可进行一切绘图操作。CDC提供成员函数进行设备描述表的基本操作,使用绘图工具,选择类型安全的图形设备结构(GDI),以及色彩,调色板。除此之外还提供成员函数获取和设立绘图属性,映射,控制视口,窗体范围,转换坐标,区域操作,淘汰,划线以及绘制简朴图形(椭圆,多边形等)。成员函数也提供绘制文本,设立字体,打印机换码,滚动,解决元文献。其派生类:

1.PaintDC:封装BeginPaint和EndPaint两个API的调用。(1)用于响应窗口重绘消息(WM_PAINT)是的绘图输出。

(2)CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在解决窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。

(3)CPaintDC也只能用在WM_PAINT消息解决之中。2.CClientDC(客户区设备上下文):解决显示器描述表的相关的窗体客户区域。

用于客户区的输出,与特定窗口关联,可以让开发者访问目的窗口中客户区,其构造函数中包含了GetDC,析构函数中包含了ReleaseDC。3.CWindowDC:解决显示器描述表相关的整个窗体区域,涉及了框架和控件(子窗体)。(1)可在非客户区绘制图形,而CClientDC,CPaintDC只能在客户区绘制图形。

(2)坐标原点是在屏幕的左上角,CClientDC,CPaintDC下坐标原点是在客户区的左上角。

(3)关联一特定窗口,允许开发者在目的窗口的任何一部分进行绘图,包含边界与标题,这种DC同WM_NCPAINT消息一起发送。4.CMetaFileDC:与元文献相关的设备描述表关联。MFC的类使用方便很多,由于它们都在构造函数和析构函数调用了响应的函数进行DC的获取和释放.下面说下一些细点的知识点

CClientDC,CWindowDC区别不大,可以说CWindowDC包含了CClientDC就拿记事本来说

CClientDC就只是白白的我们可以编辑文字的那个区域是客户区

CWindowDC除了上面说的白白区域,还涉及菜单栏和工具栏等

CClientDC和CWindowDC与CPaintDC的区别大点

在DC的获取方面CClientDC和CWindowDC使用的是并只能是GetDC和ReleaseDC

CPaintDC使用的是并只能是BeginPaint和EndPaint

CPaintDC只能用在响应WM_PAINT事件

CClientDC,CWindowDC只能用在响应非WM_PAINT事件以下内容待进一步整理(仅供参考)VC中如何创建多个工具条在实际的软件开发中,我们经常需要创建多个自定义的工具条,并且要象标准的工具条那样,允许用户通过鼠标将自定义的工具条移动到框架的其它地方,还可以根据需要显示或是隐藏该工具条。通过实践,我们在VisualC++6.0中编程实现了创建自定义的工具条,从而在应用程序中可并存多个工具条。

1.在VisualC++6.0中用AppWizard以默认方式创建SDI或MDI的应用程序工程,工程名称为MyBars。

2.在ResourceView中选择“Toolbar”并点击右键,通过选择“InsertToolbar”新建一工具条,其ID值设为ID_MYTOOLBAR。在该工具条上添加两个位图按钮,并双击每个位图按钮,设立其ID值分别为ID_MYTOOLBAR_CIRCLE和ID_MYTOOLBAR_RECT。

3.在MainFrame.h文献中CMainFrame类定义的前面定义一个映射工具条按钮图像和程序命令ID的数组,这是一个UINT类型的数组:

staticUINTBASED_CODEMy_Buttons[]=

{//要和工具条中位图的顺序同样

ID_TOOLBAR_CIRCLE,

ID_TOOLBAR_RECT};

4.在CMainFrame类中添加一工具条对象指针m_pMyToolBar:

classCMainFrame:publicCFrameWnd

{……

protected:

CStatusBarm_wndStatusBar;

CToolBarm_wndToolBar;

CToolBarm_pMyToolBar;

//新添加的工具条对象指针

……}

5.在CMainFrame::OnCreate函数中添加代码创建和初始化工具条,并建立所需的连接关系,代码如下:

intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct)

{……

//创建和初始化工具条对象

m_pMyToolBar=newCToolBar();

m_pMyToolBar-〉Create(this,WS_CHILD|WS_VISIBLE|CBRS_TOP,0x9100);

//将按钮图象和工具条对象连接起来

m_pMyToolBar-〉LoadBitmap(IDR_MYTOOLBAR);

//将映射数组My_Buttons和工具条对象连接起来

m_pMyToolBar-〉SetButtons(My_Buttons,sizeof(My_Buttons)/sizeof(UINT));

//允许用户通过鼠标将工具条移动到框架的其它地方

m_pMyToolBar-〉EnableDocking(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

DockControlBar(m_pMyToolBar);

return0;}

6.通过View-〉ClassWizard为工具条的按钮ID值添加消息响应解决函数,例如为ID_TOOLBAR_CIRCLE添加的解决函数如下所示:

voidCMainFrame::OnToolbarCircle()

{AfxMessageBox("Circle");//可改为具体的有关代码}

这样,我们就创建了一个新的工具条(如图1),上面有两个按钮,点击按钮将会执行有关的操作,并且用户还可以将工具条任意拖动到框架的其它地方。

图1

工具条建立之后,就被连接到应用程序的框架窗口上,我们一般还要允许用户根据需要显示或隐藏该工具条。下面的代码就可实现这种规定:

intnShow=SW_SHOWNORMAL;//想要隐藏则设立为SW_HIDE

m_pMyToolBar-〉ShowWindow(nShow);//显示或隐藏工具条

RecalcLayout();//告知框架窗口,重新计算工具条的位置

以上的程序在VisualC++6.0中调试通过。

VC++实现工具条上的标准控件动态添加工具条作为大多数标准的Windows应用程序的一个重要组成部分,使其成为促进人机界面和谐的一个重要工具。通过工具条极大方便了用户对程序的操作,但是在由MicrosoftVisualC++开发环境所创建的应用程序框架中的工具条只是一个简朴的按钮的集合,在功能上也仅仅是起到了菜单快捷方式的作用,而没有做到象VC、Word等软件的工具条那样,提供多种不同类型的标准控件如组合框、编辑框等。特别是组合框在添加到工具条上后,可将原本需要在弹出对话框中完毕的交互操作在工具条上就可以进行,从而在很大限度上改善了应用程序的界面和谐限度。本文就此给出一种在普通应用程序的工具条上动态创建组合框、编辑框等标准控件的一般方法,并使应用程序可以响应由这些控件所触发的&&事件。组合框的添加组合框是添加到工具条中最常见的一种标准控件,填补了列表框控件占用较大空间和编辑控件的数据输入烦琐等弊端,可以在工具条的有限区域内提供所有备选数据,用户一般情况下只需通过鼠标操作即可实现对数据的选取。因此,多数情况下都是需要向工具条添加组合框控件来改善程序的界面和谐限度的。由于是在工具条上动态创建组合框控件,而工具条又非标准客户区,因此动态创建过程就存在一定的困难。这里的解决方式是先在VC的资源视图中为工具条添加一个空按钮IDC_COMBOX,然后通过CToolBar类的SetButtonInfo()&&函数来对此空白按钮进行设立,其目的是为后面将要创建的组合框在工具条上占据一块空间,然后再通过CToolBar类的GetItemRect()&&函数得到通过修改后的按钮区域坐标,该坐标值在后面创建动态组合框时将指定在工具条的什么地方创建一个多大的组合框。通过这些准备工作后,接下来组合框在工具条上的动态创建过程则完全同在客户区中的解决,即以CComboBox类的Create()&&函数动态完毕。根据前面的设计思绪不难写出实现代码。显然,这部分代码应当与工具条的创建代码一起添加到主框架类的创建&&函数OnCreate()中,下面结合注释给出部分关键代码:……

//工具条m_wndToolBar的创建代码

……

//设立组合框的宽度,四个参数依次为控件在工具条中的索引号、ID号、风格、宽度

m_wndToolBar.SetButtonInfo(8,IDC_COMBOX,TBBS_SEPARATOR,160);

//得到组合框的位置

m_wndToolBar.GetItemRect(8,&rect);

//设立组合框的下拉高度

rect.bottom+=100;

//创建组合框,四个参数依次为窗口风格、组合框位置、父窗口、ID号

m_combobox.Create(CBS_DROPDOWN|WS_VISIBLE|WS_TABSTOP|CBS_AUTOHSCROLL,rect,&m_wndToolBar,IDC_COMBOX);

//在组合框中加入字符串

m_combobox.AddString("第一条记录");

m_combobox.AddString("第二条记录");

//选中第1条记录

m_combobox.SetCurSel(0);对组合框&&事件的响应通过上述编码,已经在工具条上空白按纽处动态创建出了一个组合框,但是仅仅创建出组合框还是不够的,为了能通过此组合框实现同用户的交互还必须编写相关代码,使其嫩够响应由组合框发出的&&事件消息。通常情况下对此类控件&&事件的响应解决是通过ClassWizard类向导来完毕的,但由于此处是通过CComboBox类的Create()&&函数动态创建的,因此只能手动添加&&事件响应代码。对于组合框,其比较常用的两个&&事件消息是在选中一条记录时发出的CBN_SELCHANGE&&事件和在对组合框内文字进行编辑时产生的CBN_EDITCHANGE&&事件,下面就以这两个&&事件为例对其进行讲解,至于其他消息的解决过程可参照其进行。一方面在头文献中给出消息响应&&函数的声明://{{AFX_MSG(CAddToToolBarView)

afx_msgvoidOnSelchangeCombo();//响应CBN_SELCHANGE消息的&&函数

afx_msgvoidOnEditchangeCombo();//响应CBN_EDITCHANGE消息的&&函数

//}}AFX_MSG

然后在实现文献中完毕消息映射:

BEGIN_MESSAGE_MAP(CAddToToolBarView,CView)

//{{AFX_MSG_MAP(CAddToToolBarView)

ON_CBN_SELCHANGE(IDC_COMBOX,OnSelchangeCombo)

ON_CBN_EDITCHANGE(IDC_COMBOX,OnEditchangeCombo)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

最后在消息解决&&函数中完毕对&&事件的解决过程:

voidCAddToToolBarView::OnSelchangeCombo()

{

CStringcs;

CMainFrame*frame=(CMainFrame*)AfxGetMainWnd();

frame->m_combobox.GetLBText(frame->m_combobox.GetCurSel(),cs);

AfxMessageBox(cs);

}

voidCAddToToolBarView::OnEditchangeCombo()

{

CMainFrame*frame=(CMainFrame*)AfxGetMainWnd();

CStringcs;

frame->m_combobox.GetWindowText(cs);

}

从上述解决过程可以看出,对于在工具条上动态创建控件所发出&&事件的响应解决过程同手工解决消息响应的过程是非常相似的。对于其他控件的解决前面关于组合框控件在工具条上动态创建的介绍是比较有代表性的,其他标准控件的解决过程与之相比并没有什么太大的变化,只是由于控件类别的不同而在空间的创建和对控件自身的解决过程上有所不同,其思绪则是完全一致的。下面再给出编辑框在工具条的创建过程。通过对这两段代码的比较可以对控件在工具条的动态创建过程有一个更好的结识:……

//工具条m_wndToolBar的创建代码

……

//设立组合框的宽度,四个参数依次为控件在工具条中的索引号、ID号、风格、宽度

m_wndToolBar.SetButtonInfo(9,IDC_EDIT,TBBS_SEPARATOR,160);

//得到组合框的位置

m_wndToolBar.GetItemRect(9,&rect);

//创建组合框,四个参数依次为窗口风格、组合框位置、父窗口、ID号

m_edit.Create(WS_VISIBLE|WS_TABSTOP,rect,&m_wndToolBar,IDC_EDIT);本文重要通过运用VC的资源视图来先可视化编辑标准控件在工具条中的位置,然后再把标准控件作为工具条的一个子窗口进行动态创建。基于这种思想,可以很方便地在工具条中进行其他类似解决。本文所述代码MicrosoftVisualC++6.0编译通过。三、OpenGL绘图OpenGL的英文全称是“OpenGraphicsLibrary”即“开放的图形程序接口”,它是计算机工业标准应用程序接口,重要用于开发二维和三维图形应用程序。OpenGL是一套底层三维图形API,之所以称之为底层API,是由于它没有提供几何实体图元,不能直接用以描述场景。但通过一些转换程序,可以很方便的将AutoCAD、3DS等图形设计软件制作的DFX和3DS模型文献转换成OpenGL的顶点数据。OpenGL是与硬件无关的软件接口,使用它图形软件生产厂商再不用为各种不同的机型开发设计不同的软件,只要操作系统使用了OpenGL适配器就可以达成相同的效果,它是一个开放图形库,目前在Windows、MacOS、OS/2、Unix/X-Windows等系统下均可使用,且仅在窗口相关部分(系统相关)略有差异,因此具有良好的可移植性,同时调用方法简洁明了,深受好评,应用广泛。OpenGL能在网络环境下以客户机/服务器模式工作,充足发挥集群运算的威力,是专业图形解决、科学计算等高端应用领域的标准图形库。(一)OpenGL基础知识OpenGL是一种开放式的图形软件开发包,它采用C语言风格,提供大量的函数来进行图形方面的解决,一般编程使用的函数库涉及:

OpenGL图形库函数以gl开头,可以实现比较简朴的绘制功能,核心函数共115个。这些函数可以运营在现在任何主流操作系统中。绘制基本几何图元的函数如绘制图元的函数glBegain()、glEnd()、glNormal*()、glVertex*()。矩阵操作、几何变换和投影变换的函数如矩阵入栈函数glPushMatrix()、矩阵出栈函数glPopMatrix()、装载矩阵函数glLoadMatrix()、矩阵相乘函数glMultMatrix(),当前矩阵函数glMatrixMode()和矩阵标准化函数glLoadIdentity(),几何变换函数glTranslate*()、glRotate*()和glScale*(),投影变换函数glOrtho()、glFrustum()和视口变换函数glViewport()等等。颜色、光照和材质的函数如设立颜色模式函数glColor*()、glIndex*(),设立光照效果的函数glLight*()、glLightModel*()和设立材质效果函数glMaterial()等等。显示列表函数重要有创建、结束、生成、删除和调用显示列表的函数glNewList()、glEndList()、glGenLists()、glCallList()和glDeleteLists()纹理映射函数重要有一维纹理函数glTexImage1D()、二维纹理函数glTexImage2D()、设立纹理参数、纹理环境和纹理坐标的函数glTexParameter*()、glTexEnv*()和glTetCoord*()等。特殊效果函数融合函数glBlendFunc()、反走样函数glHint()和雾化效果glFog*()。光栅化、象素操作函数如象素位置glRasterPos*()、线型宽度glLineWidth()、多边形绘制模式glPolygonMode(),读取象素glReadPixel()、复制象素glCopyPixel()等。选择与反馈函数重要有渲染模式glRenderMode()、选择缓冲区glSelectBuffer()和反馈缓冲区glFeedbackBuffer()等。初始化名字栈glInitNames()、压入名字glPushName()),弹出名字glPopName(),替换栈顶的名字glLoadName()曲线与曲面的绘制函数生成曲线或曲面的函数glMap*()、glMapGrid*(),求值器的函数glEvalCoord*()glEvalMesh*()。状态设立与查询函数重要有glGet*()、glEnable()、glGetError()等。OpenGL实用库函数以glu开头,其函数功能更高级一些,如绘制复杂的曲线曲面、高级坐标变换、多边形分割等,共有43个。这些函数可以运营在现在任何主流操作系统中。辅助纹理贴图函数有gluScaleImage()、gluBuild1Dmipmaps()、gluBuild2Dmipmaps()。坐标转换和投影变换函数定义投影方式函数gluPerspective()、gluOrtho2D()、gluLookAt(),拾取投影视景体函数gluPickMatrix(),投影矩阵计算gluProject()和gluUnProject()等等。多边形镶嵌工具有gluNewTess()、gluDeleteTess()、gluTessCallback()、gluBeginPolygon()gluTessVertex()、gluNextContour()、gluEndPolygon()等等。二次曲面绘制工具重要有绘制球面、锥面、柱面、圆环面gluNewQuadric()、gluSphere()、gluCylinder()、gluDisk()、gluPartialDisk()、gluDeleteQuadric()等等。非均匀有理B样条绘制工具重要用来定义和绘制Nurbs曲线和曲面,涉及gluNewNurbsRenderer()、gluNurbsCurve()、gluBeginSurface()、gluEndSurface()、gluBeginCurve()、gluNurbsProperty()等函数。错误反馈工具获取犯错信息的字符串gluErrorString().OpenGL辅助库函数以aux开头,它们是一些特殊的函数,涉及简朴的窗口管理、输入事件解决、某些复杂三维物体绘制等函数,共有31个,此类函数由glaux.dll来负责解释执行。OpenGL中的辅助库不能在所有的OpenGL平台上运营,只能在Win32平台下运营。在跨平台的编程实例和演示中,aux很大限度上已经被glut库取代。窗口初始化和退出函数auxInitDisplayMode()和auxInitPosition()。窗口解决和时间输入函数auxReshapeFunc()、auxKeyFunc()和auxMouseFunc()。颜色索引装入函数auxSetOneColor()。三维物体绘制函数涉及了两种形式网状体和实心体,如绘制立方体auxWireCube()和auxSolidCube()。这里以网状体为例,长方体auxWireBox()、环形圆纹面auxWireTorus()、圆柱auxWireCylinder()、二十面体auxWireIcosahedron()、八面体auxWireOctahedron()、四周体auxWireTetrahedron()、十二面体auxWireDodecahedron()、圆锥体auxWireCone()和茶壶auxWireTeapot()。背景过程管理函数auxIdleFunc()。程序运营函数auxMainLoop()。OpenGL实用工具开发库函数以glut开头,它们提供更为复杂的绘制功能,比aux功能强大,此类函数由glut.dll来负责解释执行。窗口操作函数窗口初始化、窗口大小、窗口位置等函数glutInit()glutInitDisplayMode()glutInitWindowSize()glutInitWindowPosition()等。回调函数响应刷新消息、键盘消息、鼠标消息、定期器函数等,GlutDisplayFunc()glutPostRedisplay()glutReshapeFunc()glutTimerFunc()glutKeyboardFunc()glutMouseFunc()。创建复杂的三维物体这些和aux库的函数功能相同。创建网状体和实心体。如glutSolidSphere()、glutWireSphere()等。在此不再叙述。菜单函数创建添加菜单的函数GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu()和glutAttachMenu()。程序运营函数glutMainLoop()。Windows专用函数库以wgl开头,负责OpenGL与Windows窗口系统的连接,共有6个。

Win32函数无专用前缀,事实上为API函数,共5个,用来解决比如象素格式的选择及双缓冲等功能。

OpenGL提供的函数一般是以客户机/服务器的模式来运营的,即执行绘制图形功能的应用程序作为客户机,而OpenGL函数库(事实上是一些动态链接库,比如opengl32.dll,glu.dll等)作为服务器,当应用程序发出绘制请求时,服务器负责对这些绘制请求进行解释,然后把这些解决过的请求发送给图形显示硬件,这样就实现了绘图的目的。此外由于它这种特有的运营机制也实现了网络的透明性,即当应用程序与核心图形库不在同一台机器上时,其程序的代码完全跟它们在同一台机器上的同样,节约了通讯开销。

那么在Windows操作平台下,如何使用OpenGL图形库函数来开发应用程序呢?我们知道,使用GDI(图形设备接口)开发应用程序时,一方面需要获得一个DeviceContext(设备描述表,简称DC),然后才干在这个DC下完毕绘图工作,这一过程就类似于现实生活中纸和笔的关系,DC就是纸,而象刷子、画笔这样的GDI对象就是笔。从Windows内部运营机制来分析,DC应当理解为状态保持器,就是它可以并且必须保存当前系统的状态,这些状态涉及:当前的画笔、刷子等GDI的具体类型(颜色、粗细等),当前的调色板类型以及系统的其他信息。当用户开始在DC上进行绘制工作时,系统就会先查看DC中相应的当前状态值,然后运用这些状态值进行图形绘制,假如用户希望改变当前状态值,那么可以通过SelectObject这样的Win32函数来将指定的状态或者对象选入DC即可。

事实上基于OpenGL的应用程序也是这样的,只是这里不是直接在DC上进行绘制工作,而是通过RenderContext(渲染描述表或者绘制描述表,简称为RC)这样一个桥梁在DC上进行绘制工作,对于程序来说事实上可以理解为就是在RC上绘制图形。此外只要RC不被释放(有效),那么就可以进行绘制工作;相比之下,DC却需要不断的创建和释放。

所以要使用OpenGL图形库进行图形应用开发,一方面要获得RC,然后要将其设立为“当前RC”,后面所有的绘制工作都是在“当前RC”下面进行的,直到“当前RC”无效为止。(二)VC环境下的OpenGL的程序框架在目前众多的Windows应用程序开发工具中,微软公司的VC6.0已经成为OpenGL图形应用的首选开发工具。而要使用OpenGL图形库来开发2D/3D的应用程序,就必须解决程序框架的问题。由前面介绍的基础知识可以清楚的看到,不能直接象运用GDI开发图形程序那样使用OpenGL,下面简朴地介绍一下VC环境中单文档应用程序情况下的开发框架,其环节为:1.使用VC中MFCAppWizard创建应用程序框架,在文档和视图类中,视图负责窗口中内容的显示,因此所有的OpenGL绘制工作应放在视图类中进行;2.在stdafx.h中添加OpenGL头文献#include"gl/gl.h"#include"gl/glu.h"#include"gl/glaux.h"选择菜单ProjectSettings(Alt+F7)Link,在Object/librarymodules中添加OpenGL库文献opengl32.libglu32.libglaux.lib也可以在stdafx.h中用以下语句在程序中添加#pragmacomment(lib,"opengl32.lib") //OpenGL32连接库#pragmacomment(lib,"glu32.lib") //GLu32连接库#pragmacomment(lib,"glaux.lib") //GLaux连接库3.

选择菜单ViewClassWizard(Ctrl+W),运用ClassWizard给视图类添加如下成员函数响应WM_CR

温馨提示

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

评论

0/150

提交评论