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