这是代码的一部分,用户从 GLUI 列表中选择颜色选项,并且背景颜色应该更改:
#include <GL/freeglut.h>
#include <GL/glui.h>
#include <cmath>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>
struct Vertex {
float x, y;
};
std::vector<Vertex> vertices;
int numSides = 3;
const float scaleFactor = 0.5f;
int bgColor[3] = {255, 255, 255};
GLUI *glui_window;
void menuFunction(int value) {
std::cout << "Menu item selected: " << value << std::endl;
switch (value) {
case 1:
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // White
break;
case 2:
glClearColor(1.0f, 0.0f, 0.0f, 1.0f); // Red
break;
case 3:
glClearColor(0.0f, 1.0f, 0.0f, 1.0f); // Green
break;
case 4:
glClearColor(0.0f, 0.0f, 1.0f, 1.0f); // Blue
break;
}
glutPostRedisplay();
}
void init() {
glClearColor(1.0, 1.0, 1.0, 1.0);
glColor3f(0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
glutSetCursor(GLUT_CURSOR_CROSSHAIR);
glui_window = GLUI_Master.create_glui("Options");
GLUI_Listbox *bgColorList = glui_window->add_listbox("BG Colour", &bgColor[0]);
bgColorList->add_item(1, "White");
bgColorList->add_item(2, "Red");
bgColorList->add_item(3, "Green");
bgColorList->add_item(4, "Blue");
glui_window->set_main_gfx_window(glutGetWindow());
bgColorList->set_int_val(1);
glui_window->hide();
}
但是,我还没有找到将
init()
函数与 menuFunction()
连接起来的方法。
最初,程序创建一个多边形,此代码应更改其后面的颜色。
add_listbox
函数的使用不正确。请参阅GLUI 文档。其用法如下:
GLUI_Listbox *GLUI::add_listbox( char *name, void *live_var=NULL, int id=-1, GLUI_Update_CB callback=NULL );
- 要显示的标签name
- 指向live_var
类型变量的可选指针。该变量将自动更新为列表框中当前所选文本条目的数字 ID。
int
- 此列表框的 ID。如果定义了回调,则当选择新的列表框条目时,将传递此整数值。
id
- 选择不同条目时调用的回调函数指针(采用单个callback
参数)。回调将传递上面列出的值
int
。使用
id
确定回调中的哪个条目 被选中了。
GLUI_Listbox::get_int_val()
- 要添加控件的现有 GLUI 面板(或卷展栏)。panel
返回:指向新
控件的指针Listbox
为了获得所需的行为,需要进行以下修改。首先,在程序中为
live_var
(此处为itemSelectedIdx
)声明一个全局变量。在对 add_listbox
的调用中,传递一个指向 itemSelectedIdx
的指针,为 id
使用任意唯一值(此处为 0
),并将 menuFunction
指定为 callback 函数(被调用的函数)当选择不同的项目时)。
int itemSelectedIdx;
// ...
void init() {
// ...
GLUI_Listbox *bgColorList = glui_window->add_listbox("BG Colour", &itemSelectedIdx, 0, menuFunction);
// ...
}
在
menuFunction
中,忽略参数value
并使用之前声明的itemSelectedIdx
代替,即:
void menuFunction(int value) {
std::cout << "Menu item selected: " << itemSelectedIdx << std::endl;
switch (itemSelectedIdx) {
case 1:
// ...
}
旁注:
value
参数将包含之前指定为id
的列表框0
。当多个小部件(具有不同的 id
)使用相同的回调函数时,这非常有用。