[訳]GLUTチュートリアル-メニューの変更

11458 ワード

Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Modifying Menus
 
必ずメニューを修正する必要がある状況が現れます.GLUTはメニュー項目の変更と削除を実行します.メニュー項目の関数プロトタイプを変更するには、次のようにします.
 
void glutChangeToMenuEntry(int entry, char *name, int value);
entry-メニュー・アイテムのインデックス値.1とメニュー・アイテムの合計数を表します.
name-新しいメニュー項目の名前
value-メニュー項目が選択されたときにコールバック関数に渡される値
 
サブメニューを交換するには、次の関数を使用します.
 
void glutChangeToSubMenu(int entry, char *name, int menu);
entry-メニュー・アイテムのインデックス値.1とメニュー・アイテムの合計数を表します.
name-新しいメニュー項目の名前
menu-交換用メニューのインデックス値
 
次の関数は、メニュー項目を削除するために使用する.
 
void glutRemoveMenuItem(int entry);
entry-メニュー項目のインデックス値は、1とメニュー項目の総数の間にある.
 
 
最後に、glutGet関数を使用して現在のメニュー項目の数をいつでも問い合わせることができます.
次の例では、メニューを変更する方法を示します.
void processMenuEvents(int option) {



    red = 0.0;

    green = 0.0;

    blue = 0.0;



    switch (option) {

        case RED :

            red = 1.0; break;

        case GREEN :

            green = 1.0; break;

        case BLUE :

            blue = 1.0; break;

        case WHITE :

            red = 1.0;

            green = 1.0;

            blue = 1.0; break;

    }

}



void processKeys(unsigned char c, int x, int y) {



    int num = glutGet(GLUT_MENU_NUM_ITEMS);

    switch (c) {

        case 'a':

            glutChangeToMenuEntry(1,"Blue",BLUE);

            glutChangeToMenuEntry(3,"Red",RED);

            break;

        case 'b':

            glutChangeToMenuEntry(3,"Blue",BLUE);

            glutChangeToMenuEntry(1,"Red",RED);

            break;

        case 'c':

            if (num > 3)

                glutRemoveMenuItem(num);

            break;

        case 'd': if (num == 3)

                glutAddMenuEntry("White",WHITE);

            break;

    }

    glutSetMenu(menu);

}



void createGLUTMenus() {



    menu = glutCreateMenu(processMenuEvents);

    glutAddMenuEntry("Red",RED);

    glutAddMenuEntry("Green",GREEN);

    glutAddMenuEntry("Blue",BLUE);

    glutAddMenuEntry("White",WHITE);

    glutAttachMenu(GLUT_RIGHT_BUTTON);

}

 
メニューコールバック関数とは逆の形式でキーボードコールバック関数でメニューを変更したことに気づいた.メニューが使用されている間は変更できませんから.メニューはコールバック関数が完了する前に占有されるので、コールバック関数の内部でメニューの構造を変えることはできません.
を前提として、メニューが占有されているときは、変更することはできません.念のため、メニューが占有されているかどうかを確認する必要があります.GLUTでは、メニューがポップアップ状態にあるかどうかを検出するためにコールバック関数を登録することができる.プロトタイプは次のとおりです.
 
void glutMenuStatusFunc(void (*func)(int status, int x, int y);
func-コールバック関数の名前
 
 
この関数はmain関数で呼び出されるので、main関数に追加します.
glutMenuStatusFunc関数の3つのパラメータの意味は次のとおりです.
status - GLUT_MENU_IN_USEまたはGLUT_MENU_NOT_IN_USE状態の一つ
x-フォームクライアント領域に対するメニュー左座標
y-フォームクライアント領域に対するメニュー上部座標
 
以下の例では、メニューが占有するときにタグを設定して識別する例を示す.
void processMenuStatus(int status, int x, int y) {



    if (status == GLUT_MENU_IN_USE)

        flag = 1;

    else

        flag = 0;

}

 
キーボードイベントを処理するには、このタグを使用します.
 
void processKeys(unsigned char c, int x, int y) {



    if (!flag) {

        int num = glutGet(GLUT_MENU_NUM_ITEMS);

        switch (c) {

            case 'a':

                glutChangeToMenuEntry(1,"Blue",BLUE);

                glutChangeToMenuEntry(3,"Red",RED);

                break;

            case 'b':

                glutChangeToMenuEntry(3,"Blue",BLUE);

                glutChangeToMenuEntry(1,"Red",RED);

                break;

            case 'c':

                if (num > 3)

                    glutRemoveMenuItem(num);

                break;

            case 'd': if (num == 3)

                    glutAddMenuEntry("White",WHITE);

                break;

        }

    }

}