【转】GLUT教程(五) GLUT键盘控制 收藏
GLUT允許我們編寫程序,在里面加入鍵盤輸入控制,包括了普通鍵,和其他特殊鍵(如
F1,UP)。在這一章里我們將學(xué)習(xí)如何去檢測哪個鍵被按下,可以從GLUT里得到些什么信
息,和如何處理鍵盤輸入。
到現(xiàn)在,你應(yīng)該注意到了,只要你想控制一個事件的處理,你就必須提前告訴GLUT,哪
個函數(shù)將完成這個任務(wù)。到現(xiàn)在為止,我們已經(jīng)使用GLUT告訴窗口系統(tǒng),當(dāng)窗口重繪時我
們想調(diào)用哪個渲染函數(shù),但系統(tǒng)空閑時,哪個函數(shù)被調(diào)用。和當(dāng)窗口大小改變時,哪個函數(shù)
又將被調(diào)用。
相似的,我們必須做同樣的事來處理按鍵消息。我們必須使用GLUT通知窗口系統(tǒng),當(dāng)某
個鍵被按下時,哪個函數(shù)將完成所要求的操作。我們同樣是調(diào)用一個函數(shù)注冊相關(guān)的回調(diào)函
數(shù)。
當(dāng)你按下一個鍵后,GLUT提供了兩個函數(shù)為這個鍵盤消息注冊回調(diào)。第一個是
glutKeyboardFunc。這個函數(shù)是告訴窗口系統(tǒng),哪一個函數(shù)將會被調(diào)用來處理普通按鍵消息。
普通鍵是指字母,數(shù)字,和其他可以用ASCII代碼表示的鍵。函數(shù)原型如下:
void glutKeyboardFunc(void(*func)(unsigned char key,int x,int y));
參數(shù):
func: 處理普通按鍵消息的函數(shù)的名稱。如果傳遞NULL,則表示GLUT忽略普通按鍵消
息。
這個作為glutKeyboardFunc函數(shù)參數(shù)的函數(shù)需要有三個形參。第一個表示按下的鍵的
ASCII碼,其余兩個提供了,當(dāng)鍵按下時當(dāng)前的鼠標(biāo)位置。鼠標(biāo)位置是相對于當(dāng)前客戶窗口
的左上角而言的。
一個經(jīng)常的用法是當(dāng)按下ESCAPE 鍵時退出應(yīng)用程序。注意,我們提到過,glutMainLoop
函數(shù)產(chǎn)生的是一個永無止境的循環(huán)。唯一的跳出循環(huán)的方法就是調(diào)用系統(tǒng)exit函數(shù)。這就是
我們函數(shù)要做的,當(dāng)按下ESCAPE鍵調(diào)用exit函數(shù)終止應(yīng)用程序(同時要記住在源代碼包含
頭文件stdlib.h)。下面就是這個函數(shù)的代碼:
void processNormalKeys(unsigned char key,int x,int y)
{
if(key==27)
Exit(0);
}
下面讓我們控制特殊鍵的按鍵消息。GLUT提供函數(shù)glutSpecialFunc以便當(dāng)有特殊鍵按下
的消息時,你能注冊你的函數(shù)。函數(shù)原型如下:
void glutSpecialFunc(void (*func)(int key,int x,int y));
參數(shù):
func: 處理特殊鍵按下消息的函數(shù)的名稱。傳遞NULL則表示GLUT忽略特殊鍵消息。
下面我們寫一個函數(shù),當(dāng)一些特殊鍵按下的時候,改變我們的三角形的顏色。這個函數(shù)使
在按下F1鍵時三角形為紅色,按下F2鍵時為綠色,按下F3鍵時為藍色。
void processSpecialKeys(int key, int x, int y) {
switch(key) {
case GLUT_KEY_F1 :
red = 1.0;
green = 0.0;
blue = 0.0; break;
case GLUT_KEY_F2 :
red = 0.0;
green = 1.0;
blue = 0.0; break;
case GLUT_KEY_F3 :
red = 0.0;
green = 0.0;
blue = 1.0; break;
}
}
上面的GLUT_KEY_*在glut.h里已經(jīng)被預(yù)定義為常量。這組常量如下:
GLUT_KEY_F1 F1 function key
GLUT_KEY_F2 F2 function key
GLUT_KEY_F3 F3 function key
GLUT_KEY_F4 F4 function key
GLUT_KEY_F5 F5 function key
GLUT_KEY_F6 F6 function key
GLUT_KEY_F7 F7 function key
GLUT_KEY_F8 F8 function key
GLUT_KEY_F9 F9 function key
GLUT_KEY_F10 F10 function key
GLUT_KEY_F11 F11 function key
GLUT_KEY_F12 F12 function key
GLUT_KEY_LEFT Left function key
GLUT_KEY_RIGHT Up function key
GLUT_KEY_UP Right function key
GLUT_KEY_DOWN Down function key
GLUT_KEY_PAGE_UP Page Up function key
GLUT_KEY_PAGE_DOWN Page Down function key
GLUT_KEY_HOME Home function key
GLUT_KEY_END End function key
GLUT_KEY_INSERT Insert function key
為了讓上面processSpecialKeys函數(shù)能過編譯通過,我們還必須定義,red,green,blue三
個變量。此外為了得到我們想要的結(jié)果,我們還必須修改renderScene函數(shù)。
...
// 所有的變量被初始化為1,表明三角形最開始是白色的。
float red=1.0, blue=1.0, green=1.0;
void renderScene(void) {
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle,0.0,1.0,0.0);
// glColor3f設(shè)置繪制三角形的顏色。
glColor3f(red,green,blue);
glBegin(GL_TRIANGLES);
glVertex3f(-0.5,-0.5,0.0);
glVertex3f(0.5,0.0,0.0);
glVertex3f(0.0,0.5,0.0);
glEnd();
glPopMatrix();
angle++;
glutSwapBuffers();
}
。下面我們就該告訴GLUT,我們剛剛定義的函數(shù)用來處理,按鍵消息。也就是該調(diào)用
glutKeyboardFunc和glutSpecialFunc函數(shù)。我們在main函數(shù)里調(diào)用它們。下面就是最新的
main函數(shù)。
VC工程可以在這里下載(glut3.zip)
CTRL,ALT和SHIFT
一些時候我們想知道要是一個組合鍵(modifier key)也就是CTRL,ALT或者SHIFT被按
下該如何處理。GLUT提供了一個函數(shù)來檢測時候有組合鍵被按下。這個函數(shù)僅僅只能在處
理按鍵消息或者鼠標(biāo)消息函數(shù)里被調(diào)用。函數(shù)原型如下:
int glutGetModifiers(void);
這個函數(shù)的返回值是三個glut.h里預(yù)定義的常量里的一個,或它們的或組合。這三個常量
是:
1:GLUT_ACTIVE_SHIFT: 返回它,當(dāng)按下SHIFT鍵或以按下CAPS LOCK,注意兩者同
時按下時,不會返回這個值。
2:GLUT_ACTIVE_CTRL: 返回它,當(dāng)按下CTRL鍵。
3:GLUT_ACTIVE_ATL:返回它,當(dāng)按下ATL鍵。
注意,窗口系統(tǒng)可能會截取一些組合鍵(modifiers),這是就沒有回調(diào)發(fā)生。現(xiàn)在讓我們
擴充processNormalKeys,處理組合鍵。按下r鍵時red變量被設(shè)置為0.0,當(dāng)按下ATL+r時
red被設(shè)置為1.0。代碼如下:
void processNormalKeys(unsigned char key, int x, int y) {
if (key == 27)
exit(0);
else if (key=='r') {
int mod = glutGetModifiers();
if (mod == GLUT_ACTIVE_ALT)
red = 0.0;
else
red = 1.0;
}
}
注意如果我們按下R 鍵,將不會有什么發(fā)生,因為R與r鍵的ASCII碼不同。即這是兩個
不同的鍵。最后就是如何檢測按鍵CTRL+ALT+F1?。這種情況下,我們必須同時 檢測兩個
組合鍵,為了完成操作我們需要使用或操作符。下面的代碼段,使你按下CTRL+ALT+F1時
顏色改變?yōu)榧t色。
void processSpecialKeys(int key, int x, int y) {
int mod;
switch(key) {
case GLUT_KEY_F1 :
mod = glutGetModifiers();
if (mod == (GLUT_ACTIVE_CTRL|GLUT_ACTIVE_ALT)) {
red = 1.0; green = 0.0; blue = 0.0;
}
break;
case GLUT_KEY_F2 :
red = 0.0;
green = 1.0;
blue = 0.0; break;
case GLUT_KEY_F3 :
red = 0.0;
green = 0.0;
blue = 1.0; break;
}
}
總結(jié)
以上是生活随笔為你收集整理的【转】GLUT教程(五) GLUT键盘控制 收藏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何往虚拟机内传文件的3种方法
- 下一篇: Linux:减号(-)详解