您的位置:首页 > 运维架构

OpenGL---GLUT教程(十) GLUT菜单

2013-11-04 11:50 393 查看
转自/article/9087258.html

GLUT教程

弹出式菜单基础

弹出式菜单(像点鼠标右键出来的菜单那样的)也是GLUT的一部分,虽然它不能实现我们经常看到的windows系统弹出式菜单的所有的功能,但是它也有很大的作用。给一个程序增加菜单提供了一个比键盘更简单的方法来和程序交互,选择不同选项,而不用去记那些按键。

我们首先要做的是创建菜单,创建菜单函数glutCreateMenu的原型如下:

intglutCreateMenu(void(*func)(intvalue));

参数:

func:为新建的菜单处理菜单事件的函数名。

这个函数的返回值是菜单的标识符(menuidentifier)。

我们的程序中,我们可以相加多少菜单就加多少菜单。对每个菜单我们要指定一个回调函数,而且我们可以指定相同的函数。下面为菜单增加一些条目(出来个空菜单也没什么用)。

使用的函数是glutAddMenuEntry:

voidglutAddMenuEntry(char*name,intvalue);

参数:

name:菜单名称的字符串。

value:当你选择菜单里的一项后,这个值就返回给上面的glutCreateMenu里调用的函数。

这个函数根据函数名来看,就是给菜单里添加条目的,可以一直添加(这里有个顺序,自己实验下就明白了的)。

好了现在有了一个弹出式菜单。但还有最后一件事要做,就是把菜单和一个鼠标键连接起来(attach)。因为我们必须指定菜单怎么出现,使用GLUT你可以在按下一个鼠标按键后让菜单显示,函数是glutAttachMenu:

voidglutAttachMenu(intbutton);

参数:

button:一个整数,指定菜单和哪个鼠标键关联起来。

botton可以去下面的值;

GLUT_LEFT_BUTTON

GLUT_MIDDLE_BUTTON

GLUT_RIGHT_BUTTON

下面就是一个应用了上面所有函数的例子。

...

#defineRED1

#defineGREEN2

#defineBLUE3

#defineWHITE4

...

