wglCreateContext () каждый раз возвращает NULL в OpenGL и Visual C ++ - PullRequest
3 голосов
/ 27 февраля 2010

Я новичок в OpenGL.

Я хочу кое-что нарисовать, используя OpenGL в Windows Forms. Если я использую приложение Win32 с WinMain методом, приложение работает. В методе WinMain я заполняю HWND функцией CreateWindow() и задаю параметры WinMain для CreateWindows.

Но я хочу получить дескриптор из Windows, я не могу получить это. Каждый раз wglCreateContext(hdc) возврат NULL там пример, который я беру

public:
  COpenGL(System::Windows::Forms::Form ^ parentForm, GLsizei iWidth, GLsizei iHeight)
  {
   CreateParams^ cp = gcnew CreateParams;

   // Set the position on the form
   cp->X = 0;
   cp->Y = 0;
   cp->Height = iHeight;
   cp->Width = iWidth;

   // Specify the form as the parent.
   cp->Parent = parentForm->Handle;

   // Create as a child of the specified parent and make OpenGL compliant (no clipping)
   cp->Style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;

   // Create the actual window
   this->CreateHandle(cp);

   m_hDC = GetDC((HWND)this->Handle.ToPointer());

   if(m_hDC)
   {
    MySetPixelFormat(m_hDC);
    ReSizeGLScene(iWidth, iHeight);
    InitGL();
   }

   rtri = 0.0f;
   rquad = 0.0f;
  }


GLint MySetPixelFormat(HDC hdc)
  {

   static PIXELFORMATDESCRIPTOR pfd=    
    {
     sizeof(PIXELFORMATDESCRIPTOR),   
     1,          
     PFD_DRAW_TO_WINDOW |     
     PFD_SUPPORT_OPENGL |     
     PFD_DOUBLEBUFFER,      
     PFD_TYPE_RGBA,       
     16,          
     0, 0, 0, 0, 0, 0,      
     0,          
     0,          
     0,          
     0, 0, 0, 0,        
     16,          
     0,          
     0,          
     PFD_MAIN_PLANE,       
     0,          
     0, 0, 0         
    };

   GLint  iPixelFormat; 

   // get the device context's best, available pixel format match 
   if((iPixelFormat = ChoosePixelFormat(hdc, &pfd)) == 0)
   {
    MessageBox::Show("ChoosePixelFormat Failed");
    return 0;
   }


   // make that match the device context's current pixel format 
   if(SetPixelFormat(hdc, iPixelFormat, &pfd) == FALSE)
   {
    MessageBox::Show("SetPixelFormat Failed");
    return 0;
   }

   if((m_hglrc = wglCreateContext(hdc)) == NULL)
   {
    MessageBox::Show("wglCreateContext Failed");
    return 0;
   }

   if((wglMakeCurrent(hdc, m_hglrc)) == NULL)
   {
    MessageBox::Show("wglMakeCurrent Failed");
    return 0;
   }


   return 1;
  }

Могу ли я решить эту проблему?

Ответы [ 2 ]

5 голосов
/ 22 августа 2010

Здесь измените конструктор:

m_hDC = GetDC((HWND)this->Handle.ToPointer());
if(m_hDC)
{
wglMakeCurrent(m_hDC, NULL);
MySetPixelFormat(m_hDC);
ReSizeGLScene(iWidth, iHeight);
InitGL();
}

Вы должны вызвать wglMakeCurrent после настройки m_hDC. Я отвечаю на первую статью примера. Здесь Создание представления OpenGL в форме Windows

Это решит мою проблему:)

2 голосов
/ 06 марта 2010

вы можете проверить, какое значение glGetLastError и в основном это потому, что вы выбрали неправильный или несовместимый формат пикселя, вы можете попробовать использовать другой формат, тогда ваш класс окна должен быть помечен как CS_OWNDC и установить DoubleBuffering на false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...