메뉴항목을 비활성으로 바꿔야할 때가 있는데 GLUT 를 사용하면 메뉴항목을 쉽게 바꾸거나 삭제할 수 있습니다. 메뉴항목을 바꾸기 위해서 다음의 함수를 사용합니다.
voidglutChangeToMenuEntry(int entry,char*name,int value); 인자 설명:entry - 메뉴항목의 인덱스입니다. 반드시 1 부터 전메뉴항목의 개수사이여야합니다.name - 메뉴항목의 새로운 이름입니다.value - 메뉴항목이 선택되었을 때 콜백함수로 반환되는 값입니다.
voidglutChangeToSubMenu(int entry,char*name,int menu); 인자 설명:entry - 메뉴항목의 인덱스입니다. 반드시 1 부터 전메뉴항목의 개수사이여야합니다.name - 메뉴항목의 새로운 이름입니다.menu - 메뉴의 인덱스입니다.
주의: 이 함수는 마이크로소프트 윈도우즈에서 사용하기에 약간 문제가 있습니다. 필자 생각에는 이식성 때문인 것 같습니다. 서브메뉴를 연달아 두번바꾸면 첫번째변환만 실행되고 나머지는 실행되지 않습니다.
메뉴항목을 지우기 위해서는 다음 함수를 사용하면 됩니다.
voidglutRemoveMenuItem(int entry); 인자 설명:entry - 메뉴항목의 인덱스입니다. 반드시 1 부터 전메뉴항목의 개수사이여야합니다.
마지막으로 메뉴항목의 개수는 아무때나 알 수 있습니다. glutGet 함수를 사용해서 현재 메뉴에 질의하면 됩니다. 다음 예제는 메뉴를 수정하는 것입니다.:
voidprocessMenuEvents(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; }}voidprocessKeys(unsignedchar 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);}voidcreateGLUTMenus(){ menu =glutCreateMenu(processMenuEvents);glutAddMenuEntry("Red",RED);glutAddMenuEntry("Green",GREEN);glutAddMenuEntry("Blue",BLUE);glutAddMenuEntry("White",WHITE);glutAttachMenu(GLUT_RIGHT_BUTTON);}
메뉴의 콜백함수에서 메뉴를 수정한 것이 아니라 키보드의 콜백함수에서 메뉴를 수정했습니다. 이 이유는 메뉴를 사용중일 때는 메뉴를 수정할 수 없기 때문입니다. 콜백함수가 끝나기 전까지는 메뉴가 사용되고 있는 것이기 때문에 메뉴의 구조를 메뉴의 콜백함수내에서 바꿀 수 없는 것입니다. 시험해보고 싶다면 Visual C 프로젝트 파일( glut81.zip ) 을 받아서 실행해보세요.
위에서도 말했지만, 메뉴가 사용중일 때에는 메뉴항목을 수정할 수 없습니다. 메뉴가 사용중이 아닐 때에만 메뉴를 수정할 수 있습니다. GLUT 에는 메뉴가 나타날 때와 사라질 때 호출되는 함수를 등록해주는 콜백함수가 있습니다. 이 함수는 glutMenuStatusFunc 로 다음은 이 함수의 설명입니다.