【VIP专享】OPENGL-第6章交互处理

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Baidu Nhomakorabea
鼠标事件
鼠标的键有按键动作: void glutMouseFunc (func) 注册一个鼠标事件的回调函数 回调函数:func (int button, int state,
int x, int y)
Button:哪个键?左键还是右键 (GLUT_LEFT_BUTTON)(GLUT_RIGHT_BUTTON)
(在当前菜单底部添加新的菜单项,且赋ID号)
菜单项名
ID
11 12
主菜单和子菜单建立关系
void glutAddSubMenu(char *name, int menu) (在主菜单name下添加子菜单名)
例如: nSolidMenu = glutCreateMenu(ProcessMenu); glutAddSubMenu("Solid", nSolidMenu);
state:按下还是抬起? GLUT_UP or GLUT_DOWN
鼠标事件
鼠标移动事件: • 当鼠标的某个键被按下同时在窗口内移动。x,y光
标的位置 void glutMotionFunc (void (* func)(int x, int y))
• 当鼠标的键未被按下,在窗口内移动。 void glutPassiveMotionFunc(void (* func)(int x, int y))
if(nStep > 5) nStep = 0;
} // Refresh the Window glutPostRedisplay(); }
第2章lines
键盘事件-非ASCII生成键:
事件函数: glutSpecialFunc(SpecialKeys); 注册一个键盘特殊键事件的回调函数,当有键盘按下
菜单变量:由创建子菜单时赋值,对
1
应的子菜单变量
2
第6章Shapes-menu
屏幕上弹出菜单的条件
void glutAttachMenu(int button) 鼠标的左键、中键还是右键能弹出菜单? button 可选择 GLUT_LEFT_BUTTON GLUT_MIDDLE_BUTTON GLUT_RIGHT_BUTTON
xRot-= 5.0f;
F键: GLUT_KEY_F1
if(key == GLUT_KEY_DOWN)
xRot += 5.0f;
if(key == GLUT_KEY_LEFT)
yRot -= 5.0f;
if(key == GLUT_KEY_RIGHT)
yRot += 5.0f;
……
}
第2章lines
第6章Shapes-menu
如何生成一个菜单?
值:传递给程序的ID号
生成菜单并赋值给菜单名 int glutCreateMenu(void (*func)(int value)) (创建菜单,注册一个回调函数,带参数)
给菜单中加菜单项: void glutAddMenuEntry(char *name,int value)
第6章 交互处理
基本交互处理 键盘操作 鼠标操作 菜单制作
菜单/对话框
• 交互功能:如何交互? • 使用哪个输入设备?键盘/鼠标/消息 • 动作:敲击键盘,点击鼠标,。。。 • 反馈信息:动作反馈,位置反馈 • 要处理的事情和哪个设备有关系? • 要处理的事情和哪个动作有关系? • 要处理的事情和哪个参数有关系? • 要处理的事情放在哪个函数里? • 要处理多少事情? • 动作事件发生后如何自动处理?
事件编程
Display Handler
Keyboard Handler
Mouse Handler
Main Event Loop
键盘事件- ASCII键
事件函数:void glutKeyboardFunc(KeyPressFunc) 注册一个键盘ASCII键事件的回调函数,当有键盘按 下时执行回调函数
鼠标回调函数举例
void glutMouseFunc (mousebutton)
当鼠标左键被按下时
哪个键? 按下/抬起? 当前坐标?
void mousebutton(int button, int state, int x, int y)
{ if (button==GLUT_LEFT_BUTTON && state==GLUT_DOWN) {
回调函数:KeyPressFunc(unsigned char key, int x, int y) 在回调函数中,参数表示了敲击的键和光标位置。 key – 敲击的哪个键; x,y – 光标的位置;
ASCII键动作举例
void KeyPressFunc(unsigned char key, int x, int y) { if(key == 32)//空格键 { nStep++;
glutKeyboardFunc(keyboard);键盘按下
glutSpecialFunc(special);非ASCII键盘按下
glutIdleFunc(animate);空闲函数
弹出式菜单的制作及过程
•考虑菜单的安排:菜单的级数 •生成各子菜单; •对每个菜单项:
•菜单名:让用户看到的菜单项 •菜单变量:程序用,判别是哪个菜单项,即菜单 的ID •生成主菜单; •建立主菜单和子菜单的关系。 •菜单什么情况弹出?(什么动作?) •回调函数对动作对应的操作处理
rx = x; ry = winHeight - y; } }
void glutMotionFunc (motion)
当鼠标按下并移动时
void motion(int x, int y) { rx = x; ry = winHeight - y; }
当前坐标?
各种键盘和鼠标的回调函数总结 glutMouseFunc(mousebutton);鼠标按下 或抬起 glutMotionFunc(motion);鼠标按下并运动
时执行注册函数
回调函数: SpecialKeys (int key, int x, int y) 当某个非ASCII键被敲击时,执行回调函数。例如:
箭头键: 功能键:F1、F2、……F12
非ASCII生成键举例
void SpecialKeys(int key, int x, int y)
{ if(key == GLUT_KEY_UP)
相关文档
最新文档