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: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...

  2. Gym - 101194F(后缀数组)

    Mr. Panda and Fantastic Beasts 题意 给出若干个字符串,找到一个最短的字典序最小的字符串且仅是第一个字符串的子串. 分析 对于这种多个字符串.重复的子串问题一般都要连接字 ...

  3. 【bzoj1598】【 [Usaco2008 Mar]牛跑步】启发式搜索思路+spfa

    (上不了p站我要死了,侵权度娘背锅) 最近复习搜索,先从启发式搜索来吧. 感觉启发式搜索这玩意挺玄学的,先从其思想入手,做一道经典的K短路. Description BESSIE准备用从牛棚跑到池塘的 ...

  4. mac下eclipse导入windows项目文件乱码

    右键property->resource没有GBK,手工输入"GBK"项目正常. 一开始用windows被坑了,如果再用windows平台,第一时间将encoding改成UT ...

  5. win7 下注册dll文件失败

    1.win7 下注册dll文件失败,提示模块“xx.dll”已加载,但找不到入口点DllRegisterServer 原因:该dll文件非可注册组件,没有包含DllRegisterServer函数,可 ...

  6. Xcode 5 单元测试(一)使用XCTest进行单元测试

    在Objc.io #1的Testing View Controllers中讲解的就是单元测试的相关内容.本文说下如何通过Xcode 5中集成的XCTest框架进行简单的单元测试. 什么是单元测试 首先 ...

  7. ElasticSearch测试数据

    curl命令数据 curl -XPUT http://127.0.0.1:9200/us/user/1 -d "{\"email\":\"john@smith. ...

  8. [转载]Elasticsearch Java API总汇

    from: http://blog.csdn.net/changong28/article/details/38445805#comments 3.1 集群的连接 3.1.1 作为Elasticsea ...

  9. SparkMLlib分类算法之逻辑回归算法

    SparkMLlib分类算法之逻辑回归算法 (一),逻辑回归算法的概念(参考网址:http://blog.csdn.net/sinat_33761963/article/details/5169383 ...

  10. bind域名dns解析及主从服务的配置

    bind域名dns解析及主从服务的配置 1.dns解析介绍     人们习惯记忆域名,但机器间互相只认IP地址,域名与IP地址之间是多对一的关系,一个ip地址不一定只对应一个域名,且一个域名只可以对应 ...