您的位置:首页 > 其它

[译]GLUT教程 - 弹出菜单基础

2013-10-28 12:15 218 查看
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函数创建时返回的值.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: