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的程序结构[1] -> 方法/Method[0] -> 类实例方法、私有方法和抽象方法

    类实例方法.私有方法和抽象方法 Python中最常用的就是类实例方法,类似于属性中的类实例属性,同时,也存在与私有属性类似方法,即私有方法,下面介绍这两种常见的方法,以及一种特殊意义的类实例方法 -- ...

  2. 小白入门篇:flex布局

    --前言 因为这个星期写一个小的项目用到flex布局和grid布局,虽然这两种布局都是兼容性都有问题,但是别急,我觉的以后肯定是会发展并且流行起来的,毕竟google大法好,而且这两个布局真的比一般的 ...

  3. Codeforces 1010D Mars rover

    题目大意:对于一个不完全二分图,根节点为1,叶节点值为0或1,非叶节点包含一个操作(and,or,xor,not),求改变各个叶节点的值时(即0改为1,1改为0),根节点的值是多少 解法:遍历图求各节 ...

  4. [COCI2015]FUNGHI

    题目大意: 一个环上有8个数,从中选取连续的4个数使得和最大,求最大的和. 思路: 模拟. #include<cstdio> #include<cctype> #include ...

  5. Apache压力(并发)测试工具ab的使用教程收集

    说明:用ab的好处,在处理多并发的情况下不用自己写线程模拟.其实这个世界除了LoadRunner之外还是有很多方案可以选择的. 官网: http://httpd.apache.org/(Apache服 ...

  6. linux之ssh命令

    ssh命令用于远程登录上Linux主机. 常用格式:ssh [-l login_name] [-p port] [user@]hostname更详细的可以用ssh -h查看. 不指定用户: ssh 1 ...

  7. MBT简述:基于模型的测试

    参考: 1.http://blog.csdn.net/TMQ1225/article/details/53940828 2.http://tmq.qq.com/2016/12/graphwalker/ ...

  8. python核心编程学习记录之Web编程

    cgi未完待续

  9. 计算GPS两点间的距离[单位为:米]

    /**     * 计算GPS两点间的距离[单位为:米]     * @param center GPS当前数据(LonLat对象表示,LonLat.lon表示经度,LonLat.lat表示纬度)   ...

  10. ios开发中APP底部上滑不能调出如WiFi、蓝牙、播放等的设置页面的解决的方法

    在开发的APP中我们通常通过手动底部上滑来调出WiFi.蓝牙.飞行模式等的设置页面.有时我们开发的APP无法调出. 解决的方法: 进入iPhone "设置" --> &quo ...