FLTK学习-4-使用FLUID编程(2)
来源:互联网 发布:淘宝隐藏券怎么找 编辑:程序博客网 时间:2024/06/06 02:29
11.5.1 CubeView类
CubeView类是Fl_Gl_Window的子类。该类具有设置缩放,x、y平移【摇动镜头??】以及x、y轴旋转角的方法。
如果你认识到CubeView只是由FLUID生成的Fl_Gl_Window的一个子类并且会对CubeViewUI的调用产生响应,那么你可以放心的忽略本节。
CubeView类声明
下面是在头文件test/CubeView.h中的CubeView的类声明。
- class CubeView : public Fl_Gl_Window {
- public:
- CubeView(int x,int y,int w,int h,const char* l=0);
- //这个值决定画立方体的缩放比例
- double size;
- /*设置垂直轴(y轴)的旋转。该函数被CubeViewUI的水平滚轴和CubeViewUI的初始化按钮调用*/
- void v_angle(float angle){vAng=angle;};
- // 返回垂直轴的旋转角
- float v_angle(){return vAng;};
- /*设置水平轴(x轴)的旋转。该函数被CubeViewUI的垂直滚轴和CubeViewUI的初始化按钮调用*/
- void h_angle(float angle){hAng=angle;};
- //返回垂直轴的旋转角
- float h_angle(){return hAng;};
- /*设置立方体视角的x偏移,该函数被CubeViewUI的滑动块和CubeView的初始化按钮调用*/
- void panx(float x){xshift=x;};
- /*设置立方体视角的y偏移,该函数被CubeViewUI的滑动块和CubeView的初始化按钮调用*/
- void pany(float y){yshift=y;};
- /*构件基类的draw()函数的重载,draw()函数用另一轮的画图初始化GL,然后调用专门的函数画出立方体视图中的每个实体【??】*/
- void draw();
- private:
- /*画立方体的边界,使用boxv[]顶点和GL_LINE_LOOP画立方体的面【??】,颜色由CUBECOLOR宏定义指定*/
- void drawCube();
- float vAng,hAng; float xshift,yshift;
- float boxv0[3];float boxv1[3]; float boxv2[3];float boxv3[3];
- float boxv4[3];float boxv5[3]; float boxv6[3];float boxv7[3];
- };
class CubeView : public Fl_Gl_Window {public:CubeView(int x,int y,int w,int h,const char* l=0);//这个值决定画立方体的缩放比例double size;/*设置垂直轴(y轴)的旋转。该函数被CubeViewUI的水平滚轴和CubeViewUI的初始化按钮调用*/void v_angle(float angle){vAng=angle;};// 返回垂直轴的旋转角float v_angle(){return vAng;};/*设置水平轴(x轴)的旋转。该函数被CubeViewUI的垂直滚轴和CubeViewUI的初始化按钮调用*/void h_angle(float angle){hAng=angle;};//返回垂直轴的旋转角float h_angle(){return hAng;};/*设置立方体视角的x偏移,该函数被CubeViewUI的滑动块和CubeView的初始化按钮调用*/void panx(float x){xshift=x;};/*设置立方体视角的y偏移,该函数被CubeViewUI的滑动块和CubeView的初始化按钮调用*/void pany(float y){yshift=y;};/*构件基类的draw()函数的重载,draw()函数用另一轮的画图初始化GL,然后调用专门的函数画出立方体视图中的每个实体【??】*/void draw();private:/*画立方体的边界,使用boxv[]顶点和GL_LINE_LOOP画立方体的面【??】,颜色由CUBECOLOR宏定义指定*/void drawCube();float vAng,hAng; float xshift,yshift;float boxv0[3];float boxv1[3]; float boxv2[3];float boxv3[3];float boxv4[3];float boxv5[3]; float boxv6[3];float boxv7[3];};
CubeView类实现
下面是CubeView的实现,与FLTK中的Cube演示例子非常相似。
- #include "CubeView.h"
- #include <math.h>
- CubeView::CubeView(int x,int y,int w,int h,const char *l)
- : Fl_Gl_Window(x,y,w,h,l)
- {
- vAng = 0.0; hAng=0.0; size=10.0;
- /*The cube definition. These are the vertices of a unit cube
- centered on the origin.*/
- boxv0[0] = -0.5; boxv0[1] = -0.5; boxv0[2] = -0.5; boxv1[0] = 0.5;
- boxv1[1] = -0.5; boxv1[2] = -0.5; boxv2[0] = 0.5; boxv2[1] = 0.5;
- boxv2[2] = -0.5; boxv3[0] = -0.5; boxv3[1] = 0.5; boxv3[2] = -0.5;
- boxv4[0] = -0.5; boxv4[1] = -0.5; boxv4[2] = 0.5; boxv5[0] = 0.5;
- boxv5[1] = -0.5; boxv5[2] = 0.5; boxv6[0] = 0.5; boxv6[1] = 0.5;
- boxv6[2] = 0.5; boxv7[0] = -0.5; boxv7[1] = 0.5; boxv7[2] = 0.5;
- };
- // The color used for the edges of the bounding cube.
- #define CUBECOLOR 255,255,255,255
- void CubeView::drawCube() {
- /*Draw a colored cube*/
- #define ALPHA 0.5
- glShadeModel(GL_FLAT);
- glBegin(GL_QUADS);
- glColor4f(0.0, 0.0, 1.0, ALPHA);
- glVertex3fv(boxv0);
- glVertex3fv(boxv1);
- glVertex3fv(boxv2);
- glVertex3fv(boxv3);
- glColor4f(1.0, 1.0, 0.0, ALPHA);
- glVertex3fv(boxv0);
- glVertex3fv(boxv4);
- glVertex3fv(boxv5);
- glVertex3fv(boxv1);
- glColor4f(0.0, 1.0, 1.0, ALPHA);
- glVertex3fv(boxv2);
- glVertex3fv(boxv6);
- glVertex3fv(boxv7);
- glVertex3fv(boxv3);
- glColor4f(1.0, 0.0, 0.0, ALPHA);
- glVertex3fv(boxv4);
- glVertex3fv(boxv5);
- glVertex3fv(boxv6);
- glVertex3fv(boxv7);
- glColor4f(1.0, 0.0, 1.0, ALPHA);
- glVertex3fv(boxv0);
- glVertex3fv(boxv3);
- glVertex3fv(boxv7);
- glVertex3fv(boxv4);
- glColor4f(0.0, 1.0, 0.0, ALPHA);
- glVertex3fv(boxv1);
- glVertex3fv(boxv5);
- glVertex3fv(boxv6);
- glVertex3fv(boxv2);
- glEnd();
- glColor3f(1.0, 1.0, 1.0);
- glBegin(GL_LINES);
- glVertex3fv(boxv0);
- glVertex3fv(boxv1);
- glVertex3fv(boxv1);
- glVertex3fv(boxv2);
- glVertex3fv(boxv2);
- glVertex3fv(boxv3);
- glVertex3fv(boxv3);
- glVertex3fv(boxv0);
- glVertex3fv(boxv4);
- glVertex3fv(boxv5);
- glVertex3fv(boxv5);
- glVertex3fv(boxv6);
- glVertex3fv(boxv6);
- glVertex3fv(boxv7);
- glVertex3fv(boxv7);
- glVertex3fv(boxv4);
- glVertex3fv(boxv0);
- glVertex3fv(boxv4);
- glVertex3fv(boxv1);
- glVertex3fv(boxv5);
- glVertex3fv(boxv2);
- glVertex3fv(boxv6);
- glVertex3fv(boxv3);
- glVertex3fv(boxv7);
- glEnd();
- };//drawCube
- void CubeView::draw() {
- if (!valid()) {
- glLoadIdentity(); glViewport(0,0,w(),h());
- glOrtho(-10,10,-10,10,-20000,10000); glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glPushMatrix(); glTranslatef(xshift, yshift, 0);
- glRotatef(hAng,0,1,0); glRotatef(vAng,1,0,0);
- glScalef(float(size),float(size),float(size)); drawCube();
- glPopMatrix();
- };
#include "CubeView.h"#include <math.h>CubeView::CubeView(int x,int y,int w,int h,const char *l): Fl_Gl_Window(x,y,w,h,l){vAng = 0.0; hAng=0.0; size=10.0;/*The cube definition. These are the vertices of a unit cubecentered on the origin.*/boxv0[0] = -0.5; boxv0[1] = -0.5; boxv0[2] = -0.5; boxv1[0] = 0.5;boxv1[1] = -0.5; boxv1[2] = -0.5; boxv2[0] = 0.5; boxv2[1] = 0.5;boxv2[2] = -0.5; boxv3[0] = -0.5; boxv3[1] = 0.5; boxv3[2] = -0.5;boxv4[0] = -0.5; boxv4[1] = -0.5; boxv4[2] = 0.5; boxv5[0] = 0.5;boxv5[1] = -0.5; boxv5[2] = 0.5; boxv6[0] = 0.5; boxv6[1] = 0.5;boxv6[2] = 0.5; boxv7[0] = -0.5; boxv7[1] = 0.5; boxv7[2] = 0.5;};// The color used for the edges of the bounding cube.#define CUBECOLOR 255,255,255,255void CubeView::drawCube() {/*Draw a colored cube*/#define ALPHA 0.5glShadeModel(GL_FLAT);glBegin(GL_QUADS);glColor4f(0.0, 0.0, 1.0, ALPHA);glVertex3fv(boxv0);glVertex3fv(boxv1);glVertex3fv(boxv2);glVertex3fv(boxv3);glColor4f(1.0, 1.0, 0.0, ALPHA);glVertex3fv(boxv0);glVertex3fv(boxv4);glVertex3fv(boxv5);glVertex3fv(boxv1);glColor4f(0.0, 1.0, 1.0, ALPHA);glVertex3fv(boxv2);glVertex3fv(boxv6);glVertex3fv(boxv7);glVertex3fv(boxv3);glColor4f(1.0, 0.0, 0.0, ALPHA);glVertex3fv(boxv4);glVertex3fv(boxv5);glVertex3fv(boxv6);glVertex3fv(boxv7);glColor4f(1.0, 0.0, 1.0, ALPHA);glVertex3fv(boxv0);glVertex3fv(boxv3);glVertex3fv(boxv7);glVertex3fv(boxv4);glColor4f(0.0, 1.0, 0.0, ALPHA);glVertex3fv(boxv1);glVertex3fv(boxv5);glVertex3fv(boxv6);glVertex3fv(boxv2);glEnd();glColor3f(1.0, 1.0, 1.0);glBegin(GL_LINES);glVertex3fv(boxv0);glVertex3fv(boxv1);glVertex3fv(boxv1);glVertex3fv(boxv2);glVertex3fv(boxv2);glVertex3fv(boxv3);glVertex3fv(boxv3);glVertex3fv(boxv0);glVertex3fv(boxv4);glVertex3fv(boxv5);glVertex3fv(boxv5);glVertex3fv(boxv6);glVertex3fv(boxv6);glVertex3fv(boxv7);glVertex3fv(boxv7);glVertex3fv(boxv4);glVertex3fv(boxv0);glVertex3fv(boxv4);glVertex3fv(boxv1);glVertex3fv(boxv5);glVertex3fv(boxv2);glVertex3fv(boxv6);glVertex3fv(boxv3);glVertex3fv(boxv7);glEnd();};//drawCubevoid CubeView::draw() {if (!valid()) {glLoadIdentity(); glViewport(0,0,w(),h());glOrtho(-10,10,-10,10,-20000,10000); glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);}glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix(); glTranslatef(xshift, yshift, 0);glRotatef(hAng,0,1,0); glRotatef(vAng,1,0,0);glScalef(float(size),float(size),float(size)); drawCube();glPopMatrix();};
11.5.2 CubeViewUI类
我们将使用FLUID构造一个完整的窗口来显示和控制上一节定义的CubeView类。
定义CubeViewUI类
启动FLUID之后,在FLUID中定义类的第一步是通过菜单New->Code->Class创建一个新的类。将类命名为CubeViewUI,让子类空着。我们并不需要这个窗口的任何继承,你应该可以在FLUID浏览窗口中看到新类的声明。
图11.3 FLUID定义CubeViewUI
添加类构造函数
在FLUID窗口中点击CubeViewUI类,通过选择New->Code->Function/Method添加一个新的方法。函数名也是CubeViewUI,FUILD知道这是类的构造函数,因此将产生相应的代码。确保你声明的构造函数为公共(public)访问方式。
然后在CubeViewUI类中加入一个窗口。FLUID浏览窗口中在高亮显示构造函数名,然后点击New->Group->Window。使用类似的方式在CubeViewUI中加入如下对象。
l 水平滚轴hrot
l 垂直滚轴vrot
l 水平滑动块xpan
l 垂直滑动块ypan
l 水平值滑动块zoom
所有这些加入的对象都不用是公共的,而且他们也不应该是公共的,除非你计划将它们作为CubeViewUI的接口的一部分。
当你完成之后,你应该有这样一些东西:
图11.4 包含CubeView演示的FLUID窗口
我们稍后将讨论图中高亮显示的show()方法.
添加CubeView构件
我们目前所有的已经很好了,但是对于显示立方体似乎还不够。我们已经定义了CubeView类,我们要将它显示在CubeViewUI中。
CubeView类继承自Fl_Gl_Window类,而Fl_Gl_Window则继承自Fl_Box。使用New->Other->Box在主窗口中添加一个矩形框。然而这不是一个普通的框。【??】框的属性窗口将会出现。让CubeViewUI显示CubeView的关键在于在Class文本输入框中输入CubeView。这就告诉FLUID这不是一个Fl_Box而是一个类似的构造函数为该名字的构件。【??】
在Extra Code域中输入:#include “CubeView.h”
这个#include很重要,应为我们刚刚将CubeView作为一个成员包含进了CubeViewUI中,所以所有的CubeView的公共方法在CubeViewUI中都是可见的。
图11.5 CubeView的方法
定义回调函数
所有的在添加CubeView之前定义的构件都可以拥有调用CubeView方法的回调函数。你可以调用外部函数或者在构件面板的Callback域中放入一小部分代码。例如:ypan滑动块的回调如下:
Cube->pany(((Fl_Slider*)o)->value());
Cube->redraw();
当改变值之后我们调用cube->redraw()来更新CubeView窗口。CubeView可以很容易的通过这种方式修改,但是更好的方式是将它暴露出来【意思应该是作为一个接口函数吧?】,这样的话你就可以在多个视图改变时只重绘一次,从而节省大量的时间。【译注:这句好长,没大看懂,应该就是这么个意思】
没有理由不等待直到你已经加入了CubeView来进入回调【译注:不会翻译,原文:There is no reason no wait until after youhave added CubeView to enter these callbacks.】。FLUID假设你足够聪明,不会使用不存在的成员或者函数。
加入类方法
你可以在FLUID中加入与GUI无关的类方法。作为一个例子加入一个显示函数以便CubeViewUI可以在屏幕上显示出来。
确保CubeViewUI的最顶层已经选中,然后选择:New->Code->Function/Method。就用名字show()。我们这里不需要返回值而且我们也不会在该方法中加入任何构件,所以FLUID将函数返回值设为void类型。
图11.6 CubeViewUI显示函数
一旦新的方法已经加入,选中它的名字然后选择New->Code->Code,在代码窗口中输入方法的实现代码。
11.5.3 加入构造函数的初始化代码
如果你需要加入代码初始化类,例如:设置CubeView的水平垂直角度初始值。你可以选中构造函数,选择New->Code->Code。加入需要的代码。
11.5.4 生成代码
现在我们已经完整定义了CubeViewUI,我们需要生成代码。只需最后一招就可以完成所有工作。从Edit->Preference打开偏好对话框。
在对话框的底部是关键:”IncludeHeader from Code”.选择该选项,然后设置你想要的文件扩展名和业务【??】。你可以包含CubeViewUI.h(或者任何你想要的扩展名)asyou would any other C++ class.【译注:不会翻译,实在看不明白,感觉语法不通??】。
- FLTK学习-4-使用FLUID编程(2)
- FLTK学习-4-使用FLUID编程(2)
- FLTK学习-6-使用FLUID编程(4)
- FLTK学习-6-使用FLUID编程(4)
- FLTK学习-3-使用FLUID编程(1)
- FLTK学习-5-使用FLUID编程(3)
- FLTK学习-7-使用FLUID编程(5)
- FLTK学习-3-使用FLUID编程(1)
- FLTK学习-5-使用FLUID编程(3)
- FLTK学习-7-使用FLUID编程(5)
- FLTK学习-2-新手入门参考
- FLTK学习-2-新手入门参考
- 红薯 在FLTK中使用OpenGL进行图形编程
- FLTK编程模型
- FLTK编程模型
- FLTK编程模型
- FLTK编程模型
- FLTK学习笔记一
- FLTK学习-3-使用FLUID编程(1)
- HLG 1082 翻译 (基础题)
- Windows内存管理(3)--检查内存可用性,结构化异常处理 和 ASSERT
- java6 substring() 内存泄漏
- java IO流总结
- FLTK学习-4-使用FLUID编程(2)
- Windows内核函数(1) - 字符串处理函数
- FLTK学习-5-使用FLUID编程(3)
- Portal for ArcGIS 与ArcGIS Server的集成方式
- Windows内核函数(2) - 内核模式下的文件操作
- FLTK学习-6-使用FLUID编程(4)
- FLTK学习-7-使用FLUID编程(5)
- Windows内核函数(3) - 内核模式下的注册表操作
- 锐捷重启