欢迎访问 Forcal程序设计

OpenFcGl V5.0 使用说明

目 录

1 概述 2 OpenGl简介 3 OpenFcGl的图形输出及坐标系统 4 OpenFcGl的源程序基本格式 5 例子 6 显示列表与实体模块 | 7 函数概述 8 gl函数 9 glu函数 10 gle函数 11 fg函数

1 概述 [返回页首]

OpenFcGl32W.dll是一个基于OpenGL的Forcal扩展动态库。

OpenFcGl试图输出OpenGl的绝大部分函数并加以扩展（目前仅进行了部分工作），使之能方便地绘制三维图形。

OpenFcGl中的函数目前有四种：以gl开头的是OpenGl32中的标准OpenGl函数；以glu开头的是glu32中的辅助OpenGl函数；以gle开头的是为方便与OpenGl和绘图窗口交互而扩展的函数；以fg开头的是OpenFcGl扩展的实用绘图函数，目前主要是一些绘制数学函数图形的函数。OpenFcGl努力保证这些函数在运行时的安全性，即无论以何种顺序使用这些函数，程序都不会崩溃（这也是所有forcal二级函数应具有的特点），但用户应该知道：只有正确地使用这些函数，才能充分发挥它们的性能。充分了解每一个要使用的函数的性能是非常必要的。

OpenFcGl中绝大多数的OpenGl函数（以gl或glu开头）的用法与在OpenGl中完全相同，但也有少数函数不一样，在使用中要主要这些差别。

2 OpenGl简介 [返回页首]

OpenGL是近几年发展起来的一个性能卓越的三维图形标准，它是在SGI等多家世界闻名的计算机公司的倡导下，以SGI的GL三维图形库为基础制定的一个通用共享的开放式三维图形标准。目前，包括Microsoft、SGI、IBM、DEC、SUN、HP等大公司都采用了OpenGL做为三维图形标准，许多软件厂商也纷纷以OpenGL为基础开发出自己的产品，其中比较著名的产品包括动画制作软件Soft Image和3D Studio MAX、仿真软件Open Inventor、VR软件World Tool Kit、CAM软件ProEngineer、GIS软ARC/INFO等等。值得一提的是，随着Microsoft公司在Windows NT和最新的Windows 95中提供了OpenGL标准及OpenGL三维图形加速卡的推出，OpenGL将在微机中有广泛地应用，同时也为广大用户提供了在微机上使用以前只能在高性能图形工作站上运行的各种软件的机会。

3 OpenFcGl的图形输出及坐标系统 [返回页首]

3.1 OpenGL的屏幕坐标与函数自变量的变化范围
坐标的中心在屏幕中心，X轴由左向右，Y轴由下向上，Z轴由里向外（屏幕以里为负值，屏幕以外为正值）,三个坐标轴组成右手坐标系。注意：图象必须被绘制在屏幕里面才能够看到。
通常，屏幕坐标与函数自变量的变化范围并不一致，例如函数：z(x,y)=x+y，x取[-3,3]，y取[-3,3]，则z的取值范围为[-6,6]。可以将该函数的图象绘制在屏幕的任何位置，例如：X[0,10]，Y[0,10]，Z[-10,-20]。
3.2 用键盘移动屏幕坐标
→：坐标原点沿X轴正向向右移动；
←：坐标原点沿X轴负向向左移动；
↑：坐标原点沿Y轴正向向上移动；
↓：坐标原点沿Y轴负向向下移动；
PageUp： 坐标原点沿Z轴负向向里移动；
PageDown：坐标原点沿Z轴正向向外移动；
Home：坐标复位。
3.3 用键盘使图象旋转
在OpenFcGl中设置了三个可由键盘操纵的数，这三个数可由函数gleAngle[i]获得，使用这三个数并与函数glRotated[...]配合可使图象产生旋转。
Shift + →： 使gleAngle[1]值增加；
Shift + ←： 使gleAngle[1]值减少；
Shift + ↑： 使gleAngle[2]值增加；
Shift + ↓： 使gleAngle[2]值减少；
Shift + PageUp： 使gleAngle[3]值减少；
Shift + PageDown： 使gleAngle[3]值增加；
Shift + Home： 使gleAngle[i]值为0。
在每一个绘图单元前加上以下代码，可用键盘操纵图象沿X、Y、Z轴旋转：
glRotated[gleAngle(1),1,0,0]; //使图象沿X轴旋转
glRotated[gleAngle(2),0,1,0]; //使图象沿Y轴旋转
glRotated[gleAngle(3),0,0,1]; //使图象沿Z轴旋转

3.4 看不到绘制的图象怎么办
连续按PageUp键，使图象往屏幕里移动，即可看到图象。

4 OpenFcGl的源程序基本格式 [返回页首]

通常，使用MForcal的源程序格式书写OpenFcGl的源程序。建议使用以下基本格式：

> gleDrawScene(HFor("Draw")),stop(); //（1）启动场景绘制，就退出
> //... ... //（2）一些函数定义
> initScene()= //（3）定义初始化函数
> {
> gleClear() //（4）清理已经不再使用的空间
> //在这里放置初始化代码
> };
> Draw()= //（5）场景绘制函数
> {
> if[gleIsInitScene(),initScene()], //（6）需要初始化场景时，就执行初始化函数
> glClear[], //（7）清除屏幕以及深度缓存
> glLoadIdentity[], //（8）重置视图
> glTranslated[0,0,-20], //（9）移动坐标，向屏幕里移动20个单元
> glColor3d[1,0,0], //（10）设置颜色
> glePrint["Hello OpenFcGl !"] //（11）绘制英文字符串
> };

说明：

（1）先通过函数 gleDrawScene(HFor("Draw"))将场景绘制函数"Draw"的句柄告诉OpenFcGl，然后用 stop()结束该模块的执行。通过场景绘制函数，OpenFcGl会执行该模块的其余部分。

（2）可以在这里定义一些要用到的函数。

（3）自定义初始化函数 initScene()，仅在需要时定义该函数。

（4）清理已经不再使用的空间，这些空间是以前绘图时申请的，重新绘图时，这些空间已经成为垃圾。如果有此语句，必须为初始化函数代码的第一个语句。

（5）自定义场景绘制函数 Draw()，该函数的代码会被OpenFcGl循环执行。

（6）这句仅在设置了初始化函数时添加，如果有此语句，必须为场景绘制代码的第一个语句。其中 gleIsInitScene()用于判断是否需要对场景进行初始化。

（7）从这一句开始，场景绘制才真正开始。此语句不可缺少，必须放在真正场景绘制代码的最前面。注意 glClear()与前面的 gleClear()是不一样的。

（8）、（9）、（10）、（11）语句组成了一个绘图单元。第（8）语句通常为每一个绘图单元的第一句，其功能是将绘图的起点重新设置到预定的初始位置。其余各句请参考源代码中的说明，不赘述。

5 例子 [返回页首]

5.1 一元函数图象

> (::hF)= hF=HFor("f"); //获得函数f的句柄，保存在模块变量hF中

> gleDrawScene[HFor("Scene")],stop(); //设置场景绘制函数后退出
> f(x)=x*sin[x]; //一元函数定义
> Scene(::hF)=
> {
> glClear[], //清除屏幕以及深度缓存
> glLoadIdentity[], //重置视图
> glTranslated[0,0,-10], //移动坐标，向屏幕里移动10个单元
> glColor3d[1,0,0], //设置颜色
> fgPlot[hF,-10,10,FG_AXES,-3,3,-2,2] //绘制一元函数图象
> };

5.2 二元函数图象

> gleDrawScene[HFor("Scene")],stop(); //设置场景绘制函数后退出
> f(x,y)=(x^2-2*x)*exp(-(x^2)-y^2-x*y);
> (::Rot)=Rot=0; //定义自动常量
> Scene(::Rot)=
> {
> glClear[],
> glLoadIdentity[],
> glTranslated[0,0,-20],
> glColor3d[0,1,0], //设置颜色
> glRotated[Rot++,1,1,1], //使图象连续旋转
> fgPlot3d[HFor("f"),-3,3,-3,3]
> };

5.3 可用键盘移动、旋转的二元函数图象

> gleDrawScene[HFor("Scene")],stop(); //设置场景绘制函数后退出
> f(x,y)=sin[sqrt(x*x+y*y)];
> initScene()= //定义初始化函数
> {
> gleAngle(90,180,90) //设置重置视图初始位置
> };
> Scene()= //场景绘制函数
> {
> if[gleIsInitScene(),initScene()], //需要初始化场景时，就执行初始化函数
> glClear[],
> glColor3d[1,0,0], //设置颜色
> gleAxesAngle[], //显示坐标和旋转角度
> glLoadIdentity[],
> glTranslated[0,0,-20],
> glColor3d[0,1,0], //设置颜色
> glRotated[gleAngle(1),1,0,0], //使图象沿X轴旋转
> glRotated[gleAngle(2),0,1,0], //使图象沿Y轴旋转
> glRotated[gleAngle(3),0,0,1], //使图象沿Z轴旋转
> fgPlot3d[HFor("f"),-5,5,-5,5,FG_NOMESH]
> };

5.4 制作彩色旋转的金字塔和正方体

> gleDrawScene[HFor("Scene")],stop(); // 设置场景绘制函数后退出
> (::yRot,xyzRot)=yRot=0,xyzRot=0;
> Scene(::yRot,xyzRot)=
> {
> glClear[], // 清屏和清除深度缓冲区
> glLoadIdentity(), // 重置当前Modelview矩阵
> glTranslated(-1.5,0.0,-6.0), // 向左移动1.5个单元、向屏幕里移动6.0个单元
> glRotated(yRot,0,1,0), // 在Y轴旋转金字塔
> glBegin(GL_TRIANGLES), // 开始绘制一个三角形
> glColor3d(1.0,0.0,0.0), // 红
> glVertex3d( 0.0, 1.0, 0.0), // 顶（前面）
> glColor3d(0.0,1.0,0.0), // 绿
> glVertex3d(-1.0,-1.0, 1.0), // 左（前面）
> glColor3d(0.0,0.0,1.0), // 蓝
> glVertex3d( 1.0,-1.0, 1.0), // 右（前面）
> glColor3d(1.0,0.0,0.0), // 红
> glVertex3d( 0.0, 1.0, 0.0), // 顶（右面）
> glColor3d(0.0,0.0,1.0), // 蓝
> glVertex3d( 1.0,-1.0, 1.0), // 左（右面）
> glColor3d(0.0,1.0,0.0), // 绿
> glVertex3d( 1.0,-1.0, -1.0), // 右（右面）
> glColor3d(1.0,0.0,0.0), // 红
> glVertex3d( 0.0, 1.0, 0.0), // 顶（后面）
> glColor3d(0.0,1.0,0.0), // 绿
> glVertex3d( 1.0,-1.0, -1.0), // 左（后面）
> glColor3d(0.0,0.0,1.0), // 蓝
> glVertex3d(-1.0,-1.0, -1.0), // 右（后面）
> glColor3d(1.0,0.0,0.0), // 红
> glVertex3d( 0.0, 1.0, 0.0), // 顶（左面）
> glColor3d(0.0,0.0,1.0), // 蓝
> glVertex3d(-1.0,-1.0,-1.0), // 左（左面）
> glColor3d(0.0,1.0,0.0), // 绿
> glVertex3d(-1.0,-1.0, 1.0), // 右（左面）
> glEnd(), // 完成金字塔的绘制
> glLoadIdentity(), // 重置当前Modelview矩阵
> glTranslated(1.5,0.0,-7.0), // 向右移动个1.5单元向屏幕里移动7个单元
> glRotated(xyzRot,1,1,1), // 在X、Y、Z轴转动正方体
> glBegin(GL_QUADS), // 绘制一个正方体
> glColor3d(0.0,1.0,0.0), // 设置蓝色
> glVertex3d( 1.0, 1.0,-1.0), // 右上（顶面）
> glVertex3d(-1.0, 1.0,-1.0), // 左上（顶面）
> glVertex3d(-1.0, 1.0, 1.0), // 左下（顶面）
> glVertex3d( 1.0, 1.0, 1.0), // 右下（顶面）
> glColor3d(1.0,0.5,0.0), // 设置橘红色
> glVertex3d( 1.0,-1.0, 1.0), // 右上（底面）
> glVertex3d(-1.0,-1.0, 1.0), // 左上（底面）
> glVertex3d(-1.0,-1.0,-1.0), // 左下（底面）
> glVertex3d( 1.0,-1.0,-1.0), // 右下（底面）
> glColor3d(1.0,0.0,0.0), // 设置红色
> glVertex3d( 1.0, 1.0, 1.0), // 右上（前面）
> glVertex3d(-1.0, 1.0, 1.0), // 左上（前面）
> glVertex3d(-1.0,-1.0, 1.0), // 左下（前面）
> glVertex3d( 1.0,-1.0, 1.0), // 右下（前面）
> glColor3d(1.0,1.0,0.0), // 设置黄色
> glVertex3d( 1.0,-1.0,-1.0), // 右上（后面）
> glVertex3d(-1.0,-1.0,-1.0), // 左上（后面）
> glVertex3d(-1.0, 1.0,-1.0), // 左下（后面）
> glVertex3d( 1.0, 1.0,-1.0), // 右下（后面）
> glColor3d(0.0,0.0,1.0), // 设置蓝色
> glVertex3d(-1.0, 1.0, 1.0), // 右上（左面）
> glVertex3d(-1.0, 1.0,-1.0), // 左上（左面）
> glVertex3d(-1.0,-1.0,-1.0), // 左下（左面）
> glVertex3d(-1.0,-1.0, 1.0), // 右下（左面）
> glColor3d(1.0,0.0,1.0), // 设置紫蓝色
> glVertex3d( 1.0, 1.0,-1.0), // 右上（右面）
> glVertex3d( 1.0, 1.0, 1.0), // 左上（右面）
> glVertex3d( 1.0,-1.0, 1.0), // 左下（右面）
> glVertex3d( 1.0,-1.0,-1.0), // 右下（右面）
> glEnd(), // 完成正方体绘制
> yRot=yRot+0.2, // 增加三角形的旋转变量
> xyzRot=xyzRot-0.15 // 减小矩形的旋转变量
> };

5.5 晶体

