Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2628603
  • 博文数量: 333
  • 博客积分: 4817
  • 博客等级: 上校
  • 技术积分: 4413
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-28 10:51
文章分类

全部博文(333)

文章存档

2017年(20)

2016年(57)

2015年(27)

2014年(20)

2013年(21)

2012年(164)

2011年(24)

分类: 高性能计算

2015-06-09 17:35:08

[译]GLUT教程之Keyboard

GLUT使我们的应用可以检测到键盘上的输入,无论是"普通"的还是像F1和UP一样的特殊输入.通过这一节我们将了解如何检测按下了哪个键,  我们还可以从GLUT得到什么其他信息, 和如何处理它.



到目前为止你可能注意到, 当你要控制处理某个事件时, 你必须事先告诉GLUT要调用哪个函数. 截止到目前为止, 我们使用GLUT告诉windows系统当窗口要重新渲染时该用什么函数, 当系统空闲时该用什么函数, 当窗口改变大小时该用什么函数.


我们也要为键盘事件做同样的事情.  我们要告诉GLUT当一个键被按下时, 哪个函数将要执行这个过程.


GLUT提供了2个键盘注册回调函数.  第一个, glutKeyboardFunc, 用来告诉windows系统我们调用哪个函数处理"普通"按键. "普通"按键就是指, 单词,数字,任何有ASCII码的东西. 这个函数的语法如下:


void glutKeyboardFunc(void (*func) (unsigned char key, int x, int y));

Parameters:

  • func – The name of the function that will process the “normal” keyboard events. Passing NULL as an argument causes GLUT to ignore “normal” keys.

这个函数需要三个参数. 第一个是按键的ASCII码, 剩下的是按键时候的鼠标坐标. 鼠标坐标是相对窗口的左上角的.



这个函数的一种可能实现就是当用户按下ESC键时退出应用. 注意到当glutMainLoop()函数执行时它是个无穷循环, ie.它永远不会返回. 唯一退出这个循环的方式就是调用exit函数. 这就是我们的函数将要做的, 当用户按下按下esc键调用exit函数使应用终结.(记得包含stdlib.h)下面我们展示下函数的代码:


注意我们要用跟上面函数glutKeyboardFunc声明一样的符号. 否则你在vc中就会编译错误. 我们不希望那样, 不是吗?


好的, 我们继续?  现在让我们来解决特殊键. GLUT提供了glutSpecialFunc. 函数语法如下:


void glutSpecialFunc(void (*func) (int key, int x, int y));

Parameters:

  • func – The name of the function that will process the special keyboard events. Passing NULL as an argument causes GLUT to ignore the special keys.


我们要写一个当按下特殊按键时三角形就会变色的函数. 这个函数按下F1,F2,F3会使三角形分别变成红绿蓝.

GLUT_KEY_*在glut.h里面预定义好了.整个集合如下:

为了成功编译上面的processSpecialKeys, 我们需要在代码的开始处添加红绿蓝变量的声明. 此外, 为了达到预期的效果, 我们还要修改下渲染函数, renderScene.


好, 现在我们准备告诉GLUT上面函数是用来处理键盘事件的. 换而言之就是我们要调用glutKeyboardFunc 和 glutSpecialFunc了.


这个调用函数可以在任何地方使用, 就是说我们可以在任何时候改变键盘处理函数.  然而这不是一个正常的特性, 所以我们把它放在main函数里.  下面我们要展示下main函数( 注意这个函数依仗于先前的教程...)

CTRL,ALT and SHIFT

有时候我们想知道是否modifier键(ie CTRL,ALT,SHIFT)被按下.  GLUT提供了这么个函数. 这个函数只能在处理键盘和鼠标输入函数的内部调用. 语法如下:

int glutGetModifiers(void);

函数的返回值可以是三个预定义的常数(glut.h), 或者他们三个的位组合.  他们是:

  • GLUT_ACTIVE_SHIFT – 当你按下 SHIFT , 或者 Caps Lock . 注意它们同时按下时不置
  • GLUT_ACTIVE_CTRL  –  当你按下 CTRL.
  • GLUT_ACTIVE_ALT    –   alt.


所以让我们拓展下processNormalKeys, 看下如何处理这些modified键. 加入你要变量red是0.0当用户按下'r',  1.0当用户按下ALT + r. 下面的代码展示了这些功能:


最后一件事, 如何检测CTRL+ALT+F1, 代码如下:



阅读(2110) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~