glut教程 鍵盤輸入

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);
    }

②glutSpecialFunc特殊按鍵的按鍵消息。
    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裏已經被預定義爲常量。這組常量如下:


二 組合鍵的處理:
    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;
            }
   }

 

 


三         高級鍵盤控制(keyboard features)

4個新的處理鍵盤輸入的函數。

①去禁止keyboard repeat。函數原型如下:
  int glutSetKeyRepeat(int repeatMode);
   參數:
   repeatMode:開啓,禁用,或恢復auto repeat模式,下面是它可能的取值。
   RepeatMode的可能取值如下:
   GLUT_KEY_REPEAT_OFF:關閉auto repeat模式。
   GLUT_KEY_REPEAT_ON:開啓auto repeat模式。
   GLUT_KEY_REPEAT_DEFAULT:把auto repeat模式恢復到默認狀態。

   注意這個函數,作用範圍是全局性的。也就是,它會影響所有窗口的repeat模式。不僅僅是我們應用程序這一個。
   因此注意當使用這個函數關閉auto repeat模式後,有必要在程序結束時將auto repeat模式重設到默認模式。

   GLUT提供我們另外一個簡單的函數,來禁用keyboard repeat,這個讓我們安全的忽視keyboard repeat,而不會影響其他程序。函數原型如下:
②Int glutIgnoreKeyRepeat(int repeatMode);
   參數:
   RepeatMode:傳遞0,開啓auto repeat,非0則禁用auto repeat。
   在一些情況下,當key repeat發生時,我們將不接受函數回調。
  
③然而如果你想在一個key被按下後,執行一個動作,你就需要知道這個key什麼時候鬆開。GLUT提供了兩個函數注

   冊相關的回調函數。
  Void glutKeyboardUpFunc(void (*func)(unsigned char key,int x,int y));
   Void glutSpecialUpFunc(void (*func)(int key,int x,int y));
   參數:
   Func:回調函數的函數名。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章