开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1221|回复: 0
收起左侧

[其它] OpenGL编程轻松入门之菜单管理

[复制链接]

结帖率:61% (35/57)
发表于 2013-2-16 17:08:38 | 显示全部楼层 |阅读模式   海南省海口市
菜单是我们经常使用的工具,很方便,直观。本节讨论在OpenGL中如何进行菜单管理。
例17:本例在蓝色的背景上绘制一个白色的正方形,在窗口内单击鼠标右键,弹出菜单,当选择不同菜单项时命令窗口会显示出是哪个菜单的哪个菜单相被激活。本例一个主菜单,主菜单有3个菜单条目及两个子菜单。两个子菜单都有3个菜单条目。
#include <GL/glut.h>
            #include <stdio.h>
            int menu,subMenu1,subMenu2;

            /*在蓝色的背景上绘制一个白色的正方形*/
void myDraw(void)
            {
 glClearColor(0.0,0.0,1.0,0.0);
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 glColor3f(1.0,1.0,1.0);
 glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);
 glBegin(GL_POLYGON);
 glVertex2f(-0.5,-0.5);
 glVertex2f(-0.5,0.5);
 glVertex2f(0.5,0.5);
 glVertex2f(0.5,-0.5);
 glEnd();
 glutSwapBuffers();
            }

            /*写出当前是哪个菜单*/
void GetCurrentMenu(void)
            {
 int nMenu;
 nMenu = glutGetMenu();
 if(nMenu == menu)
  printf("The current menu is Main Menu.\n");
 if(nMenu == subMenu1)
  printf("The current menu is SubMenu1.\n");
 if(nMenu == subMenu2)
  printf("The current menu is SubMenu2.\n");
            }

            /*子菜单1*/
            void SubMenuFunc1(int data)
            {
 GetCurrentMenu();
 switch(data)
 {
  case 1:
   printf("SubMenu1's item 1 is triggered.\n");
   break;
  case 2:
   printf("SubMenu1's item 2 is triggered.\n");
   break;
  case 3:
   printf("SubMenu1's item 3 is triggered.\n");
   break;
 }
            }

            /*子菜单2*/
            void SubMenuFunc2(int data)
            {
 GetCurrentMenu();
 switch(data)
 {
  case 1:
   printf("SubMenu2's item 1 is triggered.\n");
   break;
  case 2:
   printf("SubMenu2's item 2 is triggered.\n");
   break;
  case 3:
   printf("SubMenu2's item 3 is triggered.\n");
   break;
 }
            }

            /*主菜单*/
void MenuFunc(int data)
            {
 GetCurrentMenu();
 switch(data)
 {
  case 1:
   printf("MainMenu's item 1 is triggered.\n");
   break;
  case 2:
   printf("MainMenu's item 2 is triggered.\n");
   break;
  case 3:
   printf("MainMenu's item 3 is triggered.\n");
   break;
 }
            }

int main(int argc,char ** argv)
            {
 /*初始化*/
 glutInit(&argc,argv);
 glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
 glutInitWindowSize(500,400);
 glutInitWindowPosition(100,100);

 /*创建窗口*/
 glutCreateWindow(" MENU");

 glutDisplayFunc(myDraw);

 /*创建子菜单1并加入菜单条目*/
 subMenu1 = glutCreateMenu(SubMenuFunc1);
 glutAddMenuEntry("SubMenu1's item1",1);
 glutAddMenuEntry("SubMenu1's item2",2);
 glutAddMenuEntry("SubMenu1's item3",3);
 glutAttachMenu(GLUT_RIGHT_BUTTON);

 /*创建子菜单2并加入菜单条目*/
 subMenu2 = glutCreateMenu(SubMenuFunc2);
 glutAddMenuEntry("SubMenu2's item1",1);
 glutAddMenuEntry("SubMenu2's item2",2);
 glutAddMenuEntry("SubMenu2's item3",3);
 glutAttachMenu(GLUT_RIGHT_BUTTON);

 /*创建主菜单并加入菜单条目及子菜单*/
 menu = glutCreateMenu(MenuFunc);
 glutAddMenuEntry("Item1",1);
 glutAddMenuEntry("Item2",2);
 glutAddMenuEntry("Item3",3);
 glutAddSubMenu("SubMenu 1",subMenu1);
 glutAddSubMenu("SubMenu 2",subMenu2);
 glutAttachMenu(GLUT_RIGHT_BUTTON);

 glutMainLoop();//进入GLUT事件处理循环
              return 0;
            }
·int glutCreateMenu(void(*func)(int value))创建一个新的弹出式菜单并返回一个唯一标识此菜单的整型表示符。func指明此菜单的功能。
·int glutAddMenuEntry(char *name,int value)在当前菜单底部增加一个菜单条目。
name指定显示在新菜单条目上的ASCII码字符串。
value指定当选择该菜单条目时传递到菜单回调函数中的数值。
·void glutAddSubMenu(char *name,int menu)在当前菜单的底部增加一个子菜单触发条目。
name指定显示在新菜单触发条目上的ASCII码字符串。
meun当选择该子菜单触发条目时弹出的子菜单的标识符。
·void glutAttachMenu(int button)把当前窗口的一个鼠标按键与当前菜单的标识符联系起来。
button指明鼠标的哪个按键。GLUT_LEFT_BUTTON、GLUT_MIDDLE_BUTTON及GLUT_RIGHT_BUTTON,分别表明鼠标左、中及右键。
·int glutGetMenu(void)获取当前菜单的标识符,如果没有菜单存在或前一个当前菜单被删除了,glutGetMenu则返回0值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表