2012-06-02 3 views
-1

간단한 OpenGL 프로그램에 메뉴 시스템을 추가하고 싶습니다. 나는 전에 GLUT를 사용 했었지만, 1998 년에 돌아왔다. 그래서 여기에서 언급했을 때 GLUT을 사용하지 말 것을 권고했다. 따라서 GLUT와 같은 플랫폼 독립적 인 GLUT를 사용할 수있는 메뉴 라이브러리를 알고 싶다. GLUT가 여전히 많은 예제에서 사용되는 것을 보라. 내 프로그램은 GLUT를 사용하지 않지만 메뉴 시스템을 추가하여보다 완벽한 프로그램을 만드는 방법을 배우고 싶습니다.GLUT 대신 OpenGL을 사용하여 메뉴를 만들 때

#include <windows.h> 
#include <gl/gl.h> 

LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM); 
void EnableOpenGL(HWND hwnd, HDC*, HGLRC*); 
void DisableOpenGL(HWND, HDC, HGLRC); 


int WINAPI WinMain(HINSTANCE hInstance, 
        HINSTANCE hPrevInstance, 
        LPSTR lpCmdLine, 
        int nCmdShow) 
{ 
    WNDCLASSEX wcex; 
    HWND hwnd; 
    HDC hDC; 
    HGLRC hRC; 
    MSG msg; 
    BOOL bQuit = FALSE; 
    float theta = 0.0f; 

    /* register window class */ 
    wcex.cbSize = sizeof(WNDCLASSEX); 
    wcex.style = CS_OWNDC; 
    wcex.lpfnWndProc = WindowProc; 
    wcex.cbClsExtra = 0; 
    wcex.cbWndExtra = 0; 
    wcex.hInstance = hInstance; 
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); 
    wcex.lpszMenuName = NULL; 
    wcex.lpszClassName = "GLSample"; 
    wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);; 


    if (!RegisterClassEx(&wcex)) 
     return 0; 

    /* create main window */ 
    hwnd = CreateWindowEx(0, 
          "GLSample", 
          "OpenGL Sample", 
          WS_OVERLAPPEDWINDOW, 
          CW_USEDEFAULT, 
          CW_USEDEFAULT, 
          256, 
          256, 
          NULL, 
          NULL, 
          hInstance, 
          NULL); 

    ShowWindow(hwnd, nCmdShow); 

    /* enable OpenGL for the window */ 
    EnableOpenGL(hwnd, &hDC, &hRC); 

    /* program main loop */ 
    while (!bQuit) 
    { 
     /* check for messages */ 
     if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
     { 
      /* handle or dispatch messages */ 
      if (msg.message == WM_QUIT) 
      { 
       bQuit = TRUE; 
      } 
      else 
      { 
       TranslateMessage(&msg); 
       DispatchMessage(&msg); 
      } 
     } 
     else 
     { 
      /* OpenGL animation code goes here */ 

      glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
      glClear(GL_COLOR_BUFFER_BIT); 

      glPushMatrix(); 
      glRotatef(theta, 0.0f, 0.0f, 1.0f); 

      glBegin(GL_TRIANGLES); 

       glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, 1.0f); 
       glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.87f, -0.5f); 
       glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(-0.87f, -0.5f); 

      glEnd(); 

      glPopMatrix(); 

      SwapBuffers(hDC); 

      theta += 1.0f; 
      Sleep (1); 
     } 
    } 

    /* shutdown OpenGL */ 
    DisableOpenGL(hwnd, hDC, hRC); 

    /* destroy the window explicitly */ 
    DestroyWindow(hwnd); 

    return msg.wParam; 
} 

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (uMsg) 
    { 
     case WM_CLOSE: 
      PostQuitMessage(0); 
     break; 

     case WM_DESTROY: 
      return 0; 

     case WM_KEYDOWN: 
     { 
      switch (wParam) 
      { 
       case VK_ESCAPE: 
        PostQuitMessage(0); 
       break; 
      } 
     } 
     break; 

     default: 
      return DefWindowProc(hwnd, uMsg, wParam, lParam); 
    } 

    return 0; 
} 

void EnableOpenGL(HWND hwnd, HDC* hDC, HGLRC* hRC) 
{ 
    PIXELFORMATDESCRIPTOR pfd; 

    int iFormat; 

    /* get the device context (DC) */ 
    *hDC = GetDC(hwnd); 

    /* set the pixel format for the DC */ 
    ZeroMemory(&pfd, sizeof(pfd)); 

    pfd.nSize = sizeof(pfd); 
    pfd.nVersion = 1; 
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | 
        PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; 
    pfd.iPixelType = PFD_TYPE_RGBA; 
    pfd.cColorBits = 24; 
    pfd.cDepthBits = 16; 
    pfd.iLayerType = PFD_MAIN_PLANE; 

    iFormat = ChoosePixelFormat(*hDC, &pfd); 

    SetPixelFormat(*hDC, iFormat, &pfd); 

    /* create and enable the render context (RC) */ 
    *hRC = wglCreateContext(*hDC); 

    wglMakeCurrent(*hDC, *hRC); 
} 

void DisableOpenGL (HWND hwnd, HDC hDC, HGLRC hRC) 
{ 
    wglMakeCurrent(NULL, NULL); 
    wglDeleteContext(hRC); 
    ReleaseDC(hwnd, hDC); 
} 

여기 OpenGL - GLUT - Displaying different pop-up menus 이 질문에 대해 예를 들어이 GLUT를 사용하지만, 정말 어디서부터 시작하는 말을하지 않도록하지 무엇을 대신 사용하지 않는 말했다. GLUT 대신에 무엇을 사용해야하는지 말해 줄 수 있습니까?

+1

당신이 windows.h를 사용하고 있기 때문에 플랫폼에 어떻게 영향을 미치는지 보지 못했습니다. – Pubby

+1

나는 [GLUI] (http://www.cs.unc.edu/~rademach/glui/) 과 [CEGUI] (http://www.cegui.org.uk)를 최근에 사용했습니다. Glgooey는 유망 해 보이지만 5 년 이상 죽은 것 같습니다. OpenGL 비트가 아닌 위젯이 필요하다면 Qt는 항상 좋은 방법입니다. 몇 가지 간단한 조정 및 옵션 변경에 대한 – Flexo

+0

... 사용하기 매우 쉬운 AntTweakBar (http://www.antisphere.com/Wiki/tools:anttweakbar)를 사용합니다! – fen

답변

2

플랫폼 독립적 인 OpenGL 개발의 경우 Qt 또는 wxWidgets와 같은 플랫폼 간 GUI 도구 키트를 사용하십시오.

이 중 나는 Qt's OpenGL module과 같은 개인적인 경험이 있습니다. OpenGL 렌더링 컨텍스트를 설정하고 마우스 및 키보드와 상호 작용하는 방법에 대한 많은 예제가 제공됩니다. 장면에서 마우스 오른쪽 버튼을 클릭하면 메뉴가 팝업됩니다. Qt는 벡터와 행렬 조작을위한 유틸리티 클래스도 제공합니다.

관련 문제