[訳]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関数を使用して現在のメニュー項目の数をいつでも問い合わせることができます.
次の例では、メニューを変更する方法を示します.
メニューコールバック関数とは逆の形式でキーボードコールバック関数でメニューを変更したことに気づいた.メニューが使用されている間は変更できませんから.メニューはコールバック関数が完了する前に占有されるので、コールバック関数の内部でメニューの構造を変えることはできません.
を前提として、メニューが占有されているときは、変更することはできません.念のため、メニューが占有されているかどうかを確認する必要があります.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-フォームクライアント領域に対するメニュー上部座標
以下の例では、メニューが占有するときにタグを設定して識別する例を示す.
キーボードイベントを処理するには、このタグを使用します.
必ずメニューを修正する必要がある状況が現れます.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;
}
}
}