資源描述:
《GLUT 按鍵處理》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在行業(yè)資料-天天文庫。
1、【轉】【OpenGL】GLUT按鍵處理2010-07-1615:19轉載自hh20040410最終編輯hh20040410GLUT教程????????????鍵盤輸入???????????GLUT允許我們編寫程序,在里面加入鍵盤輸入控制,包括了普通鍵,和其他特殊鍵(如F1,UP)。在這一章里我們將學習如何去檢測哪個鍵被按下,可以從GLUT里得到些什么信息,和如何處理鍵盤輸入。???????????到現(xiàn)在,你應該注意到了,只要你想控制一個事件的處理,你就必須提前告訴GLUT,哪個函數(shù)將完成這個任務。到現(xiàn)在為止,
2、我們已經(jīng)使用GLUT告訴窗口系統(tǒng),當窗口重繪時我們想調(diào)用哪個渲染函數(shù),當系統(tǒng)空閑時,哪個函數(shù)被調(diào)用。當窗口大小改變時,哪個函數(shù)又將被調(diào)用。相似的,我們必須做同樣的事來處理按鍵消息。我們必須使用GLUT通知窗口系統(tǒng),當某個鍵被按下時,哪個函數(shù)將完成所要求的操作。我們同樣是調(diào)用一個函數(shù)注冊相關的回調(diào)函數(shù)。一函數(shù)介紹:當你按下一個鍵后,GLUT提供了兩個函數(shù)為這個鍵盤消息注冊回調(diào)。①glutKeyboardFunc普通按鍵的按鍵消息。???這個函數(shù)是告訴窗口系統(tǒng),哪一個函數(shù)將會被調(diào)用來處理普通按鍵消息。???普通鍵
3、是指字母,數(shù)字,和其他可以用ASCII代碼表示的鍵。函數(shù)原型如下:???voidglutKeyboardFunc(void(*func)(unsignedcharkey,intx,inty));???參數(shù):???func:處理普通按鍵消息的函數(shù)的名稱。如果傳遞NULL,則表示GLUT忽略普通按鍵消息。???這個作為glutKeyboardFunc函數(shù)參數(shù)的函數(shù)需要有三個形參。第一個表示按下的鍵的ASCII碼,???其余兩個提供了,當鍵按下時當前的鼠標位置。鼠標位置是相對于當前客戶窗口的左上角而言的。???一個
4、經(jīng)常的用法是當按下ESCAPE鍵時退出應用程序。注意,我們提到過,glutMainLoop函數(shù)產(chǎn)生的???是一個永無止境的循環(huán)。唯一的跳出循環(huán)的方法就是調(diào)用系統(tǒng)exit函數(shù)。這就是我們函數(shù)要做的,當???按下ESCAPE鍵調(diào)用exit函數(shù)終止應用程序(同時要記住在源代碼包含頭文件stdlib.h)。???下面就是這個函數(shù)的代碼:???voidprocessNormalKeys(unsignedcharkey,intx,inty)???{????????if(key==27)??????????????Exit
5、(0);???}②glutSpecialFunc特殊按鍵的按鍵消息。???GLUT提供函數(shù)glutSpecialFunc以便當有特殊鍵按下的消息時,你能注冊你的函數(shù)。???函數(shù)原型如下:???voidglutSpecialFunc(void(*func)(intkey,intx,inty));???參數(shù):???func:處理特殊鍵按下消息的函數(shù)的名稱。傳遞NULL則表示GLUT忽略特殊鍵消息。???下面我們寫一個函數(shù),當一些特殊鍵按下的時候,改變我們的三角形的顏色。???這個函數(shù)使在按下F1鍵時三角形為紅色,
6、按下F2鍵時為綠色,按下F3鍵時為藍色。???voidprocessSpecialKeys(intkey,intx,inty){???????????switch(key){???????????????????caseGLUT_KEY_F1:???????????????????????red=1.0;????????????????????????????green=0.0;??????????????????????????????????????blue=0.0;break;?????????case
7、GLUT_KEY_F2:??????????????????????????????????????red=0.0;??????????????????????????????????????green=1.0;?????????????????????????????????????blue=0.0;break;????????????????????caseGLUT_KEY_F3:??????????????????????????????????????red=0.0;?????????????????
8、?????????????????????green=0.0;?????????????????????????????????????blue=1.0;break;???????????}???}??上面的GLUT_KEY_*在glut.h里已經(jīng)被預定義為常量。這組常量如下:二組合鍵的處理:???CTRL,ALT和SHIFT??一些時候我們想知道要是一個組合鍵(modifierkey)也就是CTR