voidcreateGLUTMenus(){


intmenu;


//
创建菜单并告诉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,

下面我们写处理菜单事件的函数。我们将使用我们的菜单来设置三角形的颜色。函数如下:

voidprocessMenuEvents(intoption){

//option
,就是传递过来的value的值。

switch(option){

caseRED:

red=1.0;

green=0.0;

blue=0.0;break;

caseGREEN:

red=0.0;

green=1.0;

blue=0.0;break;

caseBLUE:

red=0.0;

green=0.0;

blue=1.0;break;

caseWHITE:

red=1.0;

green=1.0;

blue=1.0;break;

}

}


剩下来的就是把我们的createGLUTMenus函数放到main函数里。下面的代码就是当前的main函数。

voidmain(intargc,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();


}


VC工程可以在这里下载(glut7.zip)。

下面我们还来看两个函数,第一个允许我们断开鼠标按键和一个菜单的关联。前面我们用glutAttachMenu来在鼠标和菜单间建立关联,但我们有时候需要断开这种关联。完成这个工作的函数是glutDetachMenu。函数原型如下:

voidglutDetachMenu(intbutton);

参数:

button:要断开的鼠标按键。

Button的取值和glutAttachMenu一样。因此,要是我们想断开关联我们可以这样:

...

glutDetachMenu(GLUT_RIGHT_BUTTON);

...


最后,如果你想恢复被菜单使用了的资源,我们可以销毁(destroy)它,相应的函数是glutDestroyMenu,它的原型如下:

voidglutDestroyMenu(intmenuIdentifier);

参数:

menuIdentifier:要销毁的菜单的标识符,它必须和函数glutCreateMenu返回的值相同。

好了,到这里你已经知道了基本的在GLUT中建立菜单,下章我们将探索更多的弹出式菜单功能。

(汗--||最近考试,烦。考完了一定尽快完成这翻译。感觉他这说的挺啰嗦的,稍微看下后,再自己看看源代码,估计就懂了,再自己写程序时也无意识的用用菜单功能,就基本上会了。那个标识符很重要的,别忘了。

原文地址:http://www.lighthouse3d.com/opengl/glut/index.php?10)

GLUT教程

弹出式菜单基础

弹出式菜单(像点鼠标右键出来的菜单那样的)也是GLUT的一部分,虽然它不能实现我们经常看到的windows系统弹出式菜单的所有的功能,但是它也有很大的作用。给一个程序增加菜单提供了一个比键盘更简单的方法来和程序交互,选择不同选项,而不用去记那些按键。

我们首先要做的是创建菜单,创建菜单函数glutCreateMenu的原型如下:

intglutCreateMenu(void(*func)(intvalue));

参数:

func:为新建的菜单处理菜单事件的函数名。

这个函数的返回值是菜单的标识符(menuidentifier)。

我们的程序中,我们可以相加多少菜单就加多少菜单。对每个菜单我们要指定一个回调函数,而且我们可以指定相同的函数。下面为菜单增加一些条目(出来个空菜单也没什么用)。

使用的函数是glutAddMenuEntry:

voidglutAddMenuEntry(char*name,intvalue);

参数:

name:菜单名称的字符串。

value:当你选择菜单里的一项后,这个值就返回给上面的glutCreateMenu里调用的函数。

这个函数根据函数名来看,就是给菜单里添加条目的,可以一直添加(这里有个顺序,自己实验下就明白了的)。

好了现在有了一个弹出式菜单。但还有最后一件事要做,就是把菜单和一个鼠标键连接起来(attach)。因为我们必须指定菜单怎么出现,使用GLUT你可以在按下一个鼠标按键后让菜单显示,函数是glutAttachMenu:

voidglutAttachMenu(intbutton);

参数:

button:一个整数,指定菜单和哪个鼠标键关联起来。

botton可以去下面的值;

GLUT_LEFT_BUTTON

GLUT_MIDDLE_BUTTON

GLUT_RIGHT_BUTTON

下面就是一个应用了上面所有函数的例子。

...

#defineRED1

#defineGREEN2

#defineBLUE3

#defineWHITE4

...

voidcreateGLUTMenus(){


intmenu;


//
创建菜单并告诉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,

下面我们写处理菜单事件的函数。我们将使用我们的菜单来设置三角形的颜色。函数如下:

voidprocessMenuEvents(intoption){

//option
,就是传递过来的value的值。

switch(option){

caseRED:

red=1.0;

green=0.0;

blue=0.0;break;

caseGREEN:

red=0.0;

green=1.0;

blue=0.0;break;

caseBLUE:

red=0.0;

green=0.0;

blue=1.0;break;

caseWHITE:

red=1.0;

green=1.0;

blue=1.0;break;

}

}


剩下来的就是把我们的createGLUTMenus函数放到main函数里。下面的代码就是当前的main函数。

voidmain(intargc,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();


}


VC工程可以在这里下载(glut7.zip)。

下面我们还来看两个函数,第一个允许我们断开鼠标按键和一个菜单的关联。前面我们用glutAttachMenu来在鼠标和菜单间建立关联,但我们有时候需要断开这种关联。完成这个工作的函数是glutDetachMenu。函数原型如下:

voidglutDetachMenu(intbutton);

参数:

button:要断开的鼠标按键。

Button的取值和glutAttachMenu一样。因此,要是我们想断开关联我们可以这样:

...

glutDetachMenu(GLUT_RIGHT_BUTTON);

...


最后,如果你想恢复被菜单使用了的资源,我们可以销毁(destroy)它,相应的函数是glutDestroyMenu,它的原型如下:

voidglutDestroyMenu(intmenuIdentifier);

参数:

menuIdentifier:要销毁的菜单的标识符,它必须和函数glutCreateMenu返回的值相同。

好了,到这里你已经知道了基本的在GLUT中建立菜单,下章我们将探索更多的弹出式菜单功能。

(汗--||最近考试,烦。考完了一定尽快完成这翻译。感觉他这说的挺啰嗦的,稍微看下后,再自己看看源代码,估计就懂了,再自己写程序时也无意识的用用菜单功能,就基本上会了。那个标识符很重要的,别忘了。

原文地址:http://www.lighthouse3d.com/opengl/glut/index.php?10)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: