第十六讲 菜单管理
来源:互联网 发布:淘宝2017半身长裙花色 编辑:程序博客网 时间:2024/05/14 21:32
菜单是我们经常使用的工具,很方便,直观。本节讨论在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值。
例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值。
- 第十六讲 菜单管理
- 第十六讲:菜单 Android Menu
- 第十六讲
- 第十六讲:多重继承
- 第十六讲-方法重载
- 第十六讲:多重继承
- 第十六讲项目5.1
- 读书笔记(第十六讲)OVERLOAD
- 第十六讲:运算符重载
- Linux运维第十六讲
- 第六讲 菜单设计
- 第六讲,菜单编程
- 大讲-----原优酷菜单
- Excel VBA高效办公应用-第十六章-VBA高效文件操作(使用级联菜单管理多个工作簿)
- C#锐利体验 第十六讲 映射
- 第十六讲 交互效果(二)
- JavaSE第十六讲:方法重载剖析
- Stanford机器学习---第十六讲. PHOTO ORC
- 第十三讲 二次几何体
- 第十四讲 像素操作
- 第十五讲 动画制作
- PB---走你的路还有多长?
- 利用Word打印报表(二) ------打开指定word文档并打印
- 第十六讲 菜单管理
- c++ server测试全攻略 [转]
- 处理图片大小
- 关于CSDN 上的 FCKEditor的使用技巧
- 利用Word打印报表(三)----在jsp中利用word打印指定格式的会议记录
- VC2005下利用OpenGL实现三维绘图
- 提示信息 感应鼠标移动事件 自动显示url页面内容
- WEBOPT中http代理的设置
- 对.NET资源文件的资料收集