> /////////////////////////////////////////////////////////////////////
> /////// 请修改用户定义部分。若没有特殊的需要，其他部分无需修改
> /////////////////////////////////////////////////////////////////////
> //#LOAD{"dll\openfcgl32W"} //本程序由OpenFcGl32W.dll提供支持
> gleDrawScene(HFor("Scene")),stop(); //启动场景绘制，就退出
> //让图形随鼠标移动。factor为比例因子，factor越大则移动幅度越大。factor=0进行初始化。
> fcglFollowMouse(factor:x,y,xx,yy,xxx,yyy:fcglFollowMouse,xMouse,yMouse)=
> {
> if[!factor,fcglFollowMouse=0,return(0)],
> if[gleGetMouseMsg(WM_LBUTTONDOWN,&x,&y),fcglFollowMouse=1,xMouse=x,yMouse=y],
> gleGetWindowSize[&xxx,&yyy],
> if[fcglFollowMouse,gleGetMouseMsg(WM_MOUSEMOVE,&xx,&yy),gleAngle[1,gleAngle(1)+(yy-yMouse)/yyy*factor],gleAngle[2,gleAngle(2)+(xx-xMouse)/xxx*factor]],
> if[gleGetMouseMsg(WM_LBUTTONUP,&xx,&yy),fcglFollowMouse=0],
> glRotated[gleAngle(1),1,0,0], //使图象沿X轴旋转
> glRotated[gleAngle(2),0,1,0], //使图象沿Y轴旋转
> glRotated[gleAngle(3),0,0,1] //使图象沿Z轴旋转
> };
> //x,y,z为要获得的屏幕坐标，需要引用参数&调用。
> //i,j,k为点阵坐标。
> //a,b,c,Alpha,Beta,Gamma为点阵的6个参数。
> //规定：点阵原点即屏幕原点，点阵a轴即屏幕x轴，点阵b轴在屏幕x,y轴决定的平面内。
> fcglTransCrystalAxis(x,y,z,i,j,k,a,b,c,Alpha,Beta,Gamma:_Alpha,_Beta,_Gamma,m)=
> {
> _Alpha=Alpha/180*3.1415926, _Beta=Beta/180*3.1415926, _Gamma=Gamma/180*3.1415926,
> x=i*a+j*b*cos(_Gamma)+k*c*cos(_Beta),
> m=[cos(_Alpha)^2+cos(_Beta)^2]/[1+cos(_Gamma)],
> y=j*b*sin(_Gamma)+k*c*sqrt[m-cos(_Beta)^2],
> z=k*c*sqrt[1-m]
> };
> //绘制连接两个点阵点的线段。
> fcglCrystalLine(i1,j1,k1,i2,j2,k2,a,b,c,Alpha,Beta,Gamma:x,y,z)=
> {
> glBegin(GL_LINES),
> fcglTransCrystalAxis(&x,&y,&z,i1,j1,k1,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,i2,j2,k2,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> glEnd()
> };
> //绘制点阵平面，按逆时针输入坐标。
> fcglCrystalQuads(i1,j1,k1,i2,j2,k2,i3,j3,k3,i4,j4,k4,a,b,c,Alpha,Beta,Gamma:x,y,z)=
> {
> glBegin(GL_QUADS),
> fcglTransCrystalAxis(&x,&y,&z,i1,j1,k1,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,i2,j2,k2,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,i3,j3,k3,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,i4,j4,k4,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> glEnd()
> };
> ///////////////////////////////////////////////////////////////////////////////////////////
> // 用 户 定 义 开 始
> ///////////////////////////////////////////////////////////////////////////////////////////
> DrawCellEdge(a,b,c,Alpha,Beta,Gamma,EdgeR,EdgeG,EdgeB)= //绘制晶胞晶棱的函数
> {
> glColor3d[EdgeR,EdgeG,EdgeB],
> fcglCrystalLine(0,0,0,0,1,0,a,b,c,Alpha,Beta,Gamma),
> fcglCrystalLine(0,1,0,0,1,1,a,b,c,Alpha,Beta,Gamma),
> fcglCrystalLine(0,1,1,0,0,1,a,b,c,Alpha,Beta,Gamma),
> fcglCrystalLine(0,0,1,0,0,0,a,b,c,Alpha,Beta,Gamma),
> fcglCrystalLine(0,0,0,1,0,0,a,b,c,Alpha,Beta,Gamma),
> fcglCrystalLine(1,0,0,1,0,1,a,b,c,Alpha,Beta,Gamma),
> fcglCrystalLine(1,0,1,0,0,1,a,b,c,Alpha,Beta,Gamma),
> fcglCrystalLine(1,0,0,1,1,0,a,b,c,Alpha,Beta,Gamma),
> fcglCrystalLine(1,1,0,0,1,0,a,b,c,Alpha,Beta,Gamma),
> fcglCrystalLine(1,1,0,1,1,1,a,b,c,Alpha,Beta,Gamma),
> fcglCrystalLine(1,0,1,1,1,1,a,b,c,Alpha,Beta,Gamma),
> fcglCrystalLine(1,1,1,0,1,1,a,b,c,Alpha,Beta,Gamma)
> };
> DrawCellDot(::Ball)= //绘制顶点的函数
> {
> gluSphere[Ball,0.1,10,10]
> };
> DrawCellApex(a,b,c,Alpha,Beta,Gamma,ApexR,ApexG,ApexB:x,y,z)= //绘制晶胞顶点
> {
> glColor3d[ApexR,ApexG,ApexB],
> fcglTransCrystalAxis(&x,&y,&z,0,0,0,a,b,c,Alpha,Beta,Gamma),glTranslated[x,y,z],gleCalFor("DrawCellDot"),glTranslated[-x,-y,-z],
> fcglTransCrystalAxis(&x,&y,&z,0,0,1,a,b,c,Alpha,Beta,Gamma),glTranslated[x,y,z],gleCalFor("DrawCellDot"),glTranslated[-x,-y,-z],
> fcglTransCrystalAxis(&x,&y,&z,0,1,0,a,b,c,Alpha,Beta,Gamma),glTranslated[x,y,z],gleCalFor("DrawCellDot"),glTranslated[-x,-y,-z],
> fcglTransCrystalAxis(&x,&y,&z,0,1,1,a,b,c,Alpha,Beta,Gamma),glTranslated[x,y,z],gleCalFor("DrawCellDot"),glTranslated[-x,-y,-z],
> fcglTransCrystalAxis(&x,&y,&z,1,0,0,a,b,c,Alpha,Beta,Gamma),glTranslated[x,y,z],gleCalFor("DrawCellDot"),glTranslated[-x,-y,-z],
> fcglTransCrystalAxis(&x,&y,&z,1,0,1,a,b,c,Alpha,Beta,Gamma),glTranslated[x,y,z],gleCalFor("DrawCellDot"),glTranslated[-x,-y,-z],
> fcglTransCrystalAxis(&x,&y,&z,1,1,0,a,b,c,Alpha,Beta,Gamma),glTranslated[x,y,z],gleCalFor("DrawCellDot"),glTranslated[-x,-y,-z],
> fcglTransCrystalAxis(&x,&y,&z,1,1,1,a,b,c,Alpha,Beta,Gamma),glTranslated[x,y,z],gleCalFor("DrawCellDot"),glTranslated[-x,-y,-z]
> };
> //绘制晶胞（晶棱及顶点）。不要在绘制晶棱及顶点的函数中使用显示列表。
> //a,b,c,Alpha,Beta,Gamma：晶胞参数。EdgeR,EdgeG,EdgeB：晶棱颜色。ApexR,ApexG,ApexB：顶点颜色。
> //该函数在显示列表中绘制图形，返回一个显示列表序号。
> //在初始化场景时调用该函数，在场景绘制代码中执行该函数返回的显示列表。
> DrawCrystalCell(a,b,c,Alpha,Beta,Gamma,EdgeR,EdgeG,EdgeB,ApexR,ApexG,ApexB:x,y,z,list)=
> {
> list=glGenLists[1],
> glNewList[list,GL_COMPILE],
> DrawCellEdge(a,b,c,Alpha,Beta,Gamma,EdgeR,EdgeG,EdgeB), //绘制晶胞晶棱
> DrawCellApex(a,b,c,Alpha,Beta,Gamma,ApexR,ApexG,ApexB), //绘制晶胞顶点
> glEndList[],
> list
> };
> initScene(::MouseSpeed,Centre,CellX,CellY,CellZ, //初始化函数
> CellA,CellB,CellC,CellAlpha,CellBeta,CellGamma,EdgeR,EdgeG,EdgeB,ApexR,ApexG,ApexB,Ball)=
> {
> gleClear(),
> Ball=gluNewQuadric[], gluQuadricDrawStyle[Ball,GLU_FILL],gluQuadricNormals[Ball,GLU_SMOOTH],
> gleAxis(0,0,-12),gleAngle(0,0,0), //设置图形初始位置
> MouseSpeed=2, //鼠标移动速度
> Centre=0, //0：点阵原点在屏幕中心；其他值：点阵中心在屏幕中心
> CellX=3, CellY=3, CellZ=3, //X,Y,Z方向晶胞个数
> ApexR=1, ApexG=0, ApexB=1, //晶胞顶点颜色
> CellA=1, CellB=1 ,CellC=1, CellAlpha=90, CellBeta=90, CellGamma=120, //晶胞参数
> EdgeR=0, EdgeG=1, EdgeB=0 //晶胞晶棱颜色
> };
> ///////////////////////////////////////////////////////////////////////////////////////////
> // 用 户 定 义 结 束
> ///////////////////////////////////////////////////////////////////////////////////////////
> Scene(:i,j,k,x,y,z:listDrawCrystalCell,MouseSpeed,Centre,CellX,CellY,CellZ,
> CellA,CellB,CellC,CellAlpha,CellBeta,CellGamma,EdgeR,EdgeG,EdgeB,ApexR,ApexG,ApexB)=
> {
> if{ gleIsInitScene(), //需要初始化场景时，就执行初始化函数
> initScene(),
> listDrawCrystalCell=DrawCrystalCell(CellA,CellB,CellC,CellAlpha,CellBeta,CellGamma,EdgeR,EdgeG,EdgeB,ApexR,ApexG,ApexB),
> fcglFollowMouse(0)
> },
> if{ gleVirtualKey(116), //按F5时，重置参数
> gleVirtualKey(116,0),
> gleReSetPara
> { "鼠标移动速度", &MouseSpeed,
> "0：点阵原点在屏幕中心；其他值：点阵中心在屏幕中心", &Centre,
> "X方向晶胞个数", &CellX,
> "Y方向晶胞个数", &CellY,
> "Z方向晶胞个数", &CellZ,
> "晶胞参数之 a", &CellA,
> "晶胞参数之 b", &CellB,
> "晶胞参数之 c", &CellC,
> "晶胞参数之 α", &CellAlpha,
> "晶胞参数之 β", &CellBeta,
> "晶胞参数之 γ", &CellGamma,
> "晶胞晶棱颜色之 Red", &EdgeR,
> "晶胞晶棱颜色之 Green", &EdgeG,
> "晶胞晶棱颜色之 Blue", &EdgeB,
> "晶胞顶点颜色之 Red", &ApexR,
> "晶胞顶点颜色之 Green", &ApexG,
> "晶胞顶点颜色之 Blue", &ApexB
> },
> glDeleteLists(listDrawCrystalCell,1),
> listDrawCrystalCell=DrawCrystalCell(CellA,CellB,CellC,CellAlpha,CellBeta,CellGamma,EdgeR,EdgeG,EdgeB,ApexR,ApexG,ApexB)
> },
> glClear[], //清除屏幕以及深度缓存
> glColor3d[1,0,0],
> gleAxesAngle[], //显示屏幕坐标及旋转角度
> glLoadIdentity[], //重置视图
> fcglFollowMouse(MouseSpeed), //鼠标跟随
> //按F4时，显示帮助
> if[gleVirtualKey(115),gleVirtualKey(115,0),gleMessageBox("按下鼠标左键，图形将随鼠标移动，放开鼠标左键，图形停止移动。\r\n按F5进行参数设置。","图形演示说明",64)],
> if[Centre,glTranslated(-CellX/2,-CellY/2,-CellZ/2)],
> i=0,
> while{ i<CellX,j=0,
> while{ j<CellY,k=0,
> while{ k<CellZ,
> fcglTransCrystalAxis(&x,&y,&z,i,j,k,CellA,CellB,CellC,CellAlpha,CellBeta,CellGamma),
> glTranslated[x,y,z], //移动坐标
> glCallList[listDrawCrystalCell], //绘制图形
> glTranslated[-x,-y,-z], //恢复坐标
> k++
> },
> j++
> },
> i++
> }
> };

6 显示列表与实体模块 [返回页首]

OpenGl显示列表是一组预先存储起来的OpenGl命令。显示列表可以在任何地方被调用，并按顺序立即执行。显示列表是经过编译的，因而执行效率比较高。

要应用显示列表，首先应创建一个显示列表（创建显示列表要在初始化函数中进行），由glNewList()函数和glEndList()函数来完成。执行显示列表的函数是glCallList()函数或glCallLists()函数。管理和使用显示列表的函数还有glListBase()、glGenLists()和glDeleteLists()等函数。

使用显示列表的例子：[1]、[2]、[3]。

尽管显示列表给应用程序提供了一个提高整体性能的机制，但并不能任意使用显示列表。因为启动显示列表需要一定的开销，如果这种开销不能被执行命令的开销所抵消，那就适得其反了。显示列表可以应用于：

第一，由大量的数据构造的几何模型，且是多次被调用或是几何模型要发生运行。

第二，较高维数的矩阵操作。在图形学算法中，需要涉及大量的矩阵运算，特别是矩阵求逆运算。

第三，光栅位图、图像和纹理操作。应用显示列表可调整像素数据，使其适合硬件处理的格式。

第四，光照计算。光照具有十分复杂的数学运算，如果场景中不同材质的物体较多且需要变化，把材质放入显示列表中，能发挥显示列表的优势。

第五，OpenGl使用库中标准二次曲面、Bezier曲线及曲面、NURBS曲线及曲面的绘制等等。

使用显示列表要注意以下事项：

第一，显示列表中所有函数的参数是当前的，不会受今后变化的影响。

第二，封装在显示列表中的变换操作会对后继绘图产生影响。

第三，显示列表不可对其进行外部干预。

第四，显示列表需要精心管理。

第五，不能在显示列表中使用的函数有：glIsList()，glGenLists()，glDeleteLists()，glFeedbackBuffer()，glSelectBuffer()，glRenderMode()，glFlush()，glFinish()，glIsEnabled()，glGet()。

实体模块是用OpenGl命令绘制任意实体的MForcal的模块源程序。模块写好后，一般不需改动，仅在需要时调用即可。显然，在模块中使用显示列表创建实体是非常方便的。

例如，下面的程序可作为模块来使用，可在任意的场景绘制单元中加入鼠标支持：

> //让图形随鼠标移动。factor为比例因子，factor越大则移动幅度越大。factor=0进行初始化。
> ~fcglFollowMouse(factor:x,y,xx,yy,xxx,yyy:fcglFollowMouse,xMouse,yMouse)=
> {
> if[!factor,fcglFollowMouse=0,return(0)],
> if[gleGetMouseMsg(WM_LBUTTONDOWN,&x,&y),fcglFollowMouse=1,xMouse=x,yMouse=y],
> gleGetWindowSize[&xxx,&yyy],
> if[fcglFollowMouse,gleGetMouseMsg(WM_MOUSEMOVE,&xx,&yy),gleAngle[1,gleAngle(1)+(yy-yMouse)/yyy*factor],gleAngle[2,gleAngle(2)+(xx-xMouse)/xxx*factor]],
> if[gleGetMouseMsg(WM_LBUTTONUP,&xx,&yy),fcglFollowMouse=0],
> glRotated[gleAngle(1),1,0,0], //使图象沿X轴旋转
> glRotated[gleAngle(2),0,1,0], //使图象沿Y轴旋转
> glRotated[gleAngle(3),0,0,1] //使图象沿Z轴旋转
> };

再如，下面的模块可用在晶体图的绘制中：

> //x,y,z为要获得的屏幕坐标，需要引用参数&调用。
> //i,j,k为点阵坐标。
> //a,b,c,Alpha,Beta,Gamma为点阵的6个参数。
> //规定：点阵原点即屏幕原点，点阵a轴即屏幕x轴，点阵b轴在屏幕x,y轴决定的平面内。
> ~fcglTransCrystalAxis(x,y,z,i,j,k,a,b,c,Alpha,Beta,Gamma:_Alpha,_Beta,_Gamma,m)=
> {
> _Alpha=Alpha/180*3.1415926, _Beta=Beta/180*3.1415926, _Gamma=Gamma/180*3.1415926,
> x=i*a+j*b*cos(_Gamma)+k*c*cos(_Beta),
> m=[cos(_Alpha)^2+cos(_Beta)^2]/[1+cos(_Gamma)],
> y=j*b*sin(_Gamma)+k*c*sqrt[m-cos(_Beta)^2],
> z=k*c*sqrt[1-m]
> };
> //绘制连接两个点阵点的线段。
> ~fcglCrystalLine(i1,j1,k1,i2,j2,k2,a,b,c,Alpha,Beta,Gamma:x,y,z)=
> {
> glBegin(GL_LINES),
> fcglTransCrystalAxis(&x,&y,&z,i1,j1,k1,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,i2,j2,k2,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> glEnd()
> };
> //绘制点阵平面，按逆时针输入坐标。
> ~fcglCrystalQuads(i1,j1,k1,i2,j2,k2,i3,j3,k3,i4,j4,k4,a,b,c,Alpha,Beta,Gamma:x,y,z)=
> {
> glBegin(GL_QUADS),
> fcglTransCrystalAxis(&x,&y,&z,i1,j1,k1,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,i2,j2,k2,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,i3,j3,k3,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,i4,j4,k4,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> glEnd()
> };

> //绘制简单晶胞（晶棱及顶点）。顶点由自定义函数DrawCellDot()绘制，该函数在调用模块中定义，被自动调用，不要在该函数中使用显示列表。
> //a,b,c,Alpha,Beta,Gamma：晶胞参数。EdgeR,EdgeG,EdgeB：晶棱颜色。ApexR,ApexG,ApexB：顶点颜色。
> //该函数在显示列表中绘制图形，返回一个显示列表序号。
> //在初始化场景时调用该函数，在场景绘制代码中执行该函数返回的显示列表。
> ~fcglDrawCrystalPCell(a,b,c,Alpha,Beta,Gamma,EdgeR,EdgeG,EdgeB,ApexR,ApexG,ApexB:x,y,z,list)=
> {
> list=glGenLists[1],
> glNewList[list,GL_COMPILE],
> //绘制点阵单元
> glColor3d[EdgeR,EdgeG,EdgeB],
> glBegin(GL_LINES),
> fcglTransCrystalAxis(&x,&y,&z,0,0,0,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,0,1,0,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,0,1,0,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,0,1,1,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,0,1,1,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,0,0,1,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,0,0,1,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,0,0,0,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,0,0,0,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,1,0,0,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,1,0,0,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,1,0,1,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,1,0,1,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,0,0,1,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,1,0,0,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,1,1,0,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,1,1,0,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,0,1,0,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,1,1,0,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,1,1,1,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,1,0,1,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,1,1,1,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,1,1,1,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> fcglTransCrystalAxis(&x,&y,&z,0,1,1,a,b,c,Alpha,Beta,Gamma),glVertex3d(x,y,z),
> glEnd(),
> //绘制顶点
> glColor3d[ApexR,ApexG,ApexB],
> fcglTransCrystalAxis(&x,&y,&z,0,0,0,a,b,c,Alpha,Beta,Gamma),glTranslated[x,y,z],gleCalFor("DrawCellDot"),glTranslated[-x,-y,-z],
> fcglTransCrystalAxis(&x,&y,&z,0,0,1,a,b,c,Alpha,Beta,Gamma),glTranslated[x,y,z],gleCalFor("DrawCellDot"),glTranslated[-x,-y,-z],
> fcglTransCrystalAxis(&x,&y,&z,0,1,0,a,b,c,Alpha,Beta,Gamma),glTranslated[x,y,z],gleCalFor("DrawCellDot"),glTranslated[-x,-y,-z],
> fcglTransCrystalAxis(&x,&y,&z,0,1,1,a,b,c,Alpha,Beta,Gamma),glTranslated[x,y,z],gleCalFor("DrawCellDot"),glTranslated[-x,-y,-z],
> fcglTransCrystalAxis(&x,&y,&z,1,0,0,a,b,c,Alpha,Beta,Gamma),glTranslated[x,y,z],gleCalFor("DrawCellDot"),glTranslated[-x,-y,-z],
> fcglTransCrystalAxis(&x,&y,&z,1,0,1,a,b,c,Alpha,Beta,Gamma),glTranslated[x,y,z],gleCalFor("DrawCellDot"),glTranslated[-x,-y,-z],
> fcglTransCrystalAxis(&x,&y,&z,1,1,0,a,b,c,Alpha,Beta,Gamma),glTranslated[x,y,z],gleCalFor("DrawCellDot"),glTranslated[-x,-y,-z],
> fcglTransCrystalAxis(&x,&y,&z,1,1,1,a,b,c,Alpha,Beta,Gamma),glTranslated[x,y,z],gleCalFor("DrawCellDot"),glTranslated[-x,-y,-z],
> glEndList[],
> list
> };

7 函数概述 [返回页首]

OpenFcGl试图输出OpenGl的绝大部分函数并加以扩展（目前仅进行了部分工作），使之能方便地绘制三维图形。

OpenFcGl中的函数目前有四种：以gl开头的是OpenGl32中的标准OpenGl函数；以glu开头的是glu32中的辅助OpenGl函数；以gle开头的是为方便与OpenGl和绘图窗口交互而扩展的函数；以fg开头的是OpenFcGl扩展的实用绘图函数，目前主要是一些绘制数学函数图形的函数。OpenFcGl努力保证这些函数在运行时的安全性，即无论以何种顺序使用这些函数，程序都不会崩溃（这也是所有forcal二级函数应具有的特点），但用户应该知道：只有正确地使用这些函数，才能充分发挥它们的性能。充分了解每一个要使用的函数的性能是非常必要的。

根据函数的使用位置，OpenFcGl函数可分为三类：进行场景绘制的函数，用于初始化场景的函数，可在任意位置使用的函数。场景绘制函数 具有循环执行的特点，显然可用于场景的初始化；而初始化函数仅在切换场景时执行一次，通常不能用在场景绘制函数之中。

OpenFcGl中绝大多数的OpenGl函数（以gl或glu开头）的用法及功能与在OpenGl中完全相同，但也有少数函数不一样，在使用中要主要这些差别。 其中，函数列表中标记为“有扩展”的函数为与OpenGl函数的用法及功能完全相同且有所扩展；标记为“有区别”的函数与OpenGl函数的功能完全相同，但用法有区别。

8 gl函数 ：OpenGl32函数 [返回页首]

类别 | 函数 | 用途 | 使用位置 | 函数种类 | 与OpenGl函数相比
gl | glClear | 清除屏幕以及深度缓存 | 场景绘制函数 | 实数函数 | 有扩展
gl | glLoadiDentity | 重置视图 | 场景绘制函数 | 实数函数 | 完全相同
gl | glTranslated | 移动坐标 | 场景绘制函数 | 实数函数 | 完全相同
gl | glColor3d | 设置颜色 | 场景绘制函数 | 实数函数 | 完全相同
gl | glBegin | 开始绘图 | 场景绘制函数 | 实数函数 | 完全相同
gl | glEnd | 结束绘图 | 场景绘制函数 | 实数函数 | 完全相同
gl | glVertex3d | 设置三维绘图点 | 场景绘制函数 | 实数函数 | 完全相同
gl | glRotated | 使对象围绕轴进行旋转 | 场景绘制函数 | 实数函数 | 完全相同
gl | glPointSize | 定义点的尺寸 | 场景绘制函数 | 实数函数 | 有扩展
gl | glLineWidth | 设置线宽 | 场景绘制函数 | 实数函数 | 有扩展
gl | glLineStipple | 设置线的虚点模式 | 场景绘制函数 | 实数函数 | 完全相同
gl | glEnable | 设置OpenGL的各种功能 | 场景绘制函数 | 实数函数 | 完全相同
gl | glDisable | 取消OpenGL的各种功能 | 场景绘制函数 | 实数函数 | 完全相同
gl | glPolygonMode | 多边形模式设置 | 场景绘制函数 | 实数函数 | 完全相同
gl | glClearColor | 设置屏幕清屏的颜色 | 初始化函数 | 实数函数 | 完全相同
gl | glCallList | 执行显示列表 | 场景绘制函数 | 实数函数 | 完全相同
gl | glListBase | 设置显示列表序列的基序号 | 场景绘制函数 | 实数函数 | 完全相同
gl | glCallLists | 执行显示列表序列 | 场景绘制函数 | 实数函数 | 有区别
gl | glGenLists | 创建一个或多个连续的显示列表，返回显示列表的基序号 | 初始化函数 | 实数函数 | 完全相同
gl | glNewList | 建立显示列表，并编译和执行显示列表 | 初始化函数 | 实数函数 | 完全相同
gl | glEndList | 结束建立显示列表 | 初始化函数 | 实数函数 | 完全相同
gl | glVertex2d | 设置二维绘图点 | 场景绘制函数 | 实数函数 | 完全相同
gl | glEdgeFlag | 设置边的可见性 | 场景绘制函数 | 实数函数 | 有区别
gl | glPushMatrix | 将当前矩阵压入堆栈 | 场景绘制函数 | 实数函数 | 完全相同
gl | glPopMatrix | 将当前矩阵弹出堆栈 | 场景绘制函数 | 实数函数 | 完全相同
gl | glScaled | 缩放变换 | 场景绘制函数 | 实数函数 | 完全相同
gl | glDeleteLists | 删除一组连续的显示列表 | 场景绘制函数 | 实数函数 | 完全相同

[返回本类函数列表] [返回页首] glClear[]或glClear[Mask]：清除屏幕以及深度缓存
Mask：整数，工作方式。

  Bitwise OR operators of masks that indicate the buffers to be cleared. The four masks are as follows.

  Mask | Buffer to be Cleared
  --- | ---
  GL_COLOR_BUFFER_BIT | The buffers currently enabled for color writing.
  GL_DEPTH_BUFFER_BIT | The depth buffer.
  GL_ACCUM_BUFFER_BIT | The accumulation buffer.
  GL_STENCIL_BUFFER_BIT | The stencil buffer.

通常，要把该函数设为场景绘制代码的第一个语句。

[例子]

[返回本类函数列表] [返回页首] glLoadIdentity[]或glLoadIdentity[... ...]：重置视图
glLoadIdentity[]：将X、Y、Z轴移到屏幕的指定位置（该位置由gleAxis(SetX,SetY,SetZ)指定）。

glLoadIdentity[... ...]：将X、Y、Z轴移到屏幕的中心位置。

通常在每一个图象绘制之前都要进行此项操作。

[例子]

[返回本类函数列表] [返回页首] glTranslated[x,y,z]：移动坐标
注意：当移动时，不是以屏幕的中心为起点而是以当前所在位置为起点进行移动。
通常在每一个图象绘制之前都要进行此项操作。

[例子]

[返回本类函数列表] [返回页首] glColor3d[r,g,b]：设置颜色
三个参数分别是红、绿、蓝的颜色强度值，其取值范围是从0到1。
一些特殊的颜色：[1,0,0]：红色、[0,1,0]：绿色、[0,0,1]：蓝色、[0,0,0]：黑色、[1,1,1]：白色

[例子]

[返回本类函数列表] [返回页首] glBegin[mode]：开始绘图
glBegin[mode]与glEnd[]必须成对使用，glBegin[mode]表示一个绘图单元的开始，glEnd[]表示一个绘图单元的结束。这一对函数使您能够绘制任意的图形。
在glBegin[mode]与glEnd[]之间，一般用glVertex3d[...]函数设置绘图点，也可包括glColor3d[r,g,b]设置颜色等函数。mode的取值及意义如下：
GL_POINTS：表示绘制一系列独立的点。
GL_LINES：每两点相连成为线段，因此，在glBegin[i]与glEnd[]之间点的个数必须是2的倍数。
GL_LINE_LOOP：封闭线段。
GL_LINE_STRIP：顶点相连成为折线。
GL_TRIANGLES：每三点相连成为一个三角形，因此，在glBegin[i]与glEnd[]之间点的个数必须是3的倍数。
GL_TRIANGLE_STRIP：相连的三角形带。
GL_TRIANGLE_FAN：相连的三角形扇。
GL_QUADS：每四点相连成为一个四边形，因此，在glBegin[i]与glEnd[]之间点的个数必须是4的倍数。
GL_QUAD_STRIP：相连的四边形带。
GL_POLYGON：绘制简单、凸多边形的边界。
该函数可能返回如下运行错误：
1：glBegin[mode]与glEnd[]没有成对使用。
2：参数mode非法。

[例子]

[返回本类函数列表] [返回页首] glEnd[]：结束绘图
glBegin[mode]与glEnd[]必须成对使用，glBegin[mode]表示一个绘图单元的开始，glEnd[]表示一个绘图单元的结束。
该函数可能返回如下运行错误：
1：glBegin[mode]与glEnd[]没有成对使用。

[例子]

[返回本类函数列表] [返回页首] glVertex3d[X,Y,Z]：设置三维绘图点
X,Y,Z设置了屏幕坐标系中的一点。
注意：一般，图形的绘制从顶点开始，要按逆时针方向绘制。

[例子]

[返回本类函数列表] [返回页首] glRotated[Angle,Xvector,Yvector,Zvector]：使对象围绕轴进行旋转
Angle为旋转角度，Xvector,Yvector和Zvector一起表示哪一个向量将发生旋转。如果使用(1,0,0)这意味着描述一个向量将沿X轴向右旋转一个单元；如果使用(-1,0,0)这意味着描述一个向量将沿X轴向左旋转一个单元。

[例子]

[返回本类函数列表] [返回页首] glPointSize[size]：定义点的尺寸
设置点的宽度（以象素为单位）。参数size必须大于0.0，缺省时为1.0。若size<=0，取size=1.0。
[例子]
gleDrawScene[HFor("Scene")],stop(); //设置场景绘制函数后退出
Scene(:i)=
{
glClear[], //清除屏幕以及深度缓存
glColor3d[1,0,0], //设置颜色为红色
gleAxesAngle[], //显示坐标和旋转角度
glLoadIdentity[], //重置视图
glTranslated[0,0,-20], //移动坐标，向屏幕里移动20个单元
glRotated[gleAngle(1),1,0,0], //可由键盘控制使图象沿X轴旋转
glRotated[gleAngle(2),0,1,0], //可由键盘控制使图象沿Y轴旋转
glRotated[gleAngle(3),0,0,1], //可由键盘控制使图象沿Z轴旋转
// 绘制一系列大小尺寸不同的点（以象素为基本扩展单元）
glColor3d[0,1,0], //设置颜色为绿色
i=1,
while{i<=10,
glPointSize(i*2), //定义点的尺寸
glBegin(0),
glVertex3d(-10.0+i*2,0.0,0.0),
glEnd(),
i++
}
};

[返回本类函数列表] [返回页首] glLineWidth[width]：设置线宽
设置线宽（以象素为单位）。参数width必须大于0.0，缺省时为1.0。若width<=0，取width=1.0。
[例子]
gleDrawScene[HFor("Scene")],stop(); //设置场景绘制函数后退出
Scene()=
{
glClear[], //清除屏幕以及深度缓存
glColor3d[1,0,0], //设置颜色为红色
gleAxesAngle[], //显示坐标和旋转角度
glLoadIdentity[], //重置视图
glTranslated[0,0,-20], //移动坐标，向屏幕里移动20个单元
glRotated[gleAngle(1),1,0,0], //可由键盘控制使图象沿X轴旋转
glRotated[gleAngle(2),0,1,0], //可由键盘控制使图象沿Y轴旋转
glRotated[gleAngle(3),0,0,1], //可由键盘控制使图象沿Z轴旋转
// 绘制三条不同线型的线段
glEnable (GL_LINE_STIPPLE),
glLineStipple (2, 1*16*16+1), /* 点线 */
glLineWidth (5.0), //设置线段的宽度为 5
glBegin(GL_LINES),
glColor3d(1.0,0.0,0.0),
glVertex3d(-10.0,4.0,0.0),
glVertex3d( 10.0,4.0,0.0),
glEnd(),
glLineStipple (1, 16*16-1), /* 虚线 */
glLineWidth (3.0), //设置线段的宽度为 3
glBegin(GL_LINES),
glColor3d(1.0,1.0,0.0),
glVertex3d(-10.0,2.0,0.0),
glVertex3d( 10.0,2.0,0.0),
glEnd(),
glLineStipple(3,16*16*16+12*16*16+4*16+7),/* 虚点线 */
glLineWidth (1.0), //设置线段的宽度为 1
glBegin(GL_LINES),
glColor3d(0.0,1.0,0.0),
glVertex3d(-10.0,-2.0,0.0),
glVertex3d( 10.0,-2.0,0.0),
glEnd(),
glEnable (GL_LINE_STIPPLE)
};

[返回本类函数列表] [返回页首] glLineStipple[factor,pattern]：设置线的虚点模式
设置线为当前的虚点模式。参数pattern是一系列的16位数（0或1），它重复地赋给所指定的线。其中每一位代表一个象素，且从低位开始，1表示用当前颜色绘制一个象素（或比例因子指定的个数），0表示当前不绘制，只移动一个象素位（或比例因子指定的个数）。参数factor是个比例因子，它用来拉伸pattern中的元素，即重复绘制1或移动0，比如，factor为2，则碰到1时就连续绘制2次，碰到0时连续移动2个单元。factor的大小范围限制在1到256之间。在绘制虚点线之前必须先启动一下，即调用函数glEnable(GL_LINE_STIPPLE);若不用，则调用glDisable(GL_LINE_STIPPLE)关闭。
该函数可能返回如下运行错误：1、参数不符合要求。
[例子]
gleDrawScene[HFor("Scene")],stop(); //设置场景绘制函数后退出
Scene()=
{
glClear[], //清除屏幕以及深度缓存
glColor3d[1,0,0], //设置颜色为红色
gleAxesAngle[], //显示坐标和旋转角度
glLoadIdentity[], //重置视图
glTranslated[0,0,-20], //移动坐标，向屏幕里移动20个单元
glRotated[gleAngle(1),1,0,0], //可由键盘控制使图象沿X轴旋转
glRotated[gleAngle(2),0,1,0], //可由键盘控制使图象沿Y轴旋转
glRotated[gleAngle(3),0,0,1], //可由键盘控制使图象沿Z轴旋转
// 绘制三条不同线型的线段
glEnable (GL_LINE_STIPPLE),
glLineStipple (2, 1*16*16+1), /* 点线 */
glBegin(GL_LINES),
glColor3d(1.0,0.0,0.0),
glVertex3d(-10.0,4.0,0.0),
glVertex3d( 10.0,4.0,0.0),
glEnd(),
glLineStipple (1, 16*16-1), /* 虚线 */
glBegin(GL_LINES),
glColor3d(1.0,1.0,0.0),
glVertex3d(-10.0,2.0,0.0),
glVertex3d( 10.0,2.0,0.0),
glEnd(),
glLineStipple(3,16*16*16+12*16*16+4*16+7),/* 虚点线 */
glBegin(GL_LINES),
glColor3d(0.0,1.0,0.0),
glVertex3d(-10.0,-2.0,0.0),
glVertex3d( 10.0,-2.0,0.0),
glEnd(),
glDisable(GL_LINE_STIPPLE)
};

[返回本类函数列表] [返回页首] glEnable[cap]：设置OpenGL的各种功能
与glDisable(cap)配合使用，先用glEnable[cap]设置OpenGL的功能，不用时，用glDisable(cap)取消这种功能。
例如：glEnable(GL_LINE_STIPPLE)：启用虚点模式。

The glEnable and glDisable functions enable and disable various OpenGL graphics capabilities. Use glIsEnabled or glGet to determine the current setting of any capability.

Both glEnable and glDisable take a single argument, cap, which can assume one of the following values:

Value | Meaning
--- | ---
GL_ALPHA_TEST | If enabled, do alpha testing. See glAlphaFunc.
GL_AUTO_NORMAL | If enabled, compute surface normal vectors analytically when either GL_MAP2_VERTEX_3 or GL_MAP2_VERTEX_4 has generated vertices. See glMap2.
GL_BLEND | If enabled, blend the incoming RGBA color values with the values in the color buffers. See glBlendFunc.
GL_CLIP_PLANEi | If enabled, clip geometry against user-defined clipping plane i. See glClipPlane.
GL_COLOR_LOGIC_OP | If enabled, apply the current logical operation to the incoming RGBA color and color buffer values. See glLogicOp.
GL_COLOR_MATERIAL | If enabled, have one or more material parameters track the current color. See glColorMaterial.
GL_CULL_FACE | If enabled, cull polygons based on their winding in window coordinates. See glCullFace.
GL_DEPTH_TEST | If enabled, do depth comparisons and update the depth buffer. See glDepthFunc and glDepthRange.
GL_DITHER | If enabled, dither color components or indexes before they are written to the color buffer.
GL_FOG | If enabled, blend a fog color into the post-texturing color. See glFog.
GL_INDEX_LOGIC_OP | If enabled, apply the current logical operation to the incoming index and color buffer indices. See glLogicOp.
GL_LIGHTi | If enabled, include light i in the evaluation of the lighting equation. See glLightModel and glLight.
GL_LIGHTING | If enabled, use the current lighting parameters to compute the vertex color or index. If disabled, associate the current color or index with each vertex. See glMaterial, glLightModel, and glLight.
GL_LINE_SMOOTH | If enabled, draw lines with correct filtering. If disabled, draw aliased lines. See glLineWidth.
GL_LINE_STIPPLE | If enabled, use the current line stipple pattern when drawing lines. See glLineStipple.
GL_LOGIC_OP | If enabled, apply the currently selected logical operation to the incoming and color-buffer indexes. See glLogicOp.
GL_MAP1_COLOR_4 | If enabled, calls to glEvalCoord1, glEvalMesh1, and glEvalPoint1 generate RGBA values. See also glMap1.
GL_MAP1_INDEX | If enabled, calls to glEvalCoord1, glEvalMesh1, and glEvalPoint1 generate color indexes. See also glMap1.
GL_MAP1_NORMAL | If enabled, calls to glEvalCoord1, glEvalMesh1, and glEvalPoint1 generate normals. See also glMap1.
GL_MAP1_TEXTURE_COORD_1 | If enabled, calls to glEvalCoord1, glEvalMesh1, and glEvalPoint1 generate s texture coordinates. See also glMap1.
GL_MAP1_TEXTURE_COORD_2 | If enabled, calls to glEvalCoord1, glEvalMesh1, and glEvalPoint1 generate s and t texture coordinates. See also glMap1.
GL_MAP1_TEXTURE_COORD_3 | If enabled, calls to glEvalCoord1, glEvalMesh1, and glEvalPoint1 generate s, t, and r texture coordinates. See also glMap1.
GL_MAP1_TEXTURE_COORD_4 | If enabled, calls to glEvalCoord1, glEvalMesh1, and glEvalPoint1 generate s, t, r, and q texture coordinates. See also glMap1.
GL_MAP1_VERTEX_3 | If enabled, calls to glEvalCoord1, glEvalMesh1, and glEvalPoint1 generate x, y, and z vertex coordinates. See also glMap1.
GL_MAP1_VERTEX_4 | If enabled, calls to glEvalCoord1, glEvalMesh1, and glEvalPoint1 generate homogeneous x, y, z, and w vertex coordinates. See also glMap1.
GL_MAP2_COLOR_4 | If enabled, calls to glEvalCoord2, glEvalMesh2, and glEvalPoint2 generate RGBA values. See also glMap2.
GL_MAP2_INDEX | If enabled, calls to glEvalCoord2, glEvalMesh2, and glEvalPoint2 generate color indexes. See also glMap2.
GL_MAP2_NORMAL | If enabled, calls to glEvalCoord2, glEvalMesh2, and glEvalPoint2 generate normals. See also glMap2.
GL_MAP2_TEXTURE_COORD_1 | If enabled, calls to glEvalCoord2, glEvalMesh2, and glEvalPoint2 generate s texture coordinates. See also glMap2.
GL_MAP2_TEXTURE_COORD_2 | If enabled, calls to glEvalCoord2, glEvalMesh2, and glEvalPoint2 generate s and t texture coordinates. See also glMap2.
GL_MAP2_TEXTURE_COORD_3 | If enabled, calls to glEvalCoord2, glEvalMesh2, and glEvalPoint2 generate s, t, and r texture coordinates. See also glMap2.
GL_MAP2_TEXTURE_COORD_4 | If enabled, calls to glEvalCoord2, glEvalMesh2, and glEvalPoint2 generate s, t, r, and q texture coordinates. See also glMap2.
GL_MAP2_VERTEX_3 | If enabled, calls to glEvalCoord2, glEvalMesh2, and glEvalPoint2 generate x, y, and z vertex coordinates. See also glMap2.
GL_MAP2_VERTEX_4 | If enabled, calls to glEvalCoord2, glEvalMesh2, and glEvalPoint2 generate homogeneous x, y, z, and w vertex coordinates. See also glMap2.
GL_NORMALIZE | If enabled, normal vectors specified with glNormal are scaled to unit length after transformation. See glNormal.
GL_POINT_SMOOTH | If enabled, draw points with proper filtering. If disabled, draw aliased points. See glPointSize.
GL_POLYGON_OFFSET_FILL | If enabled, and if the polygon is rendered in GL_FILL mode, an offset is added to depth values of a polygon's fragments before the depth comparison is performed. See glPolygonOffset.
GL_POLYGON_OFFSET_LINE | If enabled, and if the polygon is rendered in GL_LINE mode, an offset is added to depth values of a polygon's fragments before the depth comparison is performed. See glPolygonOffset.
GL_POLYGON_OFFSET_POINT | If enabled, an offset is added to depth values of a polygon's fragments before the depth comparison is performed, if the polygon is rendered in GL_POINT mode. See glPolygonOffset.
GL_POLYGON_SMOOTH | If enabled, draw polygons with proper filtering. If disabled, draw aliased polygons. See glPolygonMode.
GL_POLYGON_STIPPLE | If enabled, use the current polygon stipple pattern when rendering polygons. See glPolygonStipple.
GL_SCISSOR_TEST | If enabled, discard fragments that are outside the scissor rectangle. See glScissor.
GL_STENCIL_TEST | If enabled, do stencil testing and update the stencil buffer. See glStencilFunc and glStencilOp.
GL_TEXTURE_1D | If enabled, one-dimensional texturing is performed (unless two-dimensional texturing is also enabled). See glTexImage1D.
GL_TEXTURE_2D | If enabled, two-dimensional texturing is performed. See glTexImage2D.
GL_TEXTURE_GEN_Q | If enabled, the q texture coordinate is computed using the texture-generation function defined with glTexGen. Otherwise, the current q texture coordinate is used.
GL_TEXTURE_GEN_R | If enabled, the r texture coordinate is computed using the texture generation function defined with glTexGen. If disabled, the current r texture coordinate is used.
GL_TEXTURE_GEN_S | If enabled, the s texture coordinate is computed using the texture generation function defined with glTexGen. If disabled, the current s texture coordinate is used.
GL_TEXTURE_GEN_T | If enabled, the t texture coordinate is computed using the texture generation function defined with glTexGen. If disabled, the current t texture coordinate is used.

[例子]

[返回本类函数列表] [返回页首] glDisable[cap]：取消OpenGL的各种功能
与glEnable(cap)配合使用，先用glEnable[cap]设置OpenGL的功能，不用时，用glDisable(cap)取消这种功能。
例如：glDisable(GL_LINE_STIPPLE)：取消虚点模式。

[例子]

[返回本类函数列表] [返回页首] glPolygonMode[face,mode]：多边形模式设置
控制多边形指定面的绘制模式。参数face为GL_FRONT、GL_BACK或GL_FRONT_AND_BACK；参数mode为GL_POINT、GL_LINE或GL_FILL，分别表示绘制轮廓点式多边形、轮廓线式多边形或全填充式多边形。缺省时，绘制的是正反面全填充式多边形。
该函数可能返回如下运行错误：1、参数不符合要求；
[例子]
(::hF,rot)= hF=HFor("f"),rot=0; //获取函数f的句柄，设置一个变量
gleDrawScene[HFor("Scene")],stop(); //设置场景绘制函数后退出
f(x,y)=(x^2-2*x)*exp(-(x^2)-y^2-x*y);
Scene(:x:hF,rot)=
{
glClear[],
glColor3d[1,0,0], //设置颜色
gleAxesAngle[], //显示坐标和旋转角度
glLoadIdentity[],
glTranslated[0,0,-35],
glColor3d[0,1,0], //设置颜色
glRotated[90,1,0,0], //使图象沿X轴旋转90度
glRotated[gleAngle(1),1,0,0], //可由键盘控制使图象沿X轴旋转
glRotated[gleAngle(2),0,1,0], //可由键盘控制使图象沿Y轴旋转
glRotated[gleAngle(3),0,0,1], //可由键盘控制使图象沿Z轴旋转
{
x=5*sin[rot],
glTranslated[-11,x,x],
glPolygonMode[GL_FRONT,GL_POINT], //多边形模式设置
fgPlot3d[hF,-x,x,-x,x,FG_NOAXES,FG_NOMESH],
glTranslated[11,x/2,x/2],
glPolygonMode[GL_BACK,GL_LINE], //多边形模式设置
fgPlot3d[hF,-x,x,-x,x,FG_NOAXES,FG_NOMESH]
},
{
x=5*sin[rot],
glTranslated[11,x/2,x/2],
glPolygonMode[GL_FRONT_AND_BACK,GL_FILL], //多边形模式设置
fgPlot3d[hF,-x,x,-x,x,FG_NOAXES,FG_NOMESH]
},
rot=rot+0.05 //速度控制
};

[返回本类函数列表] [返回页首] glClearColor[r,g,b,Alpha]：设置屏幕清屏的颜色
r,g,b三个参数分别是红、绿、蓝的颜色强度值，其取值范围是从0到1。
Alpha值与透明度有关。

[例子]

> gleDrawScene(HFor("Draw")),stop(); //启动场景绘制，就退出
> initScene()= //定义初始化函数
> {
> glClearColor(0,1,0,1) //设置屏幕清屏的颜色
> };
> Draw()= //场景绘制函数
> {
> if[gleIsInitScene(),initScene()], //需要初始化场景时，就执行初始化函数
> glClear[], //清除屏幕以及深度缓存
> glLoadIdentity[], //重置视图
> glTranslated[-4,0,-10], //移动坐标
> glColor3d[1,0,0], //设置颜色
> glePrint["Hello OpenFcGl !"] //绘制英文字符串
> };

[返回本类函数列表] [返回页首] glCallList(i)：执行显示列表

i为显示列表的序号。

[例子]

[返回本类函数列表] [返回页首] glListBase(i)：设置显示列表序列的基序号

i为显示列表序列的基序号。

[例子]

[返回本类函数列表] [返回页首] glCallLists("abc... ...")或glCallLists(n1,n2,... ...)：执行显示列表序列

glCallLists("abc... ...")：只有一个参数时，该参数必须为字符串。字符串中的每一个字符代表一个显示列表，该显示列表序号与基序号（由glListBase(i)设置）之差等于该字符的ASCII值。

glCallLists(n1,n2,... ...)：多于一个参数时，每一个参数值等于该参数代表的显示列表序号与基序号（由glListBase(i)设置）之差。

该函数可能返回如下运行错误：1、只有一个参数时，该参数必须为字符串。2、内存错误。

[例子]

> gleDrawScene(HFor("Draw")),stop(); //启动场景绘制，就退出
> initScene(:a,r,m,n:AA,Ball)= //定义初始化函数
> {
> Ball=gluNewQuadric[], //创建二次曲面对象
> gluQuadricDrawStyle[Ball,GLU_FILL], //设置二次曲面绘制模式
> gluQuadricNormals[Ball,GLU_SMOOTH], //设置二次曲面法线信息

> a=0.5,r=0.2,m=8,n=8,
> AA=glGenLists[6],
> glNewList[AA+2,GL_COMPILE], //绘正方形
> glBegin(GL_LINES),
> glVertex3d(-a,a,a),glVertex3d(-a,-a,a),
> glVertex3d(-a,-a,a),glVertex3d(a,-a,a),
> glVertex3d(a,-a,a),glVertex3d(a,a,a),
> glVertex3d(a,a,a),glVertex3d(-a,a,a),
> glVertex3d(-a,a,-a),glVertex3d(a,a,-a),
> glVertex3d(a,a,-a),glVertex3d(a,-a,-a),
> glVertex3d(a,-a,-a),glVertex3d(-a,-a,-a),
> glVertex3d(-a,-a,-a),glVertex3d(-a,a,-a),
> glVertex3d(-a,a,a),glVertex3d(-a,a,-a),
> glVertex3d(-a,-a,a),glVertex3d(-a,-a,-a),
> glVertex3d(a,-a,a),glVertex3d(a,-a,-a),
> glVertex3d(a,a,a),glVertex3d(a,a,-a),
> glEnd(),
> glEndList[],
> glNewList[AA+5,GL_COMPILE], //绘正方形顶点的球
> glTranslated[-a,-a,-a], gluSphere[Ball,r,m,n],
> glTranslated[2*a,0,0], gluSphere[Ball,r,m,n],
> glTranslated[0,2*a,0], gluSphere[Ball,r,m,n],
> glTranslated[-2*a,0,0], gluSphere[Ball,r,m,n],
> glTranslated[0,0,2*a], gluSphere[Ball,r,m,n],
> glTranslated[0,-2*a,0], gluSphere[Ball,r,m,n],
> glTranslated[2*a,0,0], gluSphere[Ball,r,m,n],
> glTranslated[0,2*a,0], gluSphere[Ball,r,m,n],
> glEndList[]
> };
> Draw(::AA)= //场景绘制函数
> {
> if[gleIsInitScene(),initScene()], //需要初始化场景时，就执行初始化函数
> glClear[], //清除屏幕以及深度缓存
> glLoadIdentity[], //重置视图
> glRotated[gleAngle(1),1,0,0], //使图象沿X轴旋转
> glRotated[gleAngle(2),0,1,0], //使图象沿Y轴旋转
> glRotated[gleAngle(3),0,0,1], //使图象沿Z轴旋转
> glTranslated[0,0,-10], //移动坐标
> glColor3d[1,0,0], //设置颜色
> glListBase[AA], //设置显示列表序列的基序号
> glCallLists[2,5] //执行显示列表序列
> };

[返回本类函数列表] [返回页首] glGenLists(n)：创建一个或多个连续的显示列表，返回显示列表的基序号

n为显示列表的个数，n>=1。若返回值为0，表示创建失败。

[例子]

[返回本类函数列表] [返回页首] glNewList(i,mode)：建立显示列表，并编译和执行显示列表

i为显示列表的序号。mode为工作模式，mode=GL_COMPILE时，仅进行编译；mode=GL_COMPILE_AND_EXECUTE时，编译并执行显示列表。

该函数必须与glEndList()成对使用。

不要用该函数对同一个显示列表创建多次，这将引起混乱和不安全。

[例子]

> gleDrawScene(HFor("Draw")),stop(); //启动场景绘制，就退出
> initScene(:a,r,m,n:AA,Ball)= //定义初始化函数
> {
> Ball=gluNewQuadric[], //创建二次曲面对象
> gluQuadricDrawStyle[Ball,GLU_FILL], //设置二次曲面绘制模式
> gluQuadricNormals[Ball,GLU_SMOOTH], //设置二次曲面法线信息

> a=0.5,r=0.2,m=8,n=8,
> AA=glGenLists[1],
> glNewList[AA,GL_COMPILE],
> glBegin(GL_LINES), //绘正方形
> glVertex3d(-a,a,a),glVertex3d(-a,-a,a),
> glVertex3d(-a,-a,a),glVertex3d(a,-a,a),
> glVertex3d(a,-a,a),glVertex3d(a,a,a),
> glVertex3d(a,a,a),glVertex3d(-a,a,a),
> glVertex3d(-a,a,-a),glVertex3d(a,a,-a),
> glVertex3d(a,a,-a),glVertex3d(a,-a,-a),
> glVertex3d(a,-a,-a),glVertex3d(-a,-a,-a),
> glVertex3d(-a,-a,-a),glVertex3d(-a,a,-a),
> glVertex3d(-a,a,a),glVertex3d(-a,a,-a),
> glVertex3d(-a,-a,a),glVertex3d(-a,-a,-a),
> glVertex3d(a,-a,a),glVertex3d(a,-a,-a),
> glVertex3d(a,a,a),glVertex3d(a,a,-a),
> glEnd(),
> glTranslated[-a,-a,-a], gluSphere[Ball,r,m,n], //绘正方形顶点的球
> glTranslated[2*a,0,0], gluSphere[Ball,r,m,n],
> glTranslated[0,2*a,0], gluSphere[Ball,r,m,n],
> glTranslated[-2*a,0,0], gluSphere[Ball,r,m,n],
> glTranslated[0,0,2*a], gluSphere[Ball,r,m,n],
> glTranslated[0,-2*a,0], gluSphere[Ball,r,m,n],
> glTranslated[2*a,0,0], gluSphere[Ball,r,m,n],
> glTranslated[0,2*a,0], gluSphere[Ball,r,m,n],
> glEndList[]
> };
> Draw(::AA)= //场景绘制函数
> {
> if[gleIsInitScene(),initScene()], //需要初始化场景时，就执行初始化函数
> glClear[], //清除屏幕以及深度缓存
> glLoadIdentity[], //重置视图
> glRotated[gleAngle(1),1,0,0], //使图象沿X轴旋转
> glRotated[gleAngle(2),0,1,0], //使图象沿Y轴旋转
> glRotated[gleAngle(3),0,0,1], //使图象沿Z轴旋转
> glTranslated[0,0,-10], //移动坐标
> glColor3d[1,0,0], //设置颜色
> glCallList[AA] //绘制图形
> };

[返回本类函数列表] [返回页首] glEndList()：结束建立显示列表

该函数必须与glNewList()成对使用。

[例子]

[返回本类函数列表] [返回页首] glVertex2d(X,Y)：设置二维绘图点

X,Y设置了屏幕二维坐标系中的一点。

[例子]

> gleDrawScene(HFor("Draw")),stop(); //启动场景绘制，就退出
> Draw(::AA)= //场景绘制函数
> {
> glClear[], //清除屏幕以及深度缓存
> glLoadIdentity[], //重置视图
> glTranslated[0,0,-2], //移动坐标
> glColor3d[1,0,0], //设置颜色
> glPolygonMode(GL_FRONT_AND_BACK,GL_LINE),
> glBegin(GL_POLYGON), //绘 四边形
> glVertex2d(-0.3,0.3),
> glEdgeFlag(0),
> glVertex2d(-0.1,-0.1),
> glEdgeFlag(1),
> glVertex2d(0,-0.1),
> glVertex2d(0.3,0.3),
> glEnd(),
> glBegin(GL_POLYGON), //绘四边形
> glVertex2d(-0.1,-0.1),
> glVertex2d(-0.2,-0.4),
> glVertex2d(0.2,-0.4),
> glEdgeFlag(0),
> glVertex2d(0,-0.1),
> glEdgeFlag(1),
> glEnd()
> };

[返回本类函数列表] [返回页首] glEdgeFlag(bool)：设置边的可见性

如果bool为真，则边是可见的；如果bool为假，则边是不可见的。

通常边的可见性不发生变化，除非再一次用不同的参数调用该函数。

[例子]

[返回本类函数列表] [返回页首] glPushMatrix()：将当前矩阵压入堆栈

glPushMatrix()与glPopMatrix()要成对使用。

[例子]

> gleDrawScene(HFor("Draw")),stop(); //启动场景绘制，就退出
> Draw()= //场景绘制函数
> {
> glClear[], //清除屏幕以及深度缓存
> glLoadIdentity[], //重置视图
> glTranslated[-4,0,-10], //移动坐标
> glColor3d[1,0,0], //设置颜色
> glPushMatrix(), //将当前矩阵压入堆栈
> glePrint["Hello OpenFcGl !"], //绘制英文字符串
> glPopMatrix(), //将当前矩阵弹出堆栈
> glTranslated[0,-2,0], //移动坐标
> glScaled(0.5,1,1), //缩放变换
> glePrint["Hello OpenFcGl !"] //绘制英文字符串
> };

[返回本类函数列表] [返回页首] glPopMatrix()：将当前矩阵弹出堆栈

glPushMatrix()与glPopMatrix()要成对使用。

[例子]

[返回本类函数列表] [返回页首] glScaled(sx,sy,sz)：缩放变换

sx,sy,sz分别表示沿X,Y,Z轴的缩放因子。

[例子]

[返回本类函数列表] [返回页首] glDeleteLists(list,range)：删除一组连续的显示列表

list为第一个要删除的显示列表。range为要删除的显示列表数目。

[例子]

9 glu函数 ：Glu32函数 [返回页首]

类别 | 函数 | 用途 | 使用位置 | 函数种类 | 与OpenGl函数相比
glu | gluNewQuadric | 创建二次曲面对象 | 初始化函数 | 实数函数 | 完全相同
glu | gluQuadricDrawStyle | 设置二次曲面绘制模式 | 场景绘制函数 | 实数函数 | 完全相同
glu | gluQuadricNormals | 设置二次曲面法线信息 | 场景绘制函数 | 实数函数 | 完全相同
glu | gluSphere | 绘制球 | 场景绘制函数 | 实数函数 | 完全相同
glu | gluQuadricOrientation | 设置二次曲面插值计算的方向 | 场景绘制函数 | 实数函数 | 完全相同
glu | gluQuadricTexture | 设置二次曲面是否生成纹理坐标 | 场景绘制函数 | 实数函数 | 完全相同
glu | gluDeleteQuadric | 删除二次曲面对象 | 场景绘制函数 | 实数函数 | 完全相同
glu | gluCylinder | 绘制圆柱、圆锥或台锥 | 场景绘制函数 | 实数函数 | 完全相同
glu | gluDisk | 绘制圆盘或圆环 | 场景绘制函数 | 实数函数 | 完全相同
glu | gluPartialDisk | 绘制扇形 | 场景绘制函数 | 实数函数 | 完全相同

[返回本类函数列表] [返回页首] gluNewQuadric()：创建二次曲面对象

返回一个二次曲面对象指针（指针保存在实数的前4个字节中）。在特定的函数中，可通过该指针访问到该二次曲面对象。

指针是否有效，可以用函数IsPointer(Pointer)进行检验。二次曲面对象不用时要及时用函数gluDeleteQuadric(p)删除。

尽量不要将函数gluNewQuadric()放在循环体或场景绘制函数内，以免造成连续不断的内存耗损，除非用函数gluDeleteQuadric(p)及时销毁了该二次曲面对象。

[例子]

> gleDrawScene(HFor("Draw")),stop(); //启动场景绘制，就退出
> initScene(::a)= //定义初始化函数
> {
> a=gluNewQuadric[], //创建二次曲面对象
> gluQuadricDrawStyle[a,GLU_FILL], //设置二次曲面绘制模式
> gluQuadricNormals[a,GLU_SMOOTH] //设置二次曲面法线信息
> };
> Draw(::a)= //场景绘制函数
> {
> if[gleIsInitScene(),initScene()], //需要初始化场景时，就执行初始化函数
> glClear[], //清除屏幕以及深度缓存
> glLoadIdentity[], //重置视图
> glTranslated[0,0,-10], //移动坐标
> glColor3d[1,0,0], //设置颜色
> gluSphere[a,0.5,20,20] //绘制球
> };

[返回本类函数列表] [返回页首] gluQuadricDrawStyle(aa,drawStyle)：设置二次曲面绘制模式

指针aa标识二次曲面对象。drawStyle为绘制模式。

该函数可能返回如下运行错误：1、无效的二次曲面对象指针。

  The desired draw style. The following values are valid.

  Value | Meaning
  --- | ---
  GLU_FILL | Quadrics are rendered with polygon primitives. The polygons are drawn in a counterclockwise fashion with respect to their normals (as defined with gluQuadricOrientation).
  GLU_LINE | Quadrics are rendered as a set of lines.
  GLU_SILHOUETTE | Quadrics are rendered as a set of lines, except that edges separating coplanar faces will not be drawn.
  GLU_POINT | Quadrics are rendered as a set of points.

[例子]

[返回本类函数列表] [返回页首] gluQuadricNormals(aa,normals)：设置二次曲面法线信息

指针aa标识二次曲面对象。normals标识二次曲面法线信息。

该函数可能返回如下运行错误：1、无效的二次曲面对象指针。

  The desired type of normals. The following values are valid.

  Value | Meaning
  --- | ---
  GLU_NONE | No normals are generated.
  GLU_FLAT | One normal is generated for every facet of a quadric.
  GLU_SMOOTH | One normal is generated for every vertex of a quadric. This is the default value.

[例子]

[返回本类函数列表] [返回页首] gluSphere(aa,radius,slices,stacks)：绘制球

指针aa标识二次曲面对象（球）。radius为球的半径。slices,stacks为经线和纬线的线圈数。

该函数可能返回如下运行错误：1、无效的二次曲面对象指针。

[例子]

[返回本类函数列表] [返回页首] gluQuadricOrientation(aa,orientation)： 设置二次曲面插值计算的方向

指针aa标识二次曲面对象。orientation表示二次曲面插值计算的方向。orientation=GLU_OUTSIDE表示二次曲面的法线是自曲面向外的；orientation=GLU_INSIDE表示二次曲面的法线是指向二次曲面的。

该函数可能返回如下运行错误：1、无效的二次曲面对象指针。

[例子]（略）

[返回本类函数列表] [返回页首] gluQuadricTexture(aa,textureCoords)： 设置二次曲面是否生成纹理坐标

指针aa标识二次曲面对象。textureCoords 表示是否为二次曲面生成纹理坐标。textureCoords为真表示生成纹理坐标，否则不生成纹理坐标。

该函数可能返回如下运行错误：1、无效的二次曲面对象指针。

[例子]（略）

[返回本类函数列表] [返回页首] gluDeleteQuadric(aa)： 删除二次曲面对象

指针aa标识二次曲面对象。

[例子]

[返回本类函数列表] [返回页首] gluCylinder(aa,baseRadius,topRadius,height,slices,stacks)： 绘制圆柱、圆锥或台锥

指针aa标识二次曲面对象。baseRadius,topRadius表示台锥体底面半径和顶面半径。height表示台锥的高。slices,stacks为经线和纬线的线圈数。

该函数可能返回如下运行错误：1、无效的二次曲面对象指针。

[例子]

gleDrawScene(HFor("Draw")),stop(); //启动场景绘制，就退出
Draw(:a)= //场景绘制函数
{
glClear[], //清除屏幕以及深度缓存
glLoadIdentity[], //重置视图
glColor3d[1,0,0], //设置颜色
a=gluNewQuadric[], //创建二次曲面对象
gluQuadricDrawStyle[a,GLU_FILL], //设置二次曲面绘制模式
gluQuadricNormals[a,GLU_SMOOTH], //设置二次曲面法线信息
glTranslated[-6,0,-20], //移动坐标
gluSphere[a,0.5,20,20], //绘制球
glTranslated[3,0,0], //移动坐标
gluCylinder[a,2,1,3,20,20], //绘制台锥
glTranslated[5,0,0], //移动坐标
gluDisk[a,0.5,2,20,20], //绘制圆环
glTranslated[5,0,0], //移动坐标
gluPartialDisk[a,0.5,2,20,20,10,80], //绘制扇形
gluDeleteQuadric[a] //删除二次曲面对象
};

[返回本类函数列表] [返回页首] gluDisk(aa,innerRadius,outerRadius,slices,loops)： 绘制圆盘或圆环

指针aa标识二次曲面对象。innerRadius,outerRadius表示圆环的内径和外径。slices,loops表示径向的线圈数和周向的等分直线数目。

该函数可能返回如下运行错误：1、无效的二次曲面对象指针。

[例子]

[返回本类函数列表] [返回页首] gluPartialDisk(aa,innerRadius,outerRadius,slices,loops,startAngle,sweepAngle)： 绘制扇形

指针aa标识二次曲面对象。innerRadius,outerRadius表示扇形的内径和外径。lices,loops表示径向的线圈数和周向的等分直线数目。startAngle表示起始角度。sweepAngle表示扇形的张开角度。

该函数可能返回如下运行错误：1、无效的二次曲面对象指针。

[例子]

10 gle函数 ：OpenFcGl扩展函数 [返回页首]

类别 | 函数 | 用途 | 使用位置 | 函数种类 | 其他
gle | gleWorkDrawScene | 场景绘制函数，必须手动关闭该函数打开的绘图窗口。 | 任意位置 | 实数函数 |
gle | gleDrawScene | 场景绘制函数，OpenFcGl会自动关闭打开的绘图窗口。 | 任意位置 | 实数函数 |
gle | gleNewScene | 申请场景 | 任意位置 | 实数函数 |
gle | gleDeleteScene | 销毁场景 | 任意位置 | 实数函数 |
gle | gleSetWorkMode | 设置工作模式 | 初始化函数 | 实数函数 |
gle | gleDeletePrintCnList | 删除中文字符串显示列表 | 场景绘制函数 | 实数函数 |
gle | gleCreatePrintCnList | 创建中文字符串显示列表 | 初始化函数 | 实数函数 |
gle | glePrintCnList | 显示存储在列表中的中文字符串 | 场景绘制函数 | 实数函数 |
gle | gleGetWindowSize | 获得绘图窗口尺寸 | 场景绘制函数 | 实数函数 |
gle | gleGetMouseMsg | 获得鼠标消息 | 场景绘制函数 | 实数函数 |
gle | gleAxesAngle | 显示坐标和旋转角度 | 场景绘制函数 | 实数函数 |
gle | gleAngle | 获得由键盘操纵的旋转角度 | 场景绘制函数 | 实数函数 |
gle | gleAngleRate | 键盘操纵图象旋转的速率 | 场景绘制函数 | 实数函数 |
gle | gleAxisRate | 设置坐标移动的速率 | 场景绘制函数 | 实数函数 |
gle | glePrintCn | 输出中文字符串 | 场景绘制函数 | 实数函数 |
gle | glePrintCnStr | 输出中文字符数组 | 场景绘制函数 | 实数函数 |
gle | glePrint | 输出英文字符串 | 场景绘制函数 | 实数函数 |
gle | glePrintStr | 输出英文字符数组 | 场景绘制函数 | 实数函数 |
gle | gleVirtualKey | 键盘状态函数 | 场景绘制函数 | 实数函数 |
gle | gleIsInitScene | 判断是否需要初始化场景 | 场景绘制函数 | 实数函数 |
gle | gleAxis | 设置或获得OpenGl屏幕坐标 | 场景绘制函数 | 实数函数 |
gle | gleClear | 清除申请的空间 | 初始化函数 | 实数函数 |
gle | gleSetWindowMode | 设置窗口模式 | 初始化函数 | 实数函数 |
gle | gleSetWindowText | 设置窗口标题 | 初始化函数 | 实数函数 |
gle | gleShowCursor | 显示或隐藏光标 | 初始化函数 | 实数函数 |
gle | gleOr | 按位或函数 | 任意位置 | 实数函数 |
gle | gleCalFor | 在运行时调用实数表达式 | 任意位置 | 实数函数 |
gle | gleMessageBox | 消息框函数 | 任意位置 | 实数函数 |
gle | gleReSetPara | 重置参数 | 任意位置 | 实数函数 |
gle | gleFindWindow | 获得一个（顶层）窗口的句柄 | 任意位置 | 实数函数 |
gle | gleRegConstState | 检查常量注册情况 | 任意位置 | 实数函数 |
gle | gleMoveWindow | 移动窗口，改变窗口的位置和尺寸 | 场景绘制函数 | 实数函数 |
gle | gleSaveScene | 将OpenFcGl图像保存为文件 | 场景绘制函数 | 实数函数 |

[返回本类函数列表] [返回页首] gleWorkDrawScene[HFor("rFor")] 或 gleWorkDrawScene[scene,HFor("rFor")]：场景绘制函数
gleWorkDrawScene将场景绘制函数"rFor"的句柄传送给OpenFcGl32W.dll，"rFor"是一个实数表达式的名称。scene是由函数gleNewScene申请的场景指针。
该函数可能返回如下运行错误：1、参数个数非法；2：非法的场景指针；3：非法的表达式句柄。
注意：如果没有通过gleSetWindowMode给OpenFcGl窗口指定一个父窗口，必须手动关闭该函数打开的OpenFcGl窗口。

[例子]

> gleWorkDrawScene(HFor("Draw")),stop(); //启动场景绘制，就退出
> Draw()= //场景绘制函数
> {
> glClear[], //清除屏幕以及深度缓存
> glLoadIdentity[], //重置视图
> glTranslated[-5,0,-15], //移动坐标
> glColor3d[1,0,0], //设置颜色
> glePrint["Hello OpenFcGl !"] //绘制英文字符串
> };

[返回本类函数列表] [返回页首] gleDrawScene[HFor("rFor")] 或 gleDrawScene[scene,HFor("rFor")]：场景绘制函数
gleDrawScene将场景绘制函数"rFor"的句柄传送给OpenFcGl32W.dll，"rFor"是一个实数表达式的名称。scene是由函数gleNewScene申请的场景指针。
该函数可能返回如下运行错误：1、参数个数非法；2：非法的场景指针；3：非法的表达式句柄。
注意：该函数打开的绘图窗口会被OpenFcGl自动关闭。

[例子]

[例子]

[返回本类函数列表] [返回页首] gleNewScene["aaa"]：申请场景

字符串"aaa"是场景的窗口类的名称。每一个场景对应着一个窗口类。该函数返回一个场景指针，用在场景绘制函数gleWorkDrawScene或gleDrawScene中。场景不用时，须用函数 gleDeleteScene销毁。

该函数可能返回如下运行错误：1、非法的字符串地址；2：字符串太长，应小于80个字符。

[例子]

(:static,a,free)= //设置场景绘制函数后退出
{
if[free,gleDeleteScene(a)], //销毁表达式时销毁场景
a=gleNewScene["aaa"],
gleDrawScene[a,HFor("Scene")],stop()
};
//让图形随鼠标移动。factor为比例因子，factor越大则移动幅度越大。
fcglFollowMouse(factor:x,y,xx,yy,xxx,yyy,static,fcglFollowMouse,xMouse,yMouse)=
{
if[gleGetMouseMsg(WM_LBUTTONDOWN,&x,&y),fcglFollowMouse=1,xMouse=x,yMouse=y],
gleGetWindowSize[&xxx,&yyy],
if[fcglFollowMouse,gleGetMouseMsg(WM_MOUSEMOVE,&xx,&yy),gleAngle[1,gleAngle(1)+(yy-yMouse)/yyy*factor],gleAngle[2,gleAngle(2)+(xx-xMouse)/xxx*factor]],
if[gleGetMouseMsg(WM_LBUTTONUP,&xx,&yy),fcglFollowMouse=0],
glRotated[gleAngle(1),1,0,0], //使图象沿X轴旋转
glRotated[gleAngle(2),0,1,0], //使图象沿Y轴旋转
glRotated[gleAngle(3),0,0,1] //使图象沿Z轴旋转
};
f(x,y:r)= r=sqrt[(x-50)^2+(y-50)^2]+exp[1], sin[r]/r+1;
initScene()= //定义初始化函数
{
gleAngle(90,180,90), //设置重置视图初始位置
gleSetWorkMode[0] //计时器模式
};
Scene()= //场景绘制函数
{
if[gleIsInitScene(),initScene()], //需要初始化场景时，就执行初始化函数
glClear[],
glColor3d[1,0,0], //设置颜色
gleAxesAngle[], //显示坐标和旋转角度
glLoadIdentity[],
glTranslated[0,0,-20],
glColor3d[0,1,0], //设置颜色
fcglFollowMouse[2], //通过鼠标拖动变换任意角度来观察物体
fgPlot3d[HFor("f"),0,100,0,100,FG_NOMESH] //绘制二元函数图形
};

[返回本类函数列表] [返回页首] gleDeleteScene[scene]：销毁场景

销毁场景scene（场景指针），该场景是由函数 gleNewScene申请的。

[例子]

[返回本类函数列表] [返回页首] gleSetWorkMode[mode]：设置工作模式

若mode为真，设置为快速模式；若mode为假，设置为计时器模式。按F3可在快速模式和计时器模式之间进行切换。

[例子]

[返回本类函数列表] [返回页首] gleAxesAngle[]：显示坐标和旋转角度

[例子]

[返回本类函数列表] [返回页首] gleAxisRate(x)：设置坐标移动的速率
键盘操纵屏幕坐标移动速率的缺省值是0.1，可用该函数重新设置坐标移动的速率。

[例子]

> gleDrawScene(HFor("Draw")),stop(); //启动场景绘制，就退出
> initScene()= //定义初始化函数
> {
> gleAxisRate(0.5) //设置坐标移动的速率
> };
> Draw()= //场景绘制函数
> {
> if[gleIsInitScene(),initScene()], //需要初始化场景时，就执行初始化函数
> glClear[], //清除屏幕以及深度缓存
> glLoadIdentity[], //重置视图
> glTranslated[-5,0,-15], //移动坐标
> glColor3d[1,0,0], //设置颜色
> glePrint["Hello OpenFcGl !"] //绘制英文字符串
> };

[返回本类函数列表] [返回页首] gleAngle(i)：获得由键盘操纵的旋转角度
在OpenFcGl32W.dll中设置了三个可由键盘操纵的数，这三个数可由函数gleAngle[i]获得，使用这三个数并与函数glRotated[...]配合可使图象产生旋转。
Shift + →：使gleAngle[1]值增加；
Shift + ←：使gleAngle[1]值减少；
Shift + ↑：使gleAngle[2]值增加；
Shift + ↓：使gleAngle[2]值减少；
Shift + PageUp： 使gleAngle[3]值减少；
Shift + PageDown：使gleAngle[3]值增加；
Shift + Home：使gleAngle[i]值为0。
在每一个绘图单元前加上以下代码，可用键盘操纵图象沿X、Y、Z轴旋转：
glRotated[gleAngle(1),1,0,0]; //使图象沿X轴旋转。
glRotated[gleAngle(2),0,1,0]; //使图象沿Y轴旋转。
glRotated[gleAngle(3),0,0,1]; //使图象沿Z轴旋转。

[例子]

[返回本类函数列表] [返回页首] gleAngleRate(x)：键盘操纵图象旋转的速率
键盘操纵图象旋转的速率的缺省值是0.5，可用该函数重新设置图象旋转的速率。

[例子]

> gleDrawScene(HFor("Draw")),stop(); //启动场景绘制，就退出
> initScene()= //定义初始化函数
> {
> gleAngleRate(1) //设置图象旋转的速率
> };
> Draw()= //场景绘制函数
> {
> if[gleIsInitScene(),initScene()], //需要初始化场景时，就执行初始化函数
> glClear[], //清除屏幕以及深度缓存
> glLoadIdentity[], //重置视图
> glRotated[gleAngle(1),1,0,0], //使图象沿X轴旋转
> glRotated[gleAngle(2),0,1,0], //使图象沿Y轴旋转
> glRotated[gleAngle(3),0,0,1], //使图象沿Z轴旋转
> glTranslated[-5,0,-15], //移动坐标
> glColor3d[1,0,0], //设置颜色
> glePrint["Hello OpenFcGl !"] //绘制英文字符串
> };

[返回本类函数列表] [返回页首] glePrintCn["我的 OpenFC & OpenGL !"]：输出中文字符串
该函数速度很慢，但能用来输出汉字和英文。
该函数可能返回如下运行错误：1、字符串地址错误。

[例子]

> gleDrawScene(HFor("Draw")),stop(); //启动场景绘制，就退出
> Draw()= //场景绘制函数
> {
> glClear[], //清除屏幕以及深度缓存
> glLoadIdentity[], //重置视图
> glTranslated[-5,0,-15], //移动坐标
> glColor3d[1,0,0], //设置颜色
> glePrintCn["我的 OpenFC & OpenGL !"]//绘制 中文字符串
> };

[返回本类函数列表] [返回页首] glePrintCnStr[a]：输出中文一维字符数组
该函数速度很慢，但能用来输出汉字和英文。
该函数可能返回如下运行错误：1、无效的字符数组指针；2、不是一维数组。

[例子]

> i::NewStr()=new(wchar_s,EndType,"我的 OpenFC & OpenGL !"); //设置字符数组存放中文字符串
> (::Str)= Str=GetCalByte[NewStr()],gleDrawScene(HFor("Draw")),stop(); //启动场景绘制，就退出
> Draw(::Str)= //场景绘制函数
> {
> glClear[], //清除屏幕以及深度缓存
> glLoadIdentity[], //重置视图
> glTranslated[-5,0,-15], //移动坐标
> glColor3d[1,0,0], //设置颜色
> glePrintCnStr[Str] //绘制中文字符数组
> };

[返回本类函数列表] [返回页首] glePrint["abc 123 !!!"]：输出英文字符串
该函数速度很快，但不能用来输出汉字。
该函数可能返回如下运行错误：1、字符串地址错误。

[例子]

[返回本类函数列表] [返回页首] glePrintStr[a]：输出英文字符数组
该函数速度很快，但不能用来输出汉字。
该函数可能返回如下运行错误：1、无效的字符数组指针；2、不是一维数组。

[例子]

> i::NewStr()=new(wchar_s,EndType,"Hello Forcal & OpenGL !"); //设置字符数组存放 英文字符串
> (::Str)= Str=GetCalByte[NewStr()],gleDrawScene(HFor("Draw")),stop(); //启动场景绘制，就退出
> Draw(::Str)= //场景绘制函数
> {
> glClear[], //清除屏幕以及深度缓存
> glLoadIdentity[], //重置视图
> glTranslated[-5,0,-15], //移动坐标
> glColor3d[1,0,0], //设置颜色
> glePrintStr[Str] //绘制英文字符数组
> };

[返回本类函数列表] [返回页首] gleVirtualKey[n]或gleVirtualKey[n,bool]：键盘状态函数
gleVirtualKey[n]： 获取键盘上键的状态，n为键盘代码，0<=n<256。当键按下时该函数返回1（逻辑真），否则返回0（逻辑假）。

gleVirtualKey[n,bool]：设置键盘上键的状态，n为键盘代码，0<=n<256。将键盘代码设为逻辑值bool。
该函数可能返回如下运行错误：1、键盘代码非法。2、参数不符合要求。
例子：
(::hF,rot)= hF=HFor("f"),rot=0; //获取函数f的句柄，设置一个变量
gleDrawScene[HFor("Scene")],stop(); //设置场景绘制函数后退出
f(x,y)=sin[sqrt(x*x+y*y)];
Scene(:x:hF,rot)=
{
glClear[],
glColor3d[1,0,0], //设置颜色
gleAxesAngle[], //显示坐标和旋转角度
glLoadIdentity[],
glTranslated[0,0,-35],
glColor3d[0,1,0], //设置颜色
glRotated[90,1,0,0], //使图象沿X轴旋转90度
glRotated[gleAngle(1),1,0,0], //可由键盘控制使图象沿X轴旋转
glRotated[gleAngle(2),0,1,0], //可由键盘控制使图象沿Y轴旋转
glRotated[gleAngle(3),0,0,1], //可由键盘控制使图象沿Z轴旋转
x=10*sin[rot],
fgPlot3d[hF,-x,x,-x,x,FG_NOAXES,FG_NOMESH],
glTranslated[-11,0,0],
fgPlot3d[hF,-x,x,-x,x,FG_NOAXES,FG_NOMESH],
glTranslated[22,0,0],
fgPlot3d[hF,-x,x,-x,x,FG_NOAXES,FG_NOMESH],
//如果没有加载WinConst.dll，则VK_CONTROL=17。
if[!gleVirtualKey(VK_CONTROL),rot=rot+0.01] //键盘控制：按Ctrl键可以暂停动画
};
附: 键盘码常量定义

键盘码 | 值（10进制） | 键盘码 | 值（10进制） | 键盘码 | 值（10进制） | 键盘码 | 值（10进制） | 键盘码 | 值（10进制）
VK_LBUTTON | 1 | VK_4 | 52 | VK_NUMPAD7 | 103 |  | 154 |  | 205
VK_RBUTTON | 2 | VK_5 | 53 | VK_NUMPAD8 | 104 |  | 155 |  | 206
VK_CANCEL | 3 | VK_6 | 54 | VK_NUMPAD9 | 105 |  | 156 |  | 207
VK_MBUTTON | 4 | VK_7 | 55 | VK_MULTIPLY | 106 |  | 157 |  | 208
| 5 | VK_8 | 56 | VK_ADD | 107 |  | 158 |  | 209
| 6 | VK_9 | 57 | VK_SEPARATOR | 108 |  | 159 |  | 210
| 7 |  | 58 | VK_SUBTRACT | 109 | VK_LSHIFT | 160 |  | 211
VK_BACK | 8 |  | 59 | VK_DECIMAL | 110 | VK_RSHIFT | 161 |  | 212
VK_TAB | 9 |  | 60 | VK_DIVIDE | 111 | VK_LCONTROL | 162 |  | 213
| 10 |  | 61 | VK_F1 | 112 | VK_RCONTROL | 163 |  | 214
| 11 |  | 62 | VK_F2 | 113 | VK_LMENU | 164 |  | 215
VK_CLEAR | 12 |  | 63 | VK_F3 | 114 | VK_RMENU | 165 |  | 216
VK_RETURN | 13 |  | 64 | VK_F4 | 115 |  | 166 |  | 217
| 14 | VK_A | 65 | VK_F5 | 116 |  | 167 |  | 218
| 15 | VK_B | 66 | VK_F6 | 117 |  | 168 |  | 219
VK_SHIFT | 16 | VK_C | 67 | VK_F7 | 118 |  | 169 |  | 220
VK_CONTROL | 17 | VK_D | 68 | VK_F8 | 119 |  | 170 |  | 221
VK_MENU | 18 | VK_E | 69 | VK_F9 | 120 |  | 171 |  | 222
VK_PAUSE | 19 | VK_F | 70 | VK_F10 | 121 |  | 172 |  | 223
VK_CAPITAL | 20 | VK_G | 71 | VK_F11 | 122 |  | 173 |  | 224
VK_KANA VK_HANGEUL VK_HANGUL | 21 | VK_H | 72 | VK_F12 | 123 |  | 174 |  | 225
| 22 | VK_I | 73 | VK_F13 | 124 |  | 175 |  | 226
VK_JUNJA | 23 | VK_J | 74 | VK_F14 | 125 |  | 176 |  | 227
VK_FINAL | 24 | VK_K | 75 | VK_F15 | 126 |  | 177 |  | 228
VK_HANJA VK_KANJI | 25 | VK_L | 76 | VK_F16 | 127 |  | 178 |  | 229
| 26 | VK_M | 77 | VK_F17 | 128 |  | 179 |  | 230
VK_ESCAPE | 27 | VK_N | 78 | VK_F18 | 129 |  | 180 |  | 231
VK_CONVERT | 28 | VK_O | 79 | VK_F19 | 130 |  | 181 |  | 232
VK_NONCONVERT | 29 | VK_P | 80 | VK_F20 | 131 |  | 182 |  | 233
VK_ACCEPT | 30 | VK_Q | 81 | VK_F21 | 132 |  | 183 |  | 234
VK_MODECHANGE | 31 | VK_R | 82 | VK_F22 | 133 |  | 184 |  | 235
VK_SPACE | 32 | VK_S | 83 | VK_F23 | 134 |  | 185 |  | 236
VK_PRIOR | 33 | VK_T | 84 | VK_F24 | 135 |  | 186 |  | 237
VK_NEXT | 34 | VK_U | 85 |  | 136 |  | 187 |  | 238
VK_END | 35 | VK_V | 86 |  | 137 |  | 188 |  | 239
VK_HOME | 36 | VK_W | 87 |  | 138 |  | 189 |  | 240
VK_LEFT | 37 | VK_X | 88 |  | 139 |  | 190 |  | 241
VK_UP | 38 | VK_Y | 89 |  | 140 |  | 191 |  | 242
VK_RIGHT | 39 | VK_Z | 90 |  | 141 |  | 192 |  | 243
VK_DOWN | 40 | VK_LWIN | 91 |  | 142 |  | 193 |  | 244
VK_SELECT | 41 | VK_RWIN | 92 |  | 143 |  | 194 |  | 245
VK_PRINT | 42 | VK_APPS | 93 | VK_NUMLOCK | 144 |  | 195 | VK_ATTN | 246
VK_EXECUTE | 43 |  | 94 | VK_SCROLL | 145 |  | 196 | VK_CRSEL | 247
VK_SNAPSHOT | 44 |  | 95 |  | 146 |  | 197 | VK_EXSEL | 248
VK_INSERT | 45 | VK_NUMPAD0 | 96 |  | 147 |  | 198 | VK_EREOF | 249
VK_DELETE | 46 | VK_NUMPAD1 | 97 |  | 148 |  | 199 | VK_PLAY | 250
VK_HELP | 47 | VK_NUMPAD2 | 98 |  | 149 |  | 200 | VK_ZOOM | 251
VK_0 | 48 | VK_NUMPAD3 | 99 |  | 150 |  | 201 | VK_NONAME | 252
VK_1 | 49 | VK_NUMPAD4 | 100 |  | 151 |  | 202 | VK_PA1 | 253
VK_2 | 50 | VK_NUMPAD5 | 101 |  | 152 |  | 203 |  | 254
VK_3 | 51 | VK_NUMPAD6 | 102 |  | 153 |  | 204 |  | 255

[返回本类函数列表] [返回页首] gleDeletePrintCnList(n)：删除中文字符串显示列表
n为整数，标识中文字符串显示列表。执行该函数可释放由gleCreatPrintCnList[str]创建中文字符串显示列表时所占的空间。

[例子]

> gleWorkDrawScene(HFor("Draw")),stop(); //启动场景绘制，就退出
> Draw(:i)= //场景绘制函数
> {
> glClear[], //清除屏幕以及深度缓存
> glLoadIdentity[], //重置视图
> glTranslated[-5,0,-15], //移动坐标
> glColor3d[1,0,0], //设置颜色
> i=gleCreatePrintCnList["I love 中文字符串！"], //创建中文字符串显示列表
> glePrintCnList[i], //显示存储在列表中的中文字符串
> gleDeletePrintCnList[i] //删除存储在列表中的中文字符串
> };

[返回本类函数列表] [返回页首] gleCreatePrintCnList[i,str]：创建中文字符串显示列表
将中文字符串str存入显示列表并返回该显示列表的标识n。返回值为0表示创建失败。创建成功后可以用glePrintcnList[n]显示字符串。
该函数每执行一次，都将为指定的字符串创建一个显示列表并返回一个新的标识，即便对同一个字符串也是如此，所以一般不在场景绘制代码（该部分代码被循环执行）中使用该函数。如果在场景绘制代码中使用，要立即调用gleDeletePrintCnList(n)释放空间。
通常在绘图代码中，首先启动OpenFcGl窗口，然后在窗口的初始化代码（该部分代码在窗口启动后仅执行一次）中使用该函数。在场景绘制代码中使用glePrintcnList[n]显示字符串。
如果str为整数，可以设置允许创建的中文显示列表最大数。
该函数可能返回如下运行错误：1、创建的中文显示列表太多。

[例子]

[返回本类函数列表] [返回页首] glePrintCnList[i]：显示存储在列表中的中文字符串
n为整数，标识中文字符串显示列表。该函数的速度比glPrintCn["..."]要快。通常在绘图代码中，首先启动OpenFcGl窗口，然后在窗口的初始化代码（该部分代码在窗口启动后仅执行一次）中使用gleCreatPrintCnList[str]创建中文字符串显示列表；在场景绘制代码（该部分代码被循环执行）中使用glePrintcnList[i]显示中文字符串。
该函数可能返回如下运行错误：1、无法显示列表；2、无法找到指定的显示列表。
[例子]
gleDrawScene(HFor("Scene")),stop[]; //启动绘图窗口，然后stop退出
initScene(::cn1,cn2,cn3)=
{
cn1=gleCreatePrintCnList["I love 中文字符串！"], //将三个字符串存入显示列表
cn2=gleCreatePrintCnList["使用显示列表可以快速地显示中文！"],
cn3=gleCreatePrintCnList["可以旋转的 OpenFcGl 字体！"]
};
Scene(::cn1,cn2,cn3)=
{
if[gleIsInitScene(),initScene()], //需要初始化场景时，就执行初始化函数
glClear[],
glColor3d[1,0,0], //设置颜色
gleAxesAngle[], //显示坐标和旋转角度
glLoadIdentity[],
glTranslated[-8,1,-15],
glePrintCnList[cn1], //显示存储在列表中的中文字符串
glLoadIdentity[],
glTranslated[-8,0,-15],
glePrintCnList[cn2], //显示存储在列表中的中文字符串
glLoadIdentity[],
glTranslated[-8,-2,-15],
glColor3d[0,1,0], //设置颜色
glRotated[gleAngle(1),1,0,0], //使图象沿X轴旋转
glRotated[gleAngle(2),0,1,0], //使图象沿Y轴旋转
glRotated[gleAngle(3),0,0,1], //使图象沿Z轴旋转
glePrintCnList[cn3] //显示存储在列表中的中文字符串
};

[返回本类函数列表] [返回页首] gleIsInitScene()：判断是否需要初始化场景
在第一次执行场景代码之前，或者按F1切换窗口和全屏显示模式时，都需要初始化场景，此时该函数返回1（逻辑真），否则返回0（逻辑假）。
一般在场景绘制代码的开始处使用该函数。

[例子]

[返回本类函数列表] [返回页首] gleGetWindowSize(x,y)：获得绘图窗口尺寸

x为窗口宽度，y为窗口高度。

[例子]

[返回本类函数列表] [返回页首] gleGetMouseMsg(Msg,x,y)：获得鼠标消息

Msg为鼠标消息。x,y为产出此鼠标消息的鼠标位置，以窗口左上角为坐标原点，x表示离原点的水平距离，y表示离原点的垂直距离。

鼠标消息 | 说明
WM_MOUSEMOVE | 鼠标移动
WM_LBUTTONDOWN | 鼠标左键按下
WM_LBUTTONUP | 鼠标左键放开
WM_LBUTTONDBLCLK | 双击鼠标左键
WM_RBUTTONDOWN | 鼠标右键按下
WM_RBUTTONUP | 鼠标右键放开
WM_RBUTTONDBLCLK | 双击鼠标右键
WM_MBUTTONDOWN | 鼠标中键按下
WM_MBUTTONUP | 鼠标中键放开
WM_MBUTTONDBLCLK | 双击鼠标中键

[例子]

(::hF)= hF=HFor("f"); //获得函数f的句柄，保存在模块变量hF中

gleDrawScene(HFor("Scene")),stop(); //启动场景绘制，就退出

f(x)=x*sin[x]; //一元函数定义

Scene(:x,y,xx,yy,a:hF)=
{
glClear[], //清除屏幕以及深度缓存
glLoadIdentity[], //重置视图
if[gleGetMouseMsg(WM_LBUTTONDOWN,&x,&y),a=1],
if[gleGetMouseMsg(WM_LBUTTONUP,0,1),a=0],
gleGetWindowSize[&xx,&yy],
glTranslated[(x-xx/2)/100,(yy/2-y)/100,-10], //移动坐标
glColor3d[1,x/xx,y/yy], //设置颜色
if{a,fgPlot[hF,-x,y,FG_AXES,-3,3,-2,2]}, //绘制一元函数图象
glePrintCn["按鼠标左键"]
};

[返回本类函数列表] [返回页首] gleAxis(GetXYZ)或gleAxis(XYZ,SetXYZ)或gleAxis(SetX,SetY,SetZ)：设置或获得OpenGl屏幕坐标

gleAxis(GetXYZ)：GetXYZ=1时获得屏幕X坐标，X坐标水平方向，向右为正。GetXYZ=2时获得屏幕Y坐标，Y坐标垂直方向，向上为正。GetXYZ=3时获得屏幕Z坐标，Z坐标前后方向，向前（屏幕外）为正。返回值为相应坐标的最新值。

gleAxis(XYZ,SetXYZ)：XYZ=1时设置屏幕X坐标为SetXYZ。XYZ=2时设置屏幕Y坐标为SetXYZ。XYZ=3时设置屏幕Z坐标为SetXYZ。返回值为相应坐标的最新值。

gleAxis(SetX,SetY,SetZ)：设置屏幕坐标X=SetX,Y=SetY,Z=SetZ。返回值为0。

[例子]

gleDrawScene(HFor("Draw")),stop(); //启动场景绘制，就退出
initScene()= //定义初始化函数
{
gleAxis(-5,0,-15) //设置窗口模式
};
Draw()= //场景绘制函数
{
if[gleIsInitScene(),initScene()], //需要初始化场景时，就执行初始化函数
glClear[], //清除屏幕以及深度缓存
glLoadIdentity[], //重置视图
glColor3d[1,0,0], //设置颜色
glePrint["Hello OpenFcGl !"] //绘制英文字符串
};

[返回本类函数列表] [返回页首] gleClear()：清除申请的空间

该函数删除以前申请但现在已无用的空间。

[例子]

[返回本类函数列表] [返回页首] gleSetWindowMode(GLE_ParentWindow,hParentWindow,GLE_WindowStyle,WindowStyle,... ...)：设置窗口模式

该函数用于设置OpenFcGl窗口模式。设置窗口模式后仅在切换窗口时起作用。 该函数可一次设置多组参数，每组参数的第一个标识参数的类型，后面紧跟着参数值。参数标识及参数值的意义如下所示。

参数标识 | 参数值 | 说明
GLE_ParentWindow | hParentWindow | 父窗口句柄
GLE_WindowClassStyle | WindowClassStyle | 窗口类样式
GLE_FullWindowExStyle | FullWindowExStyle | 全屏窗口扩展样式。请参考窗口扩展样式
GLE_FullWindowStyle | FullWindowStyle | 全屏窗口样式，在计算窗口矩形大小时使用。请参考窗口样式
GLE_WindowExStyle | WindowExStyle | 窗口扩展样式
GLE_WindowStyle | WindowStyle | 窗口样式，在计算窗口矩形大小时使用
GLE_WindowOtherStyle | WindowOtherStyle | 窗口其他样式，真正的窗口样式为WindowExStyle（或FullWindowStyle）和WindowOtherStyle的组合。请参考窗口样式
GLE_WindowPosition | WindowX，WindowY | 窗口位置
GLE_WindowWidthAndHeight | WindowWidth，WindowHeight | 窗口的宽度和高度
GLE_WindowBits | WindowBits | 窗口像素位数

窗口类样式：

Style | Action
--- | ---
CS_BYTEALIGNCLIENT | Aligns the window's client area on a byte boundary (in the x direction). This style affects the width of the window and its horizontal placement on the display.
CS_BYTEALIGNWINDOW | Aligns the window on a byte boundary (in the x direction). This style affects the width of the window and its horizontal placement on the display.
CS_CLASSDC | Allocates one device context to be shared by all windows in the class. Because window classes are process specific, it is possible for multiple threads of an application to create a window of the same class. It is also possible for the threads to attempt to use the device context simultaneously. When this happens, the system allows only one thread to successfully finish its drawing operation.
CS_DBLCLKS | Sends a double-click message to the window procedure when the user double-clicks the mouse while the cursor is within a window belonging to the class.
CS_DROPSHADOW | Windows XP: Enables the drop shadow effect on a window. The effect is turned on and off through SPI_SETDROPSHADOW. Typically, this is enabled for small, short-lived windows such as menus to emphasize their Z order relationship to other windows.
CS_GLOBALCLASS | Specifies that the window class is an application global class.
CS_HREDRAW | Redraws the entire window if a movement or size adjustment changes the width of the client area.
CS_NOCLOSE | Disables Close on the window menu.
CS_OWNDC | Allocates a unique device context for each window in the class.
CS_PARENTDC | Sets the clipping rectangle of the child window to that of the parent window so that the child can draw on the parent. A window with the CS_PARENTDC style bit receives a regular device context from the system's cache of device contexts. It does not give the child the parent's device context or device context settings. Specifying CS_PARENTDC enhances an application's performance.
CS_SAVEBITS | Saves, as a bitmap, the portion of the screen image obscured by a window of this class. When the window is removed, the system uses the saved bitmap to restore the screen image, including other windows that were obscured. Therefore, the system does not send WM_PAINT messages to windows that were obscured if the memory used by the bitmap has not been discarded and if other screen actions have not invalidated the stored image. This style is useful for small windows (for example, menus or dialog boxes) that are displayed briefly and then removed before other screen activity takes place. This style increases the time required to display the window, because the system must first allocate memory to store the bitmap.
CS_VREDRAW | Redraws the entire window if a movement or size adjustment changes the height of the client area.

窗口扩展样式：

Specifies the extended window style of the window being created. This parameter can be one or more of the following values.

  WS_EX_ACCEPTFILES
    Specifies that a window created with this style accepts drag-drop files.
  WS_EX_APPWINDOW
    Forces a top-level window onto the taskbar when the window is visible.
  WS_EX_CLIENTEDGE
    Specifies that a window has a border with a sunken edge.
  WS_EX_COMPOSITED
    Windows XP: Paints all descendants of a window in bottom-to-top painting order using double-buffering. For more information, see Remarks. This cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
  WS_EX_CONTEXTHELP
    Includes a question mark in the title bar of the window. When the user clicks the question mark, the cursor changes to a question mark with a pointer. If the user then clicks a child window, the child receives a WM_HELP message. The child window should pass the message to the parent window procedure, which should call the WinHelp function using the HELP_WM_HELP command. The Help application displays a pop-up window that typically contains help for the child window.
    WS_EX_CONTEXTHELP cannot be used with the WS_MAXIMIZEBOX or WS_MINIMIZEBOX styles.
  WS_EX_CONTROLPARENT
    The window itself contains child windows that should take part in dialog box navigation. If this style is specified, the dialog manager recurses into children of this window when performing navigation operations such as handling the TAB key, an arrow key, or a keyboard mnemonic.
  WS_EX_DLGMODALFRAME
    Creates a window that has a double border; the window can, optionally, be created with a title bar by specifying the WS_CAPTION style in the dwStyle parameter.
  WS_EX_LAYERED
    Windows 2000/XP: Creates a layered window. Note that this cannot be used for child windows. Also, this cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
  WS_EX_LAYOUTRTL
    Arabic and Hebrew versions of Windows 98/Me, Windows 2000/XP: Creates a window whose horizontal origin is on the right edge. Increasing horizontal values advance to the left.
  WS_EX_LEFT
    Creates a window that has generic left-aligned properties. This is the default.
  WS_EX_LEFTSCROLLBAR
    If the shell language is Hebrew, Arabic, or another language that supports reading order alignment, the vertical scroll bar (if present) is to the left of the client area. For other languages, the style is ignored.
  WS_EX_LTRREADING
    The window text is displayed using left-to-right reading-order properties. This is the default.
  WS_EX_MDICHILD
    Creates a multiple-document interface (MDI) child window.
  WS_EX_NOACTIVATE
    Windows 2000/XP: A top-level window created with this style does not become the foreground window when the user clicks it. The system does not bring this window to the foreground when the user minimizes or closes the foreground window.
    To activate the window, use the SetActiveWindow or SetForegroundWindow function.
    The window does not appear on the taskbar by default. To force the window to appear on the taskbar, use the WS_EX_APPWINDOW style.
  WS_EX_NOINHERITLAYOUT
    Windows 2000/XP: A window created with this style does not pass its window layout to its child windows.
  WS_EX_NOPARENTNOTIFY
    Specifies that a child window created with this style does not send the WM_PARENTNOTIFY message to its parent window when it is created or destroyed.
  WS_EX_OVERLAPPEDWINDOW
    Combines the WS_EX_CLIENTEDGE and WS_EX_WINDOWEDGE styles.
  WS_EX_PALETTEWINDOW
    Combines the WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW, and WS_EX_TOPMOST styles.
  WS_EX_RIGHT
    The window has generic "right-aligned" properties. This depends on the window class. This style has an effect only if the shell language is Hebrew, Arabic, or another language that supports reading-order alignment; otherwise, the style is ignored.
    Using the WS_EX_RIGHT style for static or edit controls has the same effect as using the SS_RIGHT or ES_RIGHT style, respectively. Using this style with button controls has the same effect as using BS_RIGHT and BS_RIGHTBUTTON styles.
  WS_EX_RIGHTSCROLLBAR
    Vertical scroll bar (if present) is to the right of the client area. This is the default.
  WS_EX_RTLREADING
    If the shell language is Hebrew, Arabic, or another language that supports reading-order alignment, the window text is displayed using right-to-left reading-order properties. For other languages, the style is ignored.
  WS_EX_STATICEDGE
    Creates a window with a three-dimensional border style intended to be used for items that do not accept user input.
  WS_EX_TOOLWINDOW
    Creates a tool window; that is, a window intended to be used as a floating toolbar. A tool window has a title bar that is shorter than a normal title bar, and the window title is drawn using a smaller font. A tool window does not appear in the taskbar or in the dialog that appears when the user presses ALT+TAB. If a tool window has a system menu, its icon is not displayed on the title bar. However, you can display the system menu by right-clicking or by typing ALT+SPACE.
  WS_EX_TOPMOST
    Specifies that a window created with this style should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. To add or remove this style, use the SetWindowPos function.
  WS_EX_TRANSPARENT
    Specifies that a window created with this style should not be painted until siblings beneath the window (that were created by the same thread) have been painted. The window appears transparent because the bits of underlying sibling windows have already been painted.
    To achieve transparency without these restrictions, use the SetWindowRgn function.
  WS_EX_WINDOWEDGE
    Specifies that a window has a border with a raised edge.

窗口样式：

Specifies the window style of the window being created. This parameter can be one or more of the following values.

> WS_BORDER
>   Creates a window that has a thin-line border.
> WS_CAPTION
>   Creates a window that has a title bar (includes the WS_BORDER style).
> WS_CHILD
>   Creates a child window. A window with this style cannot have a menu bar. This style cannot be used with the WS_POPUP style.
> WS_CHILDWINDOW
>   Same as the WS_CHILD style.
> WS_CLIPCHILDREN
>   Excludes the area occupied by child windows when drawing occurs within the parent window. This style is used when creating the parent window.
> WS_CLIPSIBLINGS
>   Clips child windows relative to each other; that is, when a particular child window receives a WM_PAINT message, the WS_CLIPSIBLINGS style clips all other overlapping child windows out of the region of the child window to be updated. If WS_CLIPSIBLINGS is not specified and child windows overlap, it is possible, when drawing within the client area of a child window, to draw within the client area of a neighboring child window.
> WS_DISABLED
>   Creates a window that is initially disabled. A disabled window cannot receive input from the user. To change this after a window has been created, use EnableWindow.
> WS_DLGFRAME
>   Creates a window that has a border of a style typically used with dialog boxes. A window with this style cannot have a title bar.
> WS_GROUP
>   Specifies the first control of a group of controls. The group consists of this first control and all controls defined after it, up to the next control with the WS_GROUP style. The first control in each group usually has the WS_TABSTOP style so that the user can move from group to group. The user can subsequently change the keyboard focus from one control in the group to the next control in the group by using the direction keys.
>   You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use SetWindowLong.
> WS_HSCROLL
>   Creates a window that has a horizontal scroll bar.
> WS_ICONIC
>   Creates a window that is initially minimized. Same as the WS_MINIMIZE style.
> WS_MAXIMIZE
>   Creates a window that is initially maximized.
> WS_MAXIMIZEBOX
>   Creates a window that has a maximize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
> WS_MINIMIZE
>   Creates a window that is initially minimized. Same as the WS_ICONIC style.
> WS_MINIMIZEBOX
>   Creates a window that has a minimize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
> WS_OVERLAPPED
>   Creates an overlapped window. An overlapped window has a title bar and a border. Same as the WS_TILED style.
> WS_OVERLAPPEDWINDOW
>   Creates an overlapped window with the WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, and WS_MAXIMIZEBOX styles. Same as the WS_TILEDWINDOW style.
> WS_POPUP
>   Creates a pop-up window. This style cannot be used with the WS_CHILD style.
> WS_POPUPWINDOW
>   Creates a pop-up window with WS_BORDER, WS_POPUP, and WS_SYSMENU styles. The WS_CAPTION and WS_POPUPWINDOW styles must be combined to make the window menu visible.
> WS_SIZEBOX
>   Creates a window that has a sizing border. Same as the WS_THICKFRAME style.
> WS_SYSMENU
>   Creates a window that has a window menu on its title bar. The WS_CAPTION style must also be specified.
> WS_TABSTOP
>   Specifies a control that can receive the keyboard focus when the user presses the TAB key. Pressing the TAB key changes the keyboard focus to the next control with the WS_TABSTOP style.
>   You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use SetWindowLong.
> WS_THICKFRAME
>   Creates a window that has a sizing border. Same as the WS_SIZEBOX style.
> WS_TILED
>   Creates an overlapped window. An overlapped window has a title bar and a border. Same as the WS_OVERLAPPED style.
> WS_TILEDWINDOW
>   Creates an overlapped window with the WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, and WS_MAXIMIZEBOX styles. Same as the WS_OVERLAPPEDWINDOW style.
> WS_VISIBLE
>   Creates a window that is initially visible.
>   This style can be turned on and off by using ShowWindow or SetWindowPos.
> WS_VSCROLL
>   Creates a window that has a vertical scroll bar.

该函数可能返回如下运行错误：1、不可识别关键字。2、参数不符合要求。

[例子]

[返回本类函数列表] [返回页首] gleSetWindowText("abc")：设置窗口标题

将绘图窗口的标题设为指定的字符串。

该函数可能返回如下运行错误：1、参数必须为字符串。

[例子]

gleDrawScene(HFor("Draw")),stop(); //启动场景绘制，就退出
initScene()= //定义初始化函数
{
gleSetWindowText("abc") //设置窗口标题
};
Draw()= //场景绘制函数
{
if[gleIsInitScene(),initScene()], //需要初始化场景时，就执行初始化函数
glClear[], //清除屏幕以及深度缓存
glLoadIdentity[], //重置视图
glTranslated[-5,0,-15], //移动坐标
glColor3d[1,0,0], //设置颜色
glePrint["Hello OpenFcGl !"] //绘制英文字符串
};

[返回本类函数列表] [返回页首] gleShowCursor(bool)：显示或隐藏光标

bool为逻辑真时显示光标，bool为逻辑假时隐藏光标。

[例子]

gleDrawScene(HFor("Draw")),stop(); //启动场景绘制，就退出
initScene()= //定义初始化函数
{
gleShowCursor(0) //隐藏光标
};
Draw()= //场景绘制函数
{
if[gleIsInitScene(),initScene()], //需要初始化场景时，就执行初始化函数
glClear[], //清除屏幕以及深度缓存
glLoadIdentity[], //重置视图
glTranslated[-5,0,-15], //移动坐标
glColor3d[1,0,0], //设置颜色
glePrint["Hello OpenFcGl !"] //绘制英文字符串
};

[返回本类函数列表] [返回页首] gleOr(i1,i2,... ...)：按位或函数

求无符号整数i1,i2,... ...的按位或。

[例子]

glClear[gleOr(GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT)] //清除屏幕以及深度缓存

[返回本类函数列表] [返回页首] gleCalFor("f",x1,x2,...,xn)：在运行时调用实数表达式

在运行时调用实数表达式"f"，x1,x2,...,xn为表达式的参数。

该函数可能返回如下运行错误：1、没有参数；2、参数不匹配；3、需要字符串指出表达式名称。

注意：在找不到表达式时，该函数并不返回运行错误。

[例子]

ff(x)=222; //定义实数表达式
gleCalFor("ff",111); //调用表达式"ff"，返回222

[返回本类函数列表] [返回页首] gleMessageBox["消息框中显示的字符串","作为标题的字符串"]：消息框函数

格式1：gleMessageBox["消息框中显示的字符串","作为标题的字符串"]
格式2：gleMessageBox["消息框中显示的字符串","作为标题的字符串",nType]
格式3：gleMessageBox[HWND,"消息框中显示的字符串","作为标题的字符串",nType]
说明：HWND标识将被创建的消息框的拥有窗口，如果此参数为0，则消息框没有拥有窗口；nType指定一个决定对话框的内容和行为的位标志集，此参数可以为下列标志组中标志的组合：
MB_OK
MB_OKCANCEL
MB_YESNO
MB_YESNOCANCEL
其他标志请参考WINDOWS API手册中该函数的说明。
返回值：如果没有足够的内存来创建消息框，则返回值为0。如果函数调用成功，则返回值为下列对话框返回的菜单项目值中的一个：
IDABORT：Abort按钮被选中。
IDCANCEL：Cancel按钮被选中。
IDIGNORE：Ignore按钮被选中。
IDNO：NO按钮被选中。
IDOK：OK按钮被选中。
IDRETRY：RETRY按钮被选中。
IDYES：YES按钮被选中。
标志和返回值的具体值请参考WINDOWS API手册，也可以自行验证。
该函数可能返回如下运行错误：1：参数设置不符合要求；2：指定的字符串不存在。

[返回本类函数列表] [返回页首] gleReSetPara("x1",&x1,"x2",&x2,... ...)：重置参数

该函数打开一个模态窗口对指定的参数进行重新设置。该函数的参数必须成对，每对参数中，第一个参数为字符串，对第二个参数进行说明，第二个参数为要修改的参数，第二个参数必须用引用方式传递。

该函数可能返回如下运行错误：1：没有参数或参数不成对；2：每对参数中，第一个参数必须为字符串。

[例子]

[返回本类函数列表] [返回页首] gleFindWindow("ClassName","WindowName")或gleFindWindow(hwndParent,hwndChildAfter,"ClassName","WindowName")：获得一个（顶层）窗口的句柄

格式1：gleFindWindow("ClassName","WindowName")：获得一个顶层窗口的句柄
格式1：gleFindWindow(hwndParent,hwndChildAfter,"ClassName","WindowName")：获得一个窗口的句柄

说明：hwndParent为要查找子窗口的父窗口的句柄。hwndChildAfter为子窗口句柄，查找从在Z序中的下一个子窗口开始，子窗口必须为hwndParent的直接子窗口而非后代窗口。"ClassName"为窗口类名字符串。"WindowName"为窗口标题字符串。

该函数可能返回如下运行错误：1：参数不符合要求；2：窗口类名和窗口标题必须为字符串。

[例子]

initScene()= //定义初始化函数
{ gleSetWindowMode( //设置窗口模式。预先启动Explorer，不打开任何网页，使窗口标题如下，OpenFcGl窗口将成为Explorer的子窗口
GLE_ParentWindow,gleFindWindow("IEFrame","about:blank - Microsoft Internet Explorer"),
GLE_WindowPosition,50,200,
GLE_WindowWidthAndHeight,500,300
)
};
gleDrawScene(HFor("Draw")),initScene(),stop(); //启动场景绘制，就退出。注意initScene()的位置
Draw()= //场景绘制函数
{
if[gleIsInitScene(),initScene()], //需要初始化场景时，就执行初始化函数
gleMoveWindow[], //移动窗口
glClear[], //清除屏幕以及深度缓存
glLoadIdentity[], //重置视图
glTranslated[-5,0,-15], //移动坐标
glColor3d[1,0,0], //设置颜色
glePrint["Hello OpenFcGl !"] //绘制英文字符串
};

[返回本类函数列表] [返回页首] gleRegConstState()：检查常量注册情况

该函数检查OpenFcGl向Forcal注册常量的情况，仅显示未注册的常量。

[返回本类函数列表] [返回页首] gleMoveWindow()、gleMoveWindow(x)、gleMoveWindow(Wx,Wy,Width,Height)或gleMoveWindow(Wx,Wy,Width,Height,x)：移动窗口，改变窗口的位置和尺寸

格式1：gleMoveWindow()：OpenFcGl窗口的实际位置坐标为窗口原来的位置坐标与父窗口位置坐标之和。
格式2：gleMoveWindow(x)：OpenFcGl窗口的实际位置坐标即窗口原来的位置坐标。
格式3：gleMoveWindow(Wx,Wy,Width,Height)：OpenFcGl窗口的实际位置坐标为指定的坐标值Wx,Wy与父窗口位置坐标之和。
格式4：gleMoveWindow(Wx,Wy,Width,Height,x)：OpenFcGl窗口的实际位置坐标即指定的坐标值Wx,Wy。

说明：Wx,Wy为新指定的窗口位置。Width,Height为新指定的窗口宽度和高度。x为任意值。OpenFcGl窗口 的实际位置坐标指gleMoveWindow()函数内部调用API函数MoveWindow()时用的实际位置参数。

该函数可能返回如下运行错误：1：参数个数不符合要求。

[例子]

gleDrawScene(HFor("Draw")),stop(); //启动场景绘制，就退出
Draw(::xx,ii)= //场景绘制函数
{
if[xx>=500,ii=-0.1,xx=500],if[xx<=100,ii=0.1,xx=100],xx=xx+ii,
gleMoveWindow[xx,200,xx,300], //移动窗口
glClear[], //清除屏幕以及深度缓存
glLoadIdentity[], //重置视图
glTranslated[-5,0,-15], //移动坐标
glColor3d[1,0,0], //设置颜色
glePrint["Hello OpenFcGl !"] //绘制英文字符串
};

[返回本类函数列表] [返回页首] gleSaveScene()：将OpenFcGl图像保存为文件

该函数将OpenFcGl图像保存为文件。仅支持BMP文件。

11 fg函数 ：实用绘图函数 [返回页首]

类别 | 函数 | 用途 | 使用位置 | 函数种类 | 其他
fg | fgMesh | 绘制二维网格 | 场景绘制函数 | 实数函数 |
fg | fgMesh3d | 绘制三维网格 | 场景绘制函数 | 实数函数 |
fg | fgPlot | 绘制一元函数图象 | 场景绘制函数 | 实数函数 |
fg | fgParaPlot | 绘制平面曲线的参数方程图象 | 场景绘制函数 | 实数函数 |
fg | fgPlot3d | 绘制二元函数图象 | 场景绘制函数 | 实数函数 |
fg | fgParaPlot3d | 绘制三维参数方程图象 | 场景绘制函数 | 实数函数 |

[返回本类函数列表] [返回页首] fgMesh(X1,X2,Y1,Y2,x1,x2,y1,y2)：绘制二维网格。
说明：绘制二维网格(X1,X2,Y1,Y2)，每个坐标轴10等分；(x1,x2,y1,y2)将标注在坐标轴上。

例子：
gleDrawScene[HFor("Scene")],stop(); //设置场景绘制函数后退出
Scene()=
{
glClear[], //清除屏幕以及深度缓存
glLoadIdentity[], //重置视图
glTranslated[0,0,-30], //移动坐标
glColor3d[1,0,0], //设置颜色
fgMesh[-10,10,-10,10,-5,5,-8,8] //绘制三维网格
};

[返回本类函数列表] [返回页首] fgMesh3d(X1,X2,Y1,Y2,Z1,Z2,x1,x2,y1,y2,z1,z2)：绘制三维网格。
说明：绘制三维网格(X1,X2,Y1,Y2,Z1,Z2)，每个坐标轴10等分；(x1,x2,y1,y2,z1,z2)将标注在坐标轴上。

例子：
gleDrawScene[HFor("Scene")],stop(); //设置场景绘制函数后退出
Scene()=
{
glClear[], //清除屏幕以及深度缓存
glLoadIdentity[], //重置视图
glTranslated[0,0,-30], //移动坐标
glColor3d[1,0,0], //设置颜色
fgMesh3d[-10,10,-10,10,0,-20,-2,2,-5,5,-8,8] //绘制三维网格
};

[返回本类函数列表] [返回页首] fgPlot[]：绘制一元函数图象
fgPlot[hF,-15,15,FG_Y,-20,20,FG_AXES,-5,5,-3,3,FG_PLOTPOINTS,500,FG_CUT,FG_NOAXES,FG_NODRAW];
说明：hF为已经定义的一元函数句柄，必须由函数HFor获得该句柄；-15,15为自变量范围；FG_Y,-20,20为函数值范围，若缺省函数值范围，则自动生成自变量区间内的完整图象；FG_AXES,-5,5,-3,3设定屏幕坐标上的绘图区域，缺省的绘图区域是-5,5,-5,5；FG_PLOTPOINTS,500设定了自变量的分割数目，缺省的分割数目为1000；FG_CUT表示将切除绘图区域外的线段，缺省是将绘图区域外的线段绘制在绘图区域的边界上；FG_NOAXES表示不绘制坐标轴，缺省是绘制坐标轴；FG_NODRAW表示不绘制函数图象，只绘制坐标轴，缺省是既绘制图象又绘制坐标轴。FG_Y、FG_AXES、FG_PLOTPOINTS、FG_CUT、FG_NOAXES、FG_NODRAW是可选项。
该函数可能返回如下运行错误：
1、参数不匹配；
2、不可识别的描述符；
3、非法的表达式句柄；
4、指定的表达式不是一元函数；
例子：
(::hF)= hF=HFor("f"); //获得函数f的句柄，保存在模块变量hF中

gleDrawScene[HFor("Scene")],stop(); //设置场景绘制函数后退出
f(x)=x*sin[x]; //一元函数定义

Scene(::hF)=
{
glClear[], //清除屏幕以及深度缓存
glLoadIdentity[], //重置视图
glTranslated[0,0,-10], //移动坐标，向屏幕里移动10个单元
glColor3d[1,0,0], //设置颜色
fgPlot[hF,-10,10,FG_AXES,-3,3,-2,2] //绘制一元函数图象
};

[返回本类函数列表] [返回页首] fgParaPlot[]：绘制平面曲线的参数方程图象
fgParaPlot[hX,hY,-15,15,FG_XY,-15,15,-20,20,FG_AXES,-5,5,-3,3,FG_PLOTPOINTS,500,FG_CUT,FG_NOAXES,FG_NODRAW];
说明：hX,hY为已经定义的参数方程句柄，必须由函数HFor获得该句柄；-15,15为自变量范围；FG_XY,-15,15,-20,20限定X和Y的变化范围，若缺省此项，则自动生成自变量区间内的完整图象；FG_AXES,-5,5,-3,3设定屏幕坐标上的绘图区域，缺省的绘图区域是-5,5,-5,5；FG_PLOTPOINTS,500设定了自变量的分割数目，缺省的分割数目为1000；FG_CUT表示将切除绘图区域外的线段，缺省是将绘图区域外的线段绘制在绘图区域的边界上；FG_NOAXES表示不绘制坐标轴，缺省是绘制坐标轴；FG_NODRAW表示不绘制函数图象，只绘制坐标轴，缺省是既绘制图象又绘制坐标轴。FG_XY、FG_AXES、FG_PLOTPOINTS、FG_CUT、FG_NOAXES、FG_NODRAW是可选项。
该函数可能返回如下运行错误：
1、参数不匹配；
2、不可识别的描述符；
3、非法的表达式句柄；
4、指定的表达式不是一元函数；
例子：
(::hX,hY)= hX=HFor("X"),hY=HFor("Y"); //获得函数X和Y的句柄，保存在模块变量hX,hY中

gleDrawScene[HFor("Scene")],stop(); //设置场景绘制函数后退出
X(x)=sin[x]^3; //X参数定义
Y(x)=cos[x]^3; //Y参数定义
Scene(::hX,hY)=
{
glClear[], //清除屏幕以及深度缓存
glLoadIdentity[], //重置视图
glTranslated[0,0,-15], //移动坐标，向屏幕里移动15个单元
glColor3d[1,0,0], //设置颜色
fgParaPlot[hX,hY,0,10] //绘制绘制平面曲线的参数方程图象
};

[返回本类函数列表] [返回页首] fgPlot3d[]：绘制二元函数图象
fgPlot3d[hF,-5,5,-6,6,FG_Z,-2,2,FG_AXES,-3,5,-3,6,-6,0,FG_PLOTPOINTS,50,30,FG_CUT,FG_NOAXES,FG_NOMESH,FG_NODRAW];
说明：hF为已经定义的二元函数句柄，必须由函数HFor获得该句柄；-5,5为x的变化范围，-6,6为y的变化范围；FG_Z,-2,2为z的变化范围，若缺省此项，则自动生成自变量区间内的完整图象；FG_AXES,-3,5,-3,6,-6,0设定屏幕坐标上的绘图区域，-3,5设定X轴的位置，-3,6设定Y轴的位置，-6,0设定Z轴的位置，缺省的绘图区域是-5,5,-5,5,-5,5；FG_PLOTPOINTS,50,30中的50和30设定了x和y的分割数目，缺省的分割数目分别是50和50；FG_CUT表示将切除绘图区域外的图象，缺省是将绘图区域外的图象绘制在绘图区域的边界上；FG_NOAXES表示不绘制坐标轴，缺省是绘制坐标轴；FG_NOMESH表示不绘制网格，缺省是绘制网格；FG_NODRAW表示不绘制函数图象，只绘制坐标轴，缺省是既绘制图象又绘制坐标轴。FG_Z、FG_AXES、FG_PLOTPOINTS、FG_CUT、FG_NOAXES、FG_NOMESH、FG_NODRAW是可选项。
该函数可能返回如下运行错误：
1、参数不匹配；
2、不可识别的描述符；
3、非法的表达式句柄；
4、指定的表达式不是二元函数；
例子：
(::hF,rot)= hF=HFor("f"),rot=0; //获得函数f的句柄，保存在模块变量hF中；模块变量rot 使图象连续旋转

gleDrawScene[HFor("Scene")],stop(); //设置场景绘制函数后退出
f(x,y)=(x^2-2*x)*exp(-x*x-y^2-x*y);

Scene(::hF,rot)=
{
glClear[],
glLoadIdentity[],
glTranslated[0,0,-20],
glColor3d[0,1,0], //设置颜色
glRotated[rot++,1,1,1], //使图象连续旋转
fgPlot3d[hF,-3,3,-3,3]
};

[返回本类函数列表] [返回页首] fgParaPlot3d[]：绘制三维参数方程图象
fgParaPlot3d[hX,hY,hZ,-5,5,-6,6,FG_XYZ,-3,3,-5,5,-2,2,FG_AXES,-3,5,-3,6,-6,0,FG_PLOTPOINTS,50,30,FG_CUT,FG_NOAXES,FG_NOMESH,FG_NODRAW];
说明：hX,hY,hZ为已经定义的参数方程句柄，必须由函数HFor获得该句柄；-5,5为x的变化范围，-6,6为y的变化范围；FG_XYZ,-3,3,-5,5,-2,2为限定的"X","Y","Z"的变化范围，若缺省此项，则自动生成自变量区间内的完整图象；FG_AXES,-3,5,-3,6,-6,0设定屏幕坐标上的绘图区域，-3,5设定X轴的位置，-3,6设定Y轴的位置，-6,0设定Z轴的位置，缺省的绘图区域是-5,5,-5,5,-5,5；FG_PLOTPOINTS,50,30中的50和30设定了x和y的分割数目，缺省的分割数目分别是50和50；FG_CUT表示将切除绘图区域外的图象，缺省是将绘图区域外的图象绘制在绘图区域的边界上；FG_NOAXES表示不绘制坐标轴，缺省是绘制坐标轴；FG_NOMESH表示不绘制网格，缺省是绘制网格；FG_NODRAW表示不绘制函数图象，只绘制坐标轴，缺省是既绘制图象又绘制坐标轴。FG_XYZ、FG_AXES、FG_PLOTPOINTS、FG_CUT、FG_NOAXES、FG_NOMESH、FG_NODRAW是可选项。
该函数可能返回如下运行错误：
1、参数不匹配；
2、不可识别的描述符；
3、非法的表达式句柄；
4、指定的表达式不是二元函数；
例子：
(::hx,hy,hz,Rotate)= hx=HFor("x"),hy=HFor("y"),hz=HFor("z"),Rotate=0; //获得函数x，y和z的句柄，保存在模块变量hx,hy和hz中；模块变量Rotate使图象连续旋转

gleDrawScene[HFor("Scene")],stop(); //设置场景绘制函数后退出
x(x,y)=[2-cos[x]]*cos[y];
y(x,y)=[2-cos[x]]*sin[y];
z(x,y)=sin[x];
Scene(::hx,hy,hz,Rotate)=
{
glClear[],
glLoadIdentity[],
glTranslated[0,0,-20],
glColor3d[0,1,0], //设置颜色
glRotated[Rotate++,1,1,1], //使图象连续旋转
fgParaPlot3d[hx,hy,hz,-3,3,-3,3]
};

版权所有© Forcal程序设计 2002-2010，保留所有权利
E-mail: forcal@sina.com QQ：630715621
最近更新: 2010年02月21日