GLUT 调用回调函数API的理解与小结

来源:互联网 发布:gifcam mac版下载 编辑:程序博客网 时间:2024/06/05 00:18

       先来看看回调函数的实现机制:

①定义一个回调函数

②提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者

③当特定的时间或者条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理

这里以函数glutReshapeFunc()为例。这个函数是指当窗口大小发生改变、或者在创建窗口后初始化时,就会响应这个API函数。

首先看下glutReshapeFunc()函数在GLUT库中的定义:

extern void APIENTRY glutReshapeFunc(void (*func)(int width, int height));这里可以明显的看到这个函数的参数是一个指向void func(int width,int height)函数的函数指针。因此,这个函数指针作为调用函数glutReshapeFunc()的参数,当调用函数对发生事件或条件做出响应时,就会执行函数指针所指向的函数代码,这里函数指针所指向的函数我们称之为回调函数。下面根据一个具体的例子进行讲解。

...

glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800,800);
glutInitWindowPosition(100,100);
glutCreateWindow(argv[0]);

...

glutReshapeFunc(reshape);//指定当窗口的大小改变时调用的函数、以及初始化时调用该函数

...

在创建了窗口后,初始化就会调用glutReshapeFunc(reshape);这个调用函数就会使用函数指针调用回调函数响应对事件的处理。

这里解释下函数指针,对于reshape函数定义如下:

void reshape(int w,int h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
{
glOrtho(-20.0,20.0,-20.0*h/w,20.0*h/w,-100.0,100.0);
}
else
{
glOrtho(-20.0*w/h,20.0*w/h,-20.0,20.0,-100.0,100.0);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
mouseControl.resize(w,h);
}

那么一个指向这个reshape()函数的函数指针的类型为:void *(_reshape)(int w,int h);

当我们将这个函数指针指向reshape函数时:_reshape  = reshape;(即reshape就是指向函数reshape()自己本身的一个函数指针)。

因此对于glutReshapeFunc(void (*func)(int width, int height));直接用glutReshapeFunc(reshape);调用即可。

这里,我觉得需要注意的是在看了网上好多关于glutReshapeFunc();函数的说明,好多都说这个函数是回调函数,这种说法是不恰当的,glutReshapeFunc()作为调用函数,而函数指针所指向的才是回调函数。

记录这些只是作为自己的一个读书笔记。若有大神路过,请指导。。。


以下列出几个常用的API

void glutDisplayFunc(void (*func)(void));
注册当前窗口的显示回调函数

void glutKeyboardFunc(void (*func)(unsigned char key, int x, int y));
注册当前窗口的键盘回调函数

void glutMouseFunc(void (*func)(int button, int state, int x, int y));
注册当前窗口的鼠标回调函数

void glutMotionFunc(void (*func)(int x, int y));

当鼠标在窗口中按下并移动时调用glutMotionFunc注册的回调函数

voidglutPassiveMotionFunc(void (*func)(int x, int y));
当鼠标在窗口中移动时调用glutPassiveMotionFunc注册的回调函数

void glutEntryFunc(void (*func)(int state));
设置鼠标的进出窗口的回调函数

void glutVisibilityFunc(void (*func)(int state));
设置当前窗口的可视回调函数

void glutTimerFunc(unsigned int millis, void (*func)(int value), int value);
注册一个回调函数,当指定时间值到达后,由GLUT调用注册的函数一次












1 0
原创粉丝点击