當(dāng)前位置:
首頁 >
GLUT键盘控制(glutKeyboardFunc和glutSpecialFunc)
發(fā)布時(shí)間:2025/6/17
41
豆豆
生活随笔
收集整理的這篇文章主要介紹了
GLUT键盘控制(glutKeyboardFunc和glutSpecialFunc)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
GLUT教程 ???????????? 鍵盤輸入 GLUT允許我們編寫程序,在里面加入鍵盤輸入控制,包括了普通鍵,和其他特殊鍵(如F1,UP)。在這一章里我們將學(xué)習(xí)如何去檢測哪個(gè)鍵被按下,可以從GLUT里得到些什么信息,和如何處理鍵盤輸入。 到現(xiàn)在,你應(yīng)該注意到了,只要你想控制一個(gè)事件的處理,你就必須提前告訴GLUT,哪個(gè)函數(shù)將完成這個(gè)任務(wù)。到現(xiàn)在為止,我們已經(jīng)使用GLUT告訴窗口系統(tǒng),當(dāng)窗口重繪時(shí)我們想調(diào)用哪個(gè)渲染函數(shù),但系統(tǒng)空閑時(shí),哪個(gè)函數(shù)被調(diào)用。和當(dāng)窗口大小改變時(shí),哪個(gè)函數(shù)又將被調(diào)用。 相似的,我們必須做同樣的事來處理按鍵消息。我們必須使用GLUT通知窗口系統(tǒng),當(dāng)某個(gè)鍵被按下時(shí),哪個(gè)函數(shù)將完成所要求的操作。我們同樣是調(diào)用一個(gè)函數(shù)注冊相關(guān)的回調(diào)函數(shù)。 當(dāng)你按下一個(gè)鍵后,GLUT提供了兩個(gè)函數(shù)為這個(gè)鍵盤消息注冊回調(diào)。第一個(gè)是glutKeyboardFunc。這個(gè)函數(shù)是告訴窗口系統(tǒng),哪一個(gè)函數(shù)將會(huì)被調(diào)用來處理普通按鍵消息。 普通鍵是指字母,數(shù)字,和其他可以用ASCII代碼表示的鍵。函數(shù)原型如下: void glutKeyboardFunc(void(*func)(unsigned char key,int x,int y)); 參數(shù): func: 處理普通按鍵消息的函數(shù)的名稱。如果傳遞NULL,則表示GLUT忽略普通按鍵消息。 這個(gè)作為glutKeyboardFunc函數(shù)參數(shù)的函數(shù)需要有三個(gè)形參。第一個(gè)表示按下的鍵的ASCII碼,其余兩個(gè)提供了,當(dāng)鍵按下時(shí)當(dāng)前的鼠標(biāo)位置。鼠標(biāo)位置是相對(duì)于當(dāng)前客戶窗口的左上角而言的。 一個(gè)經(jīng)常的用法是當(dāng)按下ESCAPE鍵時(shí)退出應(yīng)用程序。注意,我們提到過,glutMainLoop函數(shù)產(chǎn)生的是一個(gè)永無止境的循環(huán)。唯一的跳出循環(huán)的方法就是調(diào)用系統(tǒng)exit函數(shù)。這就是我們函數(shù)要做的,當(dāng)按下ESCAPE鍵調(diào)用exit函數(shù)終止應(yīng)用程序(同時(shí)要記住在源代碼包含頭文件stdlib.h)。下面就是這個(gè)函數(shù)的代碼: void processNormalKeys(unsigned char key,int x,int y) { ????? if(key==27) ??????????? Exit(0); } 下面讓我們控制特殊鍵的按鍵消息。GLUT提供函數(shù)glutSpecialFunc以便當(dāng)有特殊鍵按下的消息時(shí),你能注冊你的函數(shù)。函數(shù)原型如下: void glutSpecialFunc(void (*func)(int key,int x,int y)); 參數(shù): func: 處理特殊鍵按下消息的函數(shù)的名稱。傳遞NULL則表示GLUT忽略特殊鍵消息。 下面我們寫一個(gè)函數(shù),當(dāng)一些特殊鍵按下的時(shí)候,改變我們的三角形的顏色。這個(gè)函數(shù)使在按下F1鍵時(shí)三角形為紅色,按下F2鍵時(shí)為綠色,按下F3鍵時(shí)為藍(lán)色。 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三個(gè)變量。此外為了得到我們想要的結(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 ? 一些時(shí)候我們想知道要是一個(gè)組合鍵(modifier key)也就是CTRL,ALT或者SHIFT被按下該如何處理。GLUT提供了一個(gè)函數(shù)來檢測時(shí)候有組合鍵被按下。這個(gè)函數(shù)僅僅只能在處理按鍵消息或者鼠標(biāo)消息函數(shù)里被調(diào)用。函數(shù)原型如下: int glutGetModifiers(void); 這個(gè)函數(shù)的返回值是三個(gè)glut.h里預(yù)定義的常量里的一個(gè),或它們的或組合。這三個(gè)常量是: 1:GLUT_ACTIVE_SHIFT: 返回它,當(dāng)按下SHIFT鍵或以按下CAPS LOCK,注意兩者同時(shí)按下時(shí),不會(huì)返回這個(gè)值。 2:GLUT_ACTIVE_CTRL: 返回它,當(dāng)按下CTRL鍵。 3:GLUT_ACTIVE_ATL:返回它,當(dāng)按下ATL鍵。 注意,窗口系統(tǒng)可能會(huì)截取一些組合鍵(modifiers),這是就沒有回調(diào)發(fā)生。現(xiàn)在讓我們擴(kuò)充processNormalKeys,處理組合鍵。按下r鍵時(shí)red變量被設(shè)置為0.0,當(dāng)按下ATL+r時(shí)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鍵,將不會(huì)有什么發(fā)生,因?yàn)镽與r鍵的ASCII碼不同。即這是兩個(gè)不同的鍵。最后就是如何檢測按鍵CTRL+ALT+F1?。這種情況下,我們必須同時(shí)檢測兩個(gè)組合鍵,為了完成操作我們需要使用或操作符。下面的代碼段,使你按下CTRL+ALT+F1時(shí)顏色改變?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键盘控制(glutKeyboardFunc和glutSpecialFunc)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编实验4.1文件代号下的文件管理中为什
- 下一篇: mspx