先来看看回调函数的实现机制:
①定义一个回调函数
②提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者
③当特定的时间或者条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理
这里以函数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 :