[译]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, ...
随机推荐
- Python实现微信小程序支付功能
由于最近自己在做小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程.当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程. 1.支付交互流程 当然具体的参数配置可以参考官 ...
- 模板—字符串—AC自动机(多模式串,单文本串)
模板—字符串—AC自动机(多模式串,单文本串) Code: #include <queue> #include <cstdio> #include <cstring> ...
- hdu6035(树形DP)
hdu6035 题意 给出一棵树,现在定义两点之间距离为两点间最短路径上颜色集合的大小.问任意两点间距离之和. 分析 换个方向,题目其实等价于求每种颜色在多少条路径上出现过(每种颜色对于答案的贡献), ...
- Lightoj 1348 Aladdin and the Return Journey (树链剖分)(线段树单点修改区间求和)
Finally the Great Magical Lamp was in Aladdin's hand. Now he wanted to return home. But he didn't wa ...
- APIO2018练习赛伪题解
传送门:https://pcms.university.innopolis.ru/statements/org/apio/2018/practice/statements.pdf 主要就在于后面三道构 ...
- 集合框架(02)List
List的类型和特点: ArrayList:底层的数据结构使用的是数组结构.特点:查询的速度很快,但是增删稍慢 线程不同步 LinKedList:底层使用的链表数据结构.特点:增删的速度很快,查询稍慢 ...
- linux64位使用xampp及常见问题
linux64位使用xampp及常见问题 换上ubntu9.10 64位,作为web工作者来说apache.php.mysql都必要安装的,在win里习惯了xampp,不是服务器为什么非要一个一个装呢 ...
- Android Studio+WebApi(一)属于我们自己的App
AndroidStudio(以后都简称AS),作为google的亲儿子,终于出了个像样的android ide,再也不用在eclipse中又是Adt,又是这又是那的,一大堆的集成了.废话不多说,这个系 ...
- C++ 模板应用 实现一个Queue 队列
#include<iostream> using namespace std; template <typename T> class Queue { public: Queu ...
- sass的高级语法
1. 变量 sass允许使用变量,所有变量以$开头 2.引用父元素 & 这里 "&" 就代表是 a 3.继承 这样 class2 就 拥有了class1的所有属性 ...