Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Modifying Menus

肯定会有菜单需要被修改的状况出现.GLUT运行我们修改和删除菜单项.修改菜单项的函数原型如下:

void glutChangeToMenuEntry(int entry, char *name, int value);

entry - 菜单项的索引值,介乎于1和菜单项总数之间

name - 新菜单项的名

value - 菜单项被选中时传递给回调函数的值

交换子菜单用下面这个函数:

void glutChangeToSubMenu(int entry, char *name, int menu);

entry - 菜单项的索引值,介乎于1和菜单项总数之间

name - 新菜单项的名

menu - 用于交换的菜单的索引值

下面函数用于删除菜单项.

void glutRemoveMenuItem(int entry);

entry - 菜单项的索引值,介乎于1和菜单项总数之间.

最后一样是,你可以随时用glutGet函数查询当前菜单项的数量.

下面例子演示如何更改菜单:

void processMenuEvents(int option) {

    red = 0.0;
green = 0.0;
blue = 0.0; switch (option) {
case RED :
red = 1.0; break;
case GREEN :
green = 1.0; break;
case BLUE :
blue = 1.0; break;
case WHITE :
red = 1.0;
green = 1.0;
blue = 1.0; break;
}
} void processKeys(unsigned char c, int x, int y) { int num = glutGet(GLUT_MENU_NUM_ITEMS);
switch (c) {
case 'a':
glutChangeToMenuEntry(,"Blue",BLUE);
glutChangeToMenuEntry(,"Red",RED);
break;
case 'b':
glutChangeToMenuEntry(,"Blue",BLUE);
glutChangeToMenuEntry(,"Red",RED);
break;
case 'c':
if (num > )
glutRemoveMenuItem(num);
break;
case 'd': if (num == )
glutAddMenuEntry("White",WHITE);
break;
}
glutSetMenu(menu);
} void createGLUTMenus() { menu = glutCreateMenu(processMenuEvents);
glutAddMenuEntry("Red",RED);
glutAddMenuEntry("Green",GREEN);
glutAddMenuEntry("Blue",BLUE);
glutAddMenuEntry("White",WHITE);
glutAttachMenu(GLUT_RIGHT_BUTTON);
}

注意到我们以与菜单回调函数相反的形式用键盘回调函数更改了菜单.因为当菜单在使用的时候我们不能更改.菜单会在回调函数完成之前被占用,所以我们不能在回调函数内部改变菜单的结构.

之前提及到的,菜单被占用的时候,不能更改.以防万一我们需要先确认菜单是否被占用.GLUT允许我们注册一个回调函数来检测菜单是否在弹出状态.原型如下:

