zoukankan      html  css  js  c++  java
  • glut弹出式菜单

    弹出式菜单(像点鼠标右键出来的菜单那样的)也是GLUT的一部分,虽然它不能实现我们经常看到的windows系统弹出式菜单的所有的功能,但是它也有很大的作用。给一个程序增加菜单提供了一个比键盘更简单的方法来和程序交互,选择不同选项,而不用去记那些按键。
     
    我们首先要做的是创建菜单,创建菜单函数glutCreateMenu的原型如下:
    int glutCreateMenu(void (*func)(int value));
    参数:
     func:为新建的菜单处理菜单事件的函数名。
    这个函数的返回值是菜单的标识符(menu identifier)。
     
    我们的程序中,我们可以相加多少菜单就加多少菜单。对每个菜单我们要指定一个回调函数,而且我们可以指定相同的函数。下面为菜单增加一些条目(出来个空菜单也没什么用)。
    使用的函数是glutAddMenuEntry:
    void glutAddMenuEntry(char *name,int value);
    参数:
     name:菜单名称的字符串。
     value:当你选择菜单里的一项后,这个值就返回给上面的glutCreateMenu里调用的函数。
    这个函数根据函数名来看,就是给菜单里添加条目的,可以一直添加(这里有个顺序,自己实验下就明白了的)。
     
    好了现在有了一个弹出式菜单。但还有最后一件事要做,就是把菜单和一个鼠标键连接起来(attach)。因为我们必须指定菜单怎么出现,使用GLUT你可以在按下一个鼠标按键后让菜单显示,函数是glutAttachMenu:
    void glutAttachMenu(int button);
    参数:
     button: 一个整数,指定菜单和哪个鼠标键关联起来。
    botton 可以去下面的值;
     GLUT_LEFT_BUTTON
     GLUT_MIDDLE_BUTTON
     GLUT_RIGHT_BUTTON
     
    下面就是一个应用了上面所有函数的例子。
    ...
    #define RED 1
    #define GREEN 2
    #define BLUE 3
    #define WHITE 4
    ...
    void createGLUTMenus() {
     
             int menu;
     
             // 创建菜单并告诉GLUT,processMenuEvents处理菜单事件。
             menu = glutCreateMenu(processMenuEvents);
             
             //给菜单增加条目
             glutAddMenuEntry("Red",RED);
             glutAddMenuEntry("Blue",BLUE);
             glutAddMenuEntry("Green",GREEN);
             glutAddMenuEntry("White",WHITE);
             
             // 把菜单和鼠标右键关联起来。
             glutAttachMenu(GLUT_RIGHT_BUTTON);
    }
    注意RED,BLUE,GREEN,和WHITE必须定义为整数,再就是你必须为每个选单(菜单里的条目)定义不同的value,
     
    下面我们写处理菜单事件的函数。我们将使用我们的菜单来设置三角形的颜色。函数如下:
    void processMenuEvents(int option) {
            //option,就是传递过来的value的值。
             switch (option) {
                     case RED : 
                              red = 1.0; 
                              green = 0.0; 
                              blue = 0.0; break;
                     case GREEN : 
                              red = 0.0; 
                              green = 1.0; 
                              blue = 0.0; break;
                     case BLUE : 
                              red = 0.0; 
                              green = 0.0; 
                              blue = 1.0; break;
                     case WHITE : 
                              red = 1.0; 
                              green = 1.0; 
                              blue = 1.0; break;
             }
    }
    剩下来的就是把我们的createGLUTMenus函数放到main函数里。下面的代码就是当前的main函数。
    void main(int argc, char **argv) {
             glutInit(&argc, argv);
             glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
             glutInitWindowPosition(100,100);
             glutInitWindowSize(320,320);
             glutCreateWindow("SnowMen");
             glutDisplayFunc(renderScene);
             glutIdleFunc(renderScene);
             glutReshapeFunc(changeSize);
     
             //调用我们的函数来创建菜单
             createGLUTMenus();
     
             glutMainLoop();
    }
  • 相关阅读:
    递归函数及Java范例
    笔记本的硬盘坏了
    “References to generic type List should be parameterized”
    配置管理软件(configuration management software)介绍
    WinCE文件目录定制及内存调整
    使用Silverlight for Embedded开发绚丽的界面(3)
    wince国际化语言支持
    Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
    WinCE Heartbeat Message的实现
    使用Silverlight for Embedded开发绚丽的界面(2)
  • 原文地址:https://www.cnblogs.com/dragon2012/p/3119568.html
Copyright © 2011-2022 走看看