FLTK学习-4-使用FLUID编程(2)

2023-12-06 21:20
文章标签 学习 使用 编程 fluid fltk

本文主要是介绍FLTK学习-4-使用FLUID编程(2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

11.5.1 CubeView类

CubeView类是Fl_Gl_Window的子类。该类具有设置缩放,x、y平移【摇动镜头??】以及x、y轴旋转角的方法。

如果你认识到CubeView只是由FLUID生成的Fl_Gl_Window的一个子类并且会对CubeViewUI的调用产生响应,那么你可以放心的忽略本节。

CubeView类声明

下面是在头文件test/CubeView.h中的CubeView的类声明。

[cpp] view plain copy print ?
  1. classCubeView:publicFl_Gl_Window{
  2. public:
  3. CubeView(intx,inty,intw,inth,constchar*l=0);
  4. //这个值决定画立方体的缩放比例
  5. doublesize;
  6. /*设置垂直轴(y轴)的旋转。该函数被CubeViewUI的水平滚轴和CubeViewUI的初始化按钮调用*/
  7. voidv_angle(floatangle){vAng=angle;};
  8. //返回垂直轴的旋转角
  9. floatv_angle(){returnvAng;};
  10. /*设置水平轴(x轴)的旋转。该函数被CubeViewUI的垂直滚轴和CubeViewUI的初始化按钮调用*/
  11. voidh_angle(floatangle){hAng=angle;};
  12. //返回垂直轴的旋转角
  13. floath_angle(){returnhAng;};
  14. /*设置立方体视角的x偏移,该函数被CubeViewUI的滑动块和CubeView的初始化按钮调用*/
  15. voidpanx(floatx){xshift=x;};
  16. /*设置立方体视角的y偏移,该函数被CubeViewUI的滑动块和CubeView的初始化按钮调用*/
  17. voidpany(floaty){yshift=y;};
  18. /*构件基类的draw()函数的重载,draw()函数用另一轮的画图初始化GL,然后调用专门的函数画出立方体视图中的每个实体【??】*/
  19. voiddraw();
  20. private:
  21. /*画立方体的边界,使用boxv[]顶点和GL_LINE_LOOP画立方体的面【??】,颜色由CUBECOLOR宏定义指定*/
  22. voiddrawCube();
  23. floatvAng,hAng;floatxshift,yshift;
  24. floatboxv0[3];floatboxv1[3];floatboxv2[3];floatboxv3[3];
  25. floatboxv4[3];floatboxv5[3];floatboxv6[3];floatboxv7[3];
  26. };
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演示例子非常相似。

[cpp] view plain copy print ?
  1. #include"CubeView.h"
  2. #include<math.h>
  3. CubeView::CubeView(intx,inty,intw,inth,constchar*l)
  4. :Fl_Gl_Window(x,y,w,h,l)
  5. {
  6. vAng=0.0;hAng=0.0;size=10.0;
  7. /*Thecubedefinition.Thesearetheverticesofaunitcube
  8. centeredontheorigin.*/
  9. boxv0[0]=-0.5;boxv0[1]=-0.5;boxv0[2]=-0.5;boxv1[0]=0.5;
  10. boxv1[1]=-0.5;boxv1[2]=-0.5;boxv2[0]=0.5;boxv2[1]=0.5;
  11. boxv2[2]=-0.5;boxv3[0]=-0.5;boxv3[1]=0.5;boxv3[2]=-0.5;
  12. boxv4[0]=-0.5;boxv4[1]=-0.5;boxv4[2]=0.5;boxv5[0]=0.5;
  13. boxv5[1]=-0.5;boxv5[2]=0.5;boxv6[0]=0.5;boxv6[1]=0.5;
  14. boxv6[2]=0.5;boxv7[0]=-0.5;boxv7[1]=0.5;boxv7[2]=0.5;
  15. };
  16. //Thecolorusedfortheedgesoftheboundingcube.
  17. #defineCUBECOLOR255,255,255,255
  18. voidCubeView::drawCube(){
  19. /*Drawacoloredcube*/
  20. #defineALPHA0.5
  21. glShadeModel(GL_FLAT);
  22. glBegin(GL_QUADS);
  23. glColor4f(0.0,0.0,1.0,ALPHA);
  24. glVertex3fv(boxv0);
  25. glVertex3fv(boxv1);
  26. glVertex3fv(boxv2);
  27. glVertex3fv(boxv3);
  28. glColor4f(1.0,1.0,0.0,ALPHA);
  29. glVertex3fv(boxv0);
  30. glVertex3fv(boxv4);
  31. glVertex3fv(boxv5);
  32. glVertex3fv(boxv1);
  33. glColor4f(0.0,1.0,1.0,ALPHA);
  34. glVertex3fv(boxv2);
  35. glVertex3fv(boxv6);
  36. glVertex3fv(boxv7);
  37. glVertex3fv(boxv3);
  38. glColor4f(1.0,0.0,0.0,ALPHA);
  39. glVertex3fv(boxv4);
  40. glVertex3fv(boxv5);
  41. glVertex3fv(boxv6);
  42. glVertex3fv(boxv7);
  43. glColor4f(1.0,0.0,1.0,ALPHA);
  44. glVertex3fv(boxv0);
  45. glVertex3fv(boxv3);
  46. glVertex3fv(boxv7);
  47. glVertex3fv(boxv4);
  48. glColor4f(0.0,1.0,0.0,ALPHA);
  49. glVertex3fv(boxv1);
  50. glVertex3fv(boxv5);
  51. glVertex3fv(boxv6);
  52. glVertex3fv(boxv2);
  53. glEnd();
  54. glColor3f(1.0,1.0,1.0);
  55. glBegin(GL_LINES);
  56. glVertex3fv(boxv0);
  57. glVertex3fv(boxv1);
  58. glVertex3fv(boxv1);
  59. glVertex3fv(boxv2);
  60. glVertex3fv(boxv2);
  61. glVertex3fv(boxv3);
  62. glVertex3fv(boxv3);
  63. glVertex3fv(boxv0);
  64. glVertex3fv(boxv4);
  65. glVertex3fv(boxv5);
  66. glVertex3fv(boxv5);
  67. glVertex3fv(boxv6);
  68. glVertex3fv(boxv6);
  69. glVertex3fv(boxv7);
  70. glVertex3fv(boxv7);
  71. glVertex3fv(boxv4);
  72. glVertex3fv(boxv0);
  73. glVertex3fv(boxv4);
  74. glVertex3fv(boxv1);
  75. glVertex3fv(boxv5);
  76. glVertex3fv(boxv2);
  77. glVertex3fv(boxv6);
  78. glVertex3fv(boxv3);
  79. glVertex3fv(boxv7);
  80. glEnd();
  81. };//drawCube
  82. voidCubeView::draw(){
  83. if(!valid()){
  84. glLoadIdentity();glViewport(0,0,w(),h());
  85. glOrtho(-10,10,-10,10,-20000,10000);glEnable(GL_BLEND);
  86. glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
  87. }
  88. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  89. glPushMatrix();glTranslatef(xshift,yshift,0);
  90. glRotatef(hAng,0,1,0);glRotatef(vAng,1,0,0);
  91. glScalef(float(size),float(size),float(size));drawCube();
  92. glPopMatrix();
  93. };
#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();
};

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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/463373

相关文章

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J