版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《计算机图形学》实验指导书郗润平编制西北工业大学计算机学院二○一一年四月修订说明依照我院《计算机图形学》教学大纲规定及课堂教学内容,参阅其他院校本课程教学与实验课内容,并结合学生和实验室状况,特编制本实验指引书供学生在上机实验学时参照使用。本实验大纲择选与课程教学较为密切若干实验,每个实验分别给出了参照机时数,实验时可依照详细机时安排状况选做。在附录中简朴地简介了OpenGL和DirectX3D两个三维图形开发平台基本概念和有关重要函数,供感兴趣同窗入门学习参照使用。XRP于.3.15补充了MFC中几种惯用DC使用阐明等;(附录二1314)补充了VC下OpenGL编程框架细节。(附录三)于.4.24补充MFC菜单使用;(附录二10)补充了对话框使用;(附录二11)鼠标拾取点示例。(附录二12)于.4.26补充了工具条使用(附录二13) 于.3.14增长三(二)9修改OnEraseBkgnd()函数,禁止重绘背景,避免动画时闪烁。 于Sydney.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是MFCDC一种类,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_CREATE消息OnCreate函数;响应WM_SIZE消息OnSize函数;响应WM_DESTROY消息OnDestroy函数;响应WM_ERASEBKGND消息OnEraseBKgnd函数;重载OnInitialUpdate函数。并在视图类头文献中添加如下两公有变量成员 CDC*m_pDC; //OpenGL设备描述表 HGLRCm_hRC; //OpenGL绘制描述表4.一方面在视图类PreCreateWindow函数内设立窗口类型,为子窗口或兄弟窗口裁剪客户区,防止在窗口重叠时把图形绘制到子窗口和兄弟窗口。实当代码如下:cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;5.然后在视图类OnCreate函数下面进行OpenGL初始化工作,这某些是此框架里最重要代码,详细涉及:获取视图设备描述表、设立适当象素格式和调色板、创立绘制描述表并将其设立为当前RC。这某些代码基本上所有程序都一致,这一步完毕后即可进行图形绘制工作。其实当代码见下intCTerrainTestView::OnCreate(LPCREATESTRUCTlpCreateStruct)
{ m_pDC=newCClientDC(this);//获取客户区设备描述表 //初始化象素格式以及选用适当格式来创立RC PIXELFORMATDESCRIPTORpfd={ sizeof(PIXELFORMATDESCRIPTO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论