[译]GLUT教程 - 弹出菜单基础
Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Popup Menus
弹出菜单也是GLUT的一部分.虽然没有实现所有的窗体系统的弹出菜单的功能,但是GLUT也完成了一些非常有用的部分.为应用程序添加菜单,并提供一个简单的途径来交互和用键盘选择选项,避免了记住所有快捷键的麻烦.
第一步我们必须先创建一个菜单.GLUT的glutCreateMenu函数原型如下:
int glutCreateMenu(void (*func)(int value));
func - 为新创建的菜单提供菜单事件的处理函数.
该函数的返回值是菜单项的ID.
我们可以在应用程序创建任意多的菜单项.既可以每个菜单项绑定不同回调处理函数,也可以多个项绑定同一个处理函数.接下来我们需要添加一些选项到菜单.原型如下:
void glutAddMenuEntry(char *name, int value);
name - 菜单上显示的名字.
value - 当该菜单项别选中时返回给回调函数的值.
下面这个函数是追加项到上一个添加的项集合中,例如在菜单的底部插入.在GLUT中没有中间插入选项的函数.要知道GLUT不是一个全部功能覆盖操作系统API的集合体.GLUT是被设计来让我们更容易设计产品原型的函数库,并且它在这方面做得很好.
现在你有一个弹出菜单了,但是还有最后一步要做: 绑定菜单到鼠标键,这是我们指定让菜单出现的途径.你可以利用GLUT来令鼠标键按下时弹出菜单.完成这步工作的是glutAttachMenu函数.
void glutAttachMenu(int button);
button - 绑定到菜单的键的对应常量值.
该参数可以是以下三个常量值
GLUT_LEFT_BUTTON
GLUT_MIDDLE_BUTTON
GLUT_RIGHT_BUTTON
以下是一个演示上述函数的实例.
...
#define RED 1
#define GREEN 2
#define BLUE 3
#define ORANGE 4
... void createGLUTMenus() { int menu; // create the menu and
// tell glut that "processMenuEvents" will
// handle the events
menu = glutCreateMenu(processMenuEvents); //add entries to our menu
glutAddMenuEntry("Red",RED);
glutAddMenuEntry("Blue",BLUE);
glutAddMenuEntry("Green",GREEN);
glutAddMenuEntry("Orange",ORANGE); // attach the menu to the right button
glutAttachMenu(GLUT_RIGHT_BUTTON);
}
现在我们将要编写菜单事件的处理函数.你可能猜到了,我们准备用菜单来设置颜色.
注意,我们的函数必须用processMenuEvents函数来调用,这是上面创建菜单的函数中提供的.除此之外,可以看到glutCreateMenu函数中有一个参数是用来展现选中了哪个菜单项的.
void processMenuEvents(int option) {
switch (option) {
case RED :
red = 1.0f;
green = 0.0f;
blue = 0.0f; break;
case GREEN :
red = 0.0f;
green = 1.0f;
blue = 0.0f; break;
case BLUE :
red = 0.0f;
green = 0.0f;
blue = 1.0f; break;
case ORANGE :
red = 1.0f;
green = 0.5f;
blue = 0.5f; break;
}
}
剩下唯一要做的事是添加createGLUTMenus函数到main函数.
在完结本节之前,我们还有两个函数要介绍.第一个函数是用来解除鼠标键和菜单的绑定关系.之前用glutAttachMenu函数来绑定,有些程序需要解除该联系,例如用户点击的菜单中已经不存在该选项的时候.在GLUT中是用glutDetachMenu函数.该函数会终止鼠标点击弹出对应菜单.原型如下:
void glutDetachMenu(int button);
button - 需要解除的按键
该参数和glutAttachMenu中的参数可选值一样.
也就是说,绑定和解除绑定,给的参数类似:
...
glutDetachMenu(GLUT_RIGHT_BUTTON);
...
最后,如果我们要释放被菜单使用过的资源,我们可以摧毁它.GLUT提供了glutDestroyMenu函数,原型如下:
void glutDestroyMenu(int menuIdentifier);
menuIdentifier - 要摧毁的菜单的ID.该ID就是glutCreateMenu函数创建时返回的值.
[译]GLUT教程 - 弹出菜单基础的更多相关文章
- [译]GLUT教程(目录)
http://www.lighthouse3d.com/tutorials/glut-tutorial/ GLUT是OpenGL Utility Toolkit的意思.作者Mark J. Kilgar ...
- [译]GLUT教程 - 游戏模式
Lighthouse3d.com >> GLUT Tutorial >> Extras >> Game Mode 根据GLUT官网的说明,GLUT的游戏模式是为开启 ...
- web标准(复习)--4 纵向导航菜单及二级弹出菜单
今天我们开始学习纵向导航菜单及二级弹出菜单,包含以下内容和知识点: 纵向列表 标签的默认样式 css派生选择器 css选择器的分组 纵向二级列表 相对定位和绝对定位 一.纵向列表纵向列表或称为纵向导航 ...
- Web标准:四、纵向导航菜单及二级弹出菜单
Web标准:四.纵向导航菜单及二级弹出菜单 知识点: 1.纵向列表 2.标签的默认样式 3.css派生选择器 4.css选择器的分组 5.纵向二级列表 6.相对定位和绝对定位 1)纵向列表 可以看 ...
- [译]GLUT教程 - 创建和关闭子窗体
Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Creating and Destroying Subwind ...
- [译]GLUT教程 - 整合代码4
Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> The Code So Far IV 以下代码使用了位图字 ...
- [译]GLUT教程 - 位图字体
Lighthouse3d.com >> GLUT Tutorial >> Fonts >> Bitmap Fonts 位图字体一般是二维字体.虽然我们会把它放到三维 ...
- css+html+js实现多级下拉和弹出菜单
本文将使用css+html+js实现横向菜单.具有多级弹出菜单下拉. 首先我们来看看效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvajkwMzgy ...
- [译]Vulkan教程(15)图形管道基础之RenderPass
[译]Vulkan教程(15)图形管道基础之RenderPass Render passes Setup 设置 Before we can finish creating the pipeline, ...
随机推荐
- LCA【p4281】[AHOI2008]紧急集合 / 聚会
Description 欢乐岛上有个非常好玩的游戏,叫做"紧急集合".在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等 ...
- spoj 913 Query on a tree II (倍增lca)
Query on a tree II You are given a tree (an undirected acyclic connected graph) with N nodes, and ed ...
- 【状态压缩DP】【BZOJ1087】【SCOI2005】互不侵犯king
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3135 Solved: 1825[Submit][ ...
- Spring/Spring MVC/Spring Boot实现跨域
说明:Spring MVC和Spring Boot其实用的都是同一套. CORS介绍请看这里:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Acc ...
- flex skin
原文地址:http://blog.163.com/to_yht/blog/static/1227257742009741359326/当程序做完后,你是否还在为老套的flex组件默认效果发愁?是否还在 ...
- WebStrom配置多个项目的Dweployment时,设置默认的启动配置
有时候,我们在WebStrom中打开多个项目,但是每个项目可能的Deployment的配置不同,所以每次在项目中时,可能打开的网页并不对.所以需要设置默认的启动的Deployment.下面的内容是设置 ...
- 使用ASIHTTPRequest 编译提示找不到"libxml/HTMLparser.h"的解决方法
使用ASIHTTPRequest xcode编译提示找不到"libxml/HTMLparser.h",解决方法如下: 1>.在xcode中左边选中项目的root节点,在中间编 ...
- windows下如何添加、删除和修改静态路由
1.添加一条路由表 route add 192.168.100.0 mask 255.255.255.248 192.168.1.1 metric 3 if 2 1 2 添加一条路由记录,所有到192 ...
- etcd:从应用场景到实现原理的全方位解读
随着CoreOS和Kubernetes等项目在开源社区日益火热,它们项目中都用到的etcd组件作为一个高可用强一致性的服务发现存储仓库,渐 渐为开发人员所关注.在云计算时代,如何让服务快速透明地接入到 ...
- 利用Python,四步掌握机器学习
为了理解和应用机器学习技术,你需要学习 Python 或者 R.这两者都是与 C.Java.PHP 相类似的编程语言.但是,因为 Python 与 R 都比较年轻,而且更加“远离”CPU,所以它们显得 ...