zoukankan      html  css  js  c++  java
  • [译]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函数创建时返回的值.

  • 相关阅读:
    计算机网络的三种通讯模式(单播,广播,组播)
    java字符串面试题
    java使用纯命令行打包项目
    java字节码的工具(含IDEA插件)
    Spring配置之context:annotation与、component-scan以及annotation-driven
    Java ThreadLocal的使用案例
    对称平方数(to_string函数,stoi函数真香)
    字符串最后一位长度
    缺失的括号
    数三角形
  • 原文地址:https://www.cnblogs.com/live41/p/3392173.html
Copyright © 2011-2022 走看看