팝업메뉴의 소개

GLUT 는 팝업메뉴를 쉽게 만들 수 있도록 지원합니다. 윈도우즈 시스템에서 쉽게 볼 수 있는 팝업메뉴의 기능이 부족할 수 지만, GLUT 에서 팝업메뉴는 아주 중요한 역할을 합니다. 어플리케이션에 메뉴를 추가하는 것은 상호작용과 옵션을 선택하는데 키보드보다 더 쉬운 방법을 제공합니다. 왜냐구요? 기능에 해당되는 키를 외울 필요가 없기 때문이죠!

메뉴를 만들기 위해서 제일 처음에 해줘야할 것은 GLUT 의 glutCreateMenu 함수를 호출하는 것입니다. 다음은 이 함수의 설명입니다.:

int glutCreateMenu(void (*func)(int value)); 

인자 설명:
func - 만든 메뉴의 이벤트를 처리할 함수의 이름입니다.

이 함수가 반환하는 값은 메뉴를 구별할 때는 쓰는 아이디(identifier)입니다.

어플리케이션에 우리가 원하는만큼 메뉴를 만들 수 있고 각 메뉴를 위한 콜백함수가 정해져 있습니다. 하지만 하나의 콜백함수를 모든 메뉴의 콜백함수로 사용할 수도 있습니다. 다음에 해야할 것은 메뉴에 항목을 추가하는 것인데 GLUT 의 glutAddMenuEntry 함수를 사용합니다. 다음은 이 함수의 설명입니다.

void glutAddMenuEntry(char *name, int value); 

인자 설명:
name - 메뉴에 나타나는 항목의 이름입니다.
value - 항목이 선택되었을 때 메뉴의 콜백함수에 전달되는 값입니다.

이 함수는 앞서 추가된 항목 바로 뒤에 새로운 항목을 추가합니다. 즉 메뉴의 제일 아래에 추가하는 것입니다. GLUT 에는 메뉴의 중간에 항목을 추가하는 함수는 없습니다. 왜냐하면 GLUT 가 순수 윈도우즈 API 의 기능을 대체하기 위해서 만들어진 것이 아니니까요. GLUT 는 데모를 쉽게 만들기 위해서 개발된 것이기에 데모 개발에 아주 좋은 솔루션입니다.

OK, so now you have a pop-up menu, but there's one last thing we must do: attach the menu to a mouse button, that is we must specify when the pop-up menu will appear. Using GLUT you can cause the menu to appear when a mouse button is pressed. The function to establish this relationship is glutAttachMenu.

위의 함수들을 사용해서 하나의 메뉴를 만들 수 있지만 마지막으로 해줘야할 일이 있습니다. 바로 메뉴를 마우스버튼에 연결하는 것인데 팝업메뉴가 나타날 때를 정하는 것입니다. GLUT 를 사용하면 마우스버튼이 눌렸을 때 메뉴를 나타나게 할 수 있습니다. 메뉴와 마우스버튼을 연결해 주는 함수는 glutAttachMenu 입니다. 아래는 이 함수의 설명입니다.

void glutAttachMenu(int button); 

인자 설명:
button - 메뉴에 연결될 버튼을 나타내는 정수값입니다.

위의 함수에서 button 인자는 다음 세개의 값중에서 하나가 됩니다.:

  • GLUT_LEFT_BUTTON

  • GLUT_MIDDLE_BUTTON

  • GLUT_RIGHT_BUTTON

다음은 위의 모든 함수를 사용하는 예제입니다.

...
#define RED 1
#define GREEN 2
#define BLUE 3
#define WHITE 4
...
void createGLUTMenus()
{
    int menu;
    // 메뉴를 만들고 GLUT 에 processMenuEvents 함수가
    // 메뉴이벤트를 다룰 것이라고 알려줍니다.
    menu = glutCreateMenu(processMenuEvents);

    // 메뉴에 항목을 추가합니다.
    glutAddMenuEntry("Red",RED);
    glutAddMenuEntry("Blue",BLUE);
    glutAddMenuEntry("Green",GREEN);
    glutAddMenuEntry("White",WHITE);

    // 마우스의 오른쪽버튼에 메뉴를 연결합니다.
    glutAttachMenu(GLUT_RIGHT_BUTTON);
}

