[译]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函数创建时返回的值.

 

 

posted @ 2013-10-28 12:15  Clotho_Lee  阅读(1576)  评论(0编辑  收藏  举报