[译]GLUT教程 - 修改菜单
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教程 - 修改菜单的更多相关文章
- [译]GLUT教程 - 交换菜单
Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Swapping Menus GLUT甚至可以在应用程序过 ...
- [译]GLUT教程 - 子菜单
Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Sub Menus 上一节我们介绍了如何创建普通菜单和如果 ...
- [译]GLUT教程(目录)
http://www.lighthouse3d.com/tutorials/glut-tutorial/ GLUT是OpenGL Utility Toolkit的意思.作者Mark J. Kilgar ...
- [译]GLUT教程 - 弹出菜单基础
Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Popup Menus 弹出菜单也是GLUT的一部分.虽然 ...
- [译]GLUT教程 - 游戏模式
Lighthouse3d.com >> GLUT Tutorial >> Extras >> Game Mode 根据GLUT官网的说明,GLUT的游戏模式是为开启 ...
- [译]GLUT教程 - glutPostRedisplay函数
Lighthouse3d.com >> GLUT Tutorial >> Avoiding the Idle Func >> glutPostRedisplay 直 ...
- [译]GLUT教程 - 渲染到子窗体
Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Rendering to Subwindows 先回顾一下之前 ...
- [译]GLUT教程 - 重整子窗体
Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Reshape Subwindows 重整函数的回调需要处理两 ...
- [译]GLUT教程 - 创建和关闭子窗体
Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Creating and Destroying Subwind ...
随机推荐
- 【字符串】Your Ride Is Here
题目描述 It is a well-known fact that behind every good comet is a UFO. These UFOs often come to collect ...
- Java-静态代码块,构造代码块,构造函数
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次 构造代码块:类中直接用{}定义,每一次创建对象时执行. 执行顺序优先级:静态块, main(),函数,构造块,构造方法. 构造函数 pu ...
- USACO 4.4.2 追查坏牛奶 oj1341 网络流最小割问题
描述 Description 你第一天接手三鹿牛奶公司就发生了一件倒霉的事情:公司不小心发送了一批有三聚氰胺的牛奶.很不幸,你发现这件事的时候,有三聚氰胺的牛奶已经进入了送货网.这个送货网很大,而且关 ...
- [Contest20180418]物理竞赛
题意:在一个三维空间中有一个轴,轴上有一个垂直于轴的半径为$R$的凸透镜(光心在轴上)和$n$个点光源,假设每个点光源发出的$1$单位光都刚好覆盖凸透镜,现在有一个半径为$r$的圆形光屏,问光屏最多能 ...
- 更改vsftpd默认的21端口
vsftpd默认的端口是21 我想更改为别的端口 那么首先编辑 vsftpd的配置文件 /etc/vsftpd/vsftpd.conf 添加监听端口 listen_port **** 然后修改ftp的 ...
- Visio对象插入Word后周围空白过大
如图,空白很大,因为我在设计里选择纸张适应绘图,后发现直接复制粘贴到word就好了,没空白了.
- 写给嵌入式程序员的循环冗余校验(CRC)算法入门引导
写给嵌入式程序员的循环冗余校验(CRC)算法入门引导 http://blog.csdn.net/liyuanbhu/article/details/7882789 前言 CRC校验(循环冗余校验)是数 ...
- 纯CSS实现网站常用的五角星评分和分数展示交互效果
最近做的一个项目涉及到评分和展示分数的模块,UI设计师也给了几个切好的图片,实现五角星评分方式很多,本质爱折腾的精神和对性能追求以及便于维护的考虑,搜集和尝试了很多方式,最终采用了纯css驱动的实现方 ...
- 基于CoreText的排版引擎
前言 本人今年主要在负责猿题库iOS客户端的开发,本文旨在通过分享猿题库iOS客户端开发过程中的技术细节,达到总结和交流的目的. 这是本技术分享系列文章的第三篇.本文涉及的技术细节是:基于CoreTe ...
- JAVA之接口与实现
/** * * 功能:接口与实现 * 接口也体现了多态性 */package com.test; public class test5 { /** * @param args */ ...