위에서 사용하는 RED, BLUE, GREEN 그리고 WHITE 는 반드시 정수값으로 정의되어 있어야합니다. 이 때 각 항목은 서로 다른 값으로 정의되어야하며 그렇지 않으면 항목별로 처리를 달리 만들수 없습니다.

Now we'll write the function to process the menu events. As you probably guessed by now, we're going to set the color of the triangle using our menu. Note that our function must be called processMenuEvents, thats the name we provided when we created the menu in the function above. Furthermore, looking at the syntax of glutCreateMenu we know that it will have a parameter representing the selected menu item.

이제 메뉴의 이벤트를 처리하는 함수를 만들어봅시다. 이미 짐작했겠지만 메뉴를 통해서 삼각형의 색깔을 바꿔보겠습니다. 우리가 만들 함수는 위에서 메뉴를 만들 때 정해준 "processMenuEvents" 여야합니다. 그리고 glutCreateMenu 함수를 봐서 알겠지만 이 함수는 선택된 메뉴 항목을 나타내는 아이디값을 인자로 받습니다.

void processMenuEvents(int option)
{
    switch (option) 
    {
        case RED : 
            red = 1.0; 
            green = 0.0; 
            blue = 0.0;
            break;
        case GREEN : 
            red = 0.0; 
            green = 1.0; 
            blue = 0.0;
            break;
        case BLUE : 
            red = 0.0; 
            green = 0.0; 
            blue = 1.0;
            break;
        case WHITE : 
            red = 1.0; 
            green = 1.0; 
            blue = 1.0;
            break;
    }
}

이제 남은 일은 main 함수에 위에서 만들었던 createGLUTMenus 함수를 호출하는 것입니다. 다은은 새로운 main 함수입니다.

void main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(320,320);
    glutCreateWindow("SnowMen");
    glutDisplayFunc(renderScene);
    glutIdleFunc(renderScene);
    glutReshapeFunc(changeSize);

    // 메뉴를 만드는 함수를 호출합니다.
    createGLUTMenus();

    glutMainLoop();
}

Visual C 프로젝트 파일 을 받아서 자세히 살펴보세요 :)

팝업메뉴를 소개한 이번장을 끝내기 전에 두개의 함수를 더 알아봅시다. 처음 함수는 메뉴와 마우스버튼간에 연결을 해지할 때 사용하는 함수입니다. 위에서 우리는 glutAttachMenu 함수를 사용해서 메뉴를 마우스버튼에 연결했었습니다. 때론 이 연결을 끊어야할 때도 있겠죠. 즉 마우스버튼을 눌렀을 때 더이상 메뉴가 표시되지 않게 하는 것입니다. 이 일은 glutDetachMenu 함수를 사용하며 다음은 이 함수의 설명입니다.:

void glutDetachMenu(int button); 

인자설명:
button - 메뉴와 연결을 해지할 버튼입니다.

button 인자는 glutAttachMenu 에서 사용한 값과 같아야합니다. 그래서 위의 예제에서 마우스버튼과의 연결을 해지할려면 다음처럼 해야합니다.

...
glutDetachMenu(GLUT_RIGHT_BUTTON);
...

이제 마지막으로, 메뉴가 사용하는 리소스를 반환하고 싶을 때는 메뉴를 제거하면 됩니다. GLUT 는 glutDestroyMenu 함수를 사용해서 메뉴를 제거합니다. 다음은 이 함수의 설명입니다.:

void glutDestroyMenu(int menuIdentifier); 

인자설명:
menuIdentifier - 제거시킬 메뉴의 아이디값입니다. 이 값은 glutCreateMenu 함수가 반환한 값과 같은 값이어야합니다.

지금까지 GLUT 를 사용해서 메뉴를 만드는 방법에 대해서 알아보았습니다. 다음 장에서는 팝업메뉴의 특성에 대해서 더 자세하게 알아보겠습니다.

Last updated