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. Python的网络编程[4] -> DHCP 协议[0] -> DHCP 的基本理论

    DHCP协议 / DHCP Protocol 目录 DHCP 基本理论 DHCP 通信流程 DHCP 完整报文 DHCP 的 Optional 字段 DHCP 的报文类型 1 DHCP 基本理论 DH ...

  2. HDU 4251 The Famous ICPC Team Again(划分树)

    The Famous ICPC Team Again Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  3. RandomeAccessFile - read write

    RandomeAccessFile use write replace writeBytes public class RandomAccessFileTest { public static voi ...

  4. [Git]Git 常用的操作命令

    创建本地仓库 git init 获取远程仓库 git clone [url] 例如:git clone https://github.com/you/yourpro.git 创建远程仓库 添加一个新的 ...

  5. 纯CSS实现网站常用的五角星评分和分数展示交互效果

    最近做的一个项目涉及到评分和展示分数的模块,UI设计师也给了几个切好的图片,实现五角星评分方式很多,本质爱折腾的精神和对性能追求以及便于维护的考虑,搜集和尝试了很多方式,最终采用了纯css驱动的实现方 ...

  6. mysql查询一个库中有多少张表

    SELECT COUNT(*) TABLES, table_schema FROM information_schema.TABLES  WHERE table_schema = 'palm_2_0_ ...

  7. git reset,git checkout区别

    https://www.cnblogs.com/houpeiyong/p/5890748.html git reset  HEAD~1  将HEAD指向倒数第二次提交,最后一次提交删除,文件还在 gi ...

  8. GLSL实现Glow效果 【转】

    http://blog.csdn.net/a3070173/article/details/3220940 Glow即辉光效果现在已成为3D图形中一个引人注目的特效.本文主要介绍如何使用GLSL实现一 ...

  9. jstl标签设置通用web项目根路径

    在做项目时(如SSH或SpringMVC),通常需要在很多页面(jsp中的form提交)或者js代码(一般Ajax提交)中用到当前web应用的根路径(拼成访问资源如action/controller. ...

  10. Spring Bean Life Cycle Methods – InitializingBean, DisposableBean, @PostConstruct, @PreDestroy and *Aware interfaces

    Spring Beans are the most important part of any Spring application. Spring ApplicationContext is res ...