void glutMenuStatusFunc(void (*func)(int status, int x, int y);

func - 回调函数的名字

该函数会在main函数中调用,所以我们会把它加到main函数中.

在glutMenuStatusFunc函数中的三个参数的意思是:

status - GLUT_MENU_IN_USE或GLUT_MENU_NOT_IN_USE状态之一

x - 相对于窗体客户端区域的菜单左边坐标

y - 相对于窗体客户端区域的菜单顶部坐标

以下实例展示了当菜单被占用时设置一个标记来标识.

void processMenuStatus(int status, int x, int y) {

    if (status == GLUT_MENU_IN_USE)
flag = ;
else
flag = ;
}

现在你可以用该标记来处理键盘事件:

void processKeys(unsigned char c, int x, int y) {

    if (!flag) {
int num = glutGet(GLUT_MENU_NUM_ITEMS);
switch (c) {
case 'a':
glutChangeToMenuEntry(,"Blue",BLUE);
glutChangeToMenuEntry(,"Red",RED);
break;
case 'b':
glutChangeToMenuEntry(,"Blue",BLUE);
glutChangeToMenuEntry(,"Red",RED);
break;
case 'c':
if (num > )
glutRemoveMenuItem(num);
break;
case 'd': if (num == )
glutAddMenuEntry("White",WHITE);
break;
}
}
}

[译]GLUT教程 - 修改菜单的更多相关文章

  1. [译]GLUT教程 - 交换菜单

    Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Swapping Menus GLUT甚至可以在应用程序过 ...

  2. [译]GLUT教程 - 子菜单

    Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Sub Menus 上一节我们介绍了如何创建普通菜单和如果 ...

  3. [译]GLUT教程(目录)

    http://www.lighthouse3d.com/tutorials/glut-tutorial/ GLUT是OpenGL Utility Toolkit的意思.作者Mark J. Kilgar ...

  4. [译]GLUT教程 - 弹出菜单基础

    Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Popup Menus 弹出菜单也是GLUT的一部分.虽然 ...

  5. [译]GLUT教程 - 游戏模式

    Lighthouse3d.com >> GLUT Tutorial >> Extras >> Game Mode 根据GLUT官网的说明,GLUT的游戏模式是为开启 ...

  6. [译]GLUT教程 - glutPostRedisplay函数

    Lighthouse3d.com >> GLUT Tutorial >> Avoiding the Idle Func >> glutPostRedisplay 直 ...

  7. [译]GLUT教程 - 渲染到子窗体

    Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Rendering to Subwindows 先回顾一下之前 ...

  8. [译]GLUT教程 - 重整子窗体

    Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Reshape Subwindows 重整函数的回调需要处理两 ...

  9. [译]GLUT教程 - 创建和关闭子窗体

    Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Creating and Destroying Subwind ...

随机推荐

  1. 浅浅地谈一下随机算法【poj2454】【poj3318】

    随机算法我也只是稍微接触了一下,就是想写篇博客自己稍微总结一下 其实随机算法也算是一个玄学吧,运气不好还是会wa.但是我们知道,计算机可以在短时间内计算大量的数据,所以碰到正确答案的概率还是挺大的. ...

  2. 程设刷题 | 编译C++文件出现to_string is not a member of std 或者 to_string was not declared in this scope的解决方法

    写在前面 原文链接:Enabling string conversion functions in MinGW C++在将整型.浮点型.长整型等数据类型转换为字符串时,可使用<string> ...

  3. Mysql Grant权限

    查看用户权限: SELECT host,user,password,Grant_priv,Super_priv FROM mysql.user; 权限取决于最上一条记录的值 如果需要收回权限: REV ...

  4. 解决NVidia显卡最大化和最小化窗口时的卡顿问题

    最近因为做一个3D的项目,换上了一块Nvidia的显卡.然而,在使用的过程中,发现最大化和最小化窗口时的动画有卡顿现象,并且一般出现一次后便不会再出现, 可是等一会又会出现同样问题. 我以前使用i7的 ...

  5. select 下拉框的选中项的change事件

    HTML文件 <span style="float: left;">类      型:   <select id="type" class=& ...

  6. Javascript中的高阶函数介绍

    高阶函数:高阶看上去就像是一种先进的编程技术的一个深奥术语,一开始我看到的时候我也这样认为的. Javascript的高阶函数 然而,高阶函数只是将函数作为参数或返回值的函数.以下面的Hello,Wo ...

  7. ES6里关于作用域的拓展:块级作用域

    过去,javascript缺乏块级作用域,var声明时的声明提升.属性变量等行为让人困惑.ES6的新语法可以帮助我们更好地控制作用域. 一.var声明 1.变量提升:var声明会发生“变量提升”现象, ...

  8. 15 Basic ‘ls’ Command Examples in Linux

    FROM: http://www.tecmint.com/15-basic-ls-command-examples-in-linux/ ls command is one of the most fr ...

  9. 错误:“The requested resource () is not available.”的处置

    做网页过程中,某页需要以新窗方式打开另一个网页,于是url是这样写: pages/test/transw/claimer.html 但是,点链接后网页提示 The requested resource ...

  10. setTimeout应用 && 自动播放——幻灯片效果&& 自动改变方向——幻灯片效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...