(六)注册回调函数

  1. glutDisplayFunc 注册当前窗口函数
  2. glultReshapeFunc 注册当前窗口的形状变化回调函数
  3. glutMouseFunc 注册当前窗口的鼠标回调函数
  4. glutMotionFunc 设置移动回调函数
  5. glutIdleFunc 设置全局的空闲回调函数
  6. glutVisibilityFunc 设置当前窗口的可视回调函数
  7. glutKeyboardFunc、glutSpecialFunc 注册当前窗口的键盘回调函数
  8. glutPassiveMotionFunc 设置当前窗口的被动移动回调函数
  9. glutEntryFunc 设置当前窗口的鼠标进出回调函数
  10. glutMenuStatusFunc 设置全局的菜单状态回调函数
  11. 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作为参数调用函数来关闭对应回调。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cvishell是一种基于CVI(C语言开发的集成环境)的交互式开发工具,它提供了一些调用例程来帮助用户进行CVI程序的开发和调试。cvishell的调用例程如下: 1. LoadAndRun:这个例程用于加载和运行一个CVI的可执行文件。它可以用来动态加载和执行程序,方便用户进行程序的调试和测试。 2. CallFunction:这个例程用于调用指定的函数。用户可以通过这个例程在CVI程序中调用其他的函数,并获取返回值。 3. SetGlobalVariable:这个例程用于设置全局变量。用户可以通过这个例程来修改CVI程序中的全局变量的值,以实现程序的逻辑控制。 4. GetGlobalVariable:这个例程用于获取全局变量的值。用户可以通过这个例程来读取CVI程序中的全局变量的值,以做进一步的处理。 5. SendMessage:这个例程用于发送消息给CVI程序的窗口。用户可以通过这个例程来模拟用户的操作,从而实现自动化测试或者控制CVI程序的行为。 6. RegisterCallback:这个例程用于注册回调函数。用户可以通过这个例程将一个函数注册回调函数,当满足某些条件时,CVI程序会自动调用注册函数进行处理。 通过调用上述的例程,用户可以在CVI程序中实现动态加载、函数调用、全局变量的修改和获取、消息的发送和接收以及回调函数注册调用等功能。这些例程为用户提供了方便快捷的开发和调试工具,有助于提高CVI程序的开发效率和质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值