팝업메뉴는 기능의 목록을 문자열 형태로 나타낼 수 있으니, 사용법을 외우지 않아도 쉽게 이해할 수 있다는 장점이 있다.
이미 예제를 통해 만들어본 적이 있다.
int glutCreateMenu(void (*func)(int value));
인수로 메뉴항목을 호출했을 때 호출될 콜백함수를 지정한다.
콜백함수는 선택될 메뉴 항목의 ID를 인수로 전달받는다.
void glutSetMenu(int menu);
int glutGetMenu(void);
새로 생성된 메뉴는 자동으로 현재 메뉴가 되므로 굳이 glutSetMenu를 호출하지 않아도 상관없다. 둘 이상의 메뉴를 생성해놓고 번갈아가면서 사용하고 싶다면 glutSetMenu가 필요하다.
void glutDestroyMenu(int menu);
메뉴를 삭제한다.
void glutAddMenuEntry(char *name, int value);
void glutAddSubMenu(char *name, int value);
메뉴항목 추가와 서브메뉴 항목을 추가한다.
void glutAttachMenu(int button);
void glutDetachMenu(int button);
메뉴를 마우스 버튼에 부착하거나 뗀다, 어떤 버튼을 누르냐에 따라 메뉴가 호출되는지를 정한다. 대체로 오른쪽 클릭이다. (GLUT_RIGHT_BUTTON)
void glutChangeToMenuEntry(int entry, char *name, int value);
메뉴항목의 값을 실행중에 변경한다.
순서값으로 변경대상을 지정하고, 새로운 캡션, ID를 지정한다. 순서값은 위쪽부터 1이다.
ID는 잘 안바꾸고, 캡션을 바꾸는 경우가 종종있다.
#include <gl/glut.h>
void DoDisplay();
void DoMenu(int value);
int main()
{
glutCreateWindow("OpenGL");
// 서브 메뉴 미리 준비
GLint SubMenu = glutCreateMenu(DoMenu);
glutAddMenuEntry("Red",4);
glutAddMenuEntry("Green",5);
glutAddMenuEntry("Blue",6);
// 메인 메뉴 생성
glutCreateMenu(DoMenu);
glutAddMenuEntry("White",1);
glutAddMenuEntry("Black",2);
glutAddMenuEntry("Gray",3);
// 서브 메뉴를 메인 메뉴에 붙인다.
glutAddSubMenu("Triangle Color",SubMenu);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glutDisplayFunc(DoDisplay);
glColor3f(1.0, 0.0, 0.0);
glutMainLoop();
return 0;
}
void DoMenu(int value) // 순서대로 1,2,3 메인팝업, 4,5,6 서브팝업
{
switch(value) {
case 1:
glClearColor(1.0, 1.0, 1.0, 1.0);
break;
case 2:
glClearColor(0.0, 0.0, 0.0, 1.0);
break;
case 3:
glClearColor(0.5, 0.5, 0.5, 1.0);
break;
case 4:
glColor3f(1.0, 0.0, 0.0);
break;
case 5:
glColor3f(0.0, 1.0, 0.0);
break;
case 6:
glColor3f(0.0, 0.0, 1.0);
break;
}
glutPostRedisplay();
}
void DoDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex2f(0.0, 0.5);
glVertex2f(-0.5, -0.5);
glVertex2f(0.5, -0.5);
glEnd();
glFlush();
}
메인팝업메뉴와 서브팝업메뉴의 작동방법을 잘 봐두면 되겠다.
이상!
'Graphics > OpenGL' 카테고리의 다른 글
OpenGL 기초 - GLUT : Win32 예제 (0) | 2014.05.27 |
---|---|
OpenGL 기초 - GLUT : 애니메이션 (0) | 2014.05.27 |
OpenGL 기초 - GLUT : 입력처리 (0) | 2014.05.27 |
OpenGL 기초 - GLUT (0) | 2014.05.19 |
OpenGL 기초 - 안티앨리어싱 (0) | 2014.05.17 |