- glutDisplayFunc 注册当前窗口函数
- glultReshapeFunc 注册当前窗口的形状变化回调函数
- glutMouseFunc 注册当前窗口的鼠标回调函数
- glutMotionFunc 设置移动回调函数
- glutIdleFunc 设置全局的空闲回调函数
- glutVisibilityFunc 设置当前窗口的可视回调函数
- glutKeyboardFunc、glutSpecialFunc 注册当前窗口的键盘回调函数
- glutPassiveMotionFunc 设置当前窗口的被动移动回调函数
- glutEntryFunc 设置当前窗口的鼠标进出回调函数
- glutMenuStatusFunc 设置全局的菜单状态回调函数
- glutTimerFunc 注册按一定时间间隔触发的定时器回调函数
1. glutDisplayFunc 注册当前窗口函数
void glutDisplayFunc(void (* func)(void))
参数说明:func 显示回调函数,func无需传入参数。不能使用NULL作为参数
该函数注册当前窗口的显示回调函数。当一个窗口的图像层需要重新绘制(调用glutPostDisplay函数或者用户进行了某些窗口操作比如窗口大小改变)时,GLUT将调用该窗口的显示回调函数
2. glultReshapeFunc 注册当前窗口的形状变化回调函数
void glultReshapeFunc(void (* func)(int width, int height))
参数说明:func 形状变化回调函数。func的传入参数为width和height
width和height会在窗口发生变化后将新的值传给func,无需用户设置。
3. glutMouseFunc 注册当前窗口的鼠标回调函数
void glutMouseFunc(void (* func)(int button, int state, int x, int y))
参数说明:func 鼠标回调函数(当按下对应鼠标键时,调用func进行响应),func的传入参数为button,state,x和y
button 定义的鼠标按键。可选择的符号常数为:GLUT_LEFT_BUTTON、GLUT_MIDDLE_BUTTON和 GLUT_RIGHT_BUTTON,分别表示鼠标左、中、右键。
state 定义的鼠标按键的动作。可选择的符号常数为:GLUT_UP 和GLUT_DOWN,分别表示鼠标按键的按下和释放。
x y 按下鼠标时,鼠标相对于窗口左上角的x,y坐标
如果有菜单和窗口都与同一个鼠标按键联系,则鼠标回调不产生,即默认菜单与鼠标有联系,窗口没有。
使用NULL作为参数调用glutMouseFunc函数(即glutMouseFunc(NULL) )来关闭鼠标回调。
4. glutMotionFunc 设置移动回调函数
void glutMotionFunc(void (* func)(int x, int y))
参数说明:func 鼠标回调函数(当按下对应鼠标键时,调用func进行响应),func的传入参数为x和y
x y 按下鼠标时,鼠标相对于窗口左上角的x,y坐标
当鼠标在窗口中移动并且一个或多个鼠标按键按下时,调用该函数。
使用NULL作为参数调用本函数(即glutMotionFunc(NULL) )来关闭移动回调。
5. glutIdleFunc 设置全局的空闲回调函数
void glutIdleFunc (void (* func)(void))
参数说明:func 空闲回调函数
当事件队列为空,即既无外界输入也无内部绘制等动作时,会调用func函数。
使用NULL作为参数调用本函数(即glutIdleFunc(NULL) )来关闭空闲回调。
为避免影响程序的交互,空闲回调函数中执行的计算和绘制数量因尽量减少,通常其执行的绘制量应不超过一帧。
6. glutVisibilityFunc 设置当前窗口的可视回调函数
void glutVisibilityFunc (void (* func)(int state))
参数说明:func 指定可视回调函数
state 指定窗口的可视性。state可选用参数:GLUT_NOT_VISIBLE和GLUT_VISIBLE,前一个表示窗口完全不可见,后一颗表示窗口部分可见或全部可见
当窗口的可视性改变时,会调用本函数。
使用NULL作为参数调用本函数(即glutVisibilityFunc(NULL) )来关闭可视回调。
7. glutKeyboardFunc glutSpecialFunc 注册当前窗口的键盘回调函数
void glutKeyboardFunc (void (* func)(unsigned char key, int x, int y))
参数说明:func 指明键盘回调函数
key 生成的ASCII字符
x,y 按下key键时,鼠标相对于窗口左上角的x,y坐标。
void glutSpecialFunc (void (* func)(int key, int x, int y))
参数说明:key 按下的特定键
func x y 与上一个相同
这两个函数都是在按下键盘按键时调用回调函数,都可以使用NULL作为参数调用函数来关闭回调。
不同之处在于,keyboard函数中的key是有对应ASCII码的键盘,比如’a’ '.'等字母和符号,相对的,special函数中的key是非ASCII键,比如F1,F4,PageUp,上下左右方向键等等。
keyboard函数中的key直接将字符作为参数传递即可。
special函数中的key可选常数值如下:
GLUT_KEY_F1 F1功能键
GLUT_KEY_F2 F2功能键
GLUT_KEY_F3 F3功能键
……
GLUT_KEY_F11 F11功能键
GLUT_KEY_F12 F12功能键
GLUT_KEY_UP 上方向键
GLUT_KEY_DOWN 下方向键
GLUT_KEY_LEFT 左方向键
GLUT_KEY_RIGHT 右方向键
GLUT_KEY_PAGE_UP PageUp键
GLUT_KEY_PAGE_DOWN PageDown键
GLUT_KEY_HOME Home键
GLUT_KEY_END End键
GLUT_KEY_INSERT Insert键
8. glutPassiveMotionFunc 设置当前窗口的被动移动回调函数
void glutPassiveMotionFunc(void(*func)(int x,int y))
参数说明:func 指定被动移动回调函数
x y 鼠标在窗口中移动时,相对于窗口左上角的x y坐标
当鼠标在窗口中移动并且没有鼠标键按下时,调用func
9. glutEntryFunc 设置当前窗口的鼠标进出回调函数
void glutEntryFunc (void(*func)(int state))
参数说明:func 指定鼠标进出回调函数
state 根据鼠标指针的状态有GLUT_LEFT和GLUT_RIGHT两种,取决于鼠标指针是离开还是进入窗口
10. glutMenuStatusFunc 设置全局的菜单状态回调函数
void glutMenuStatusFunc(void (*func)(int status, int x, int y))
void glutMenuStateFunc(void (*func)(int state))
参数说明:func 回调函数
status 根据当前是否使用菜单有GLUT_MENU_IN_USE(菜单正在使用)和GLUT_MENU_NOT_IN_USE(菜单未被使用)两种
x y鼠标按键被按下时,鼠标指针在窗口中的坐标
glutMenuStateFunc是glutMenuStatusFunc的旧版本,唯一不同的是没有xy坐标的传入
11. glutTimerFunc 注册按一定时间间隔触发的定时器回调函数
void glutTimerFunc(unsigned int msecs, void (*func)(int value) )
void glutTimerFunc(unsigned int msecs, void (*func)(int value) ,int value)
参数说明:msecs:回调函数触发的时间间隔(以毫秒为单位)
func 回调函数 value传递到回调函数中的值
value 计时器的标识符,当使用多个计时器时可以用以进行分辩
glutTimerFunc每隔msecs时间调用func,value的值等于注册此回调函数时传给glutTimerFunc的值。
msecs只是func下一次调用func前必须等待的最短时间
注销回调函数:没有提供,但是可以通过忽视value来间接注销。不太明白的话可以下面的第二段代码。
现在一般用的是第二个,也就是有三个参数的这个,第一个是在教材上看的,但似乎已经不用了。
比如画一个上下移动的矩形。
#include <windows.h>
#include <stdlib.h>
#include <GL/glut.h>
#include <stdio.h>
float planex=-0.04,planey=-0.92;//矩形左上角的坐标
float step = 0.05;
void draw(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0,1,0);
planey += step;
if(planey<-0.92) step=0.05;
if(planey>1.0) step=-0.05;
glRectf(planex,planey,planex+0.08,planey-0.08);
glutSwapBuffers();
}
void timerfunc(int value){
glutPostRedisplay();
glutTimerFunc(100,timerfunc,0);
}
int main(int argc,char *argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(0,0);
glutInitWindowSize(500,700);
glutCreateWindow("");
glutDisplayFunc(draw);
glutTimerFunc(200,timerfunc,0);
glutMainLoop();
return 0;
}
遇到多个计时器的时候,可以这么做:
void timerfunc(int value){
if(value==0){
……
glutTimerFunc(200,timerfunc,0);
} else if(value==1){
……
glutTimerFunc(600,timerfunc,1);
}
glutPostRedisplay();
}
int main(int argc,char *argv[]){
glutInit(&argc,argv);
……
glutTimerFunc(200,timerfunc,0);
glutTimerFunc(600,timerfunc,1);
glutMainLoop();
return 0;
}
所以如果想注销某个回调函数的话,可以这么做,比如要注销glutTimerFunc(600,timerfunc,1):
void timerfunc(int value){
static int isstop = 0;//0的时候正常运行,1的时候表示注销
if(value==0){
……
glutTimerFunc(200,timerfunc,0);
} else if(value==1){
if(......){//注销该回调函数的触发条件
isstop=1;
}
if(isstop==0){
……
glutTimerFunc(600,timerfunc,1);
}
}
glutPostRedisplay();
}
int main(int argc,char *argv[]){
glutInit(&argc,argv);
……
glutTimerFunc(200,timerfunc,0);
glutTimerFunc(600,timerfunc,1);
glutMainLoop();
return 0;
}
本节提到的第3-11个函数都可以使用NULL作为参数调用函数来关闭对应回调。