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();
    }
  • 相关阅读:
    [原创.数据可视化系列之六]使用openlyaers进行公网地图剪切
    [原创.数据可视化系列之五]韩国"萨德"系统防御图
    [原创.数据可视化系列之四]跨平台,多格式的等值线和等值面的生成
    [原创.数据可视化系列之三]使用Ol3加载大量点数据
    [原创.数据可视化系列之二]使用cesium三维地图展示美国全球军事基地分布
    [原创.数据可视化系列之一]使用openlayers 3 显示聚合数据
    全球领先的redis客户端:SFedis
    ESSENTIALS OF PROGRAMMING LANGUAGES (THIRD EDITION) :编程语言的本质 —— (一)
    请大家帮我找一找bug —— 一个MySQL解析程序(JAVA实现)
    半个月使用rust语言的体验
  • 原文地址:https://www.cnblogs.com/dragon2012/p/3119568.html
Copyright © 2011-2022 走看看