wglCreateContext()每次在OpenGL和Visual C ++中返回NULL

时间:2010-02-27 17:47:16

标签: visual-c++ opengl

我是OpenGL的新手。

我想在Windows窗体中使用OpenGL绘制一些想法。 如果我使用WinMain方法的Win32应用程序,应用程序工作。 在WinMain方法中,我使用HWND函数填充CreateWindow(),并将WinMain参数提供给CreateWindows

但是我希望从Windows窗体中获取Handle,我无法得到它。每次 wglCreateContext(hdc)返回NULL there是我的一个例子

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 个答案:

答案 0 :(得分:4)

这里,改变构造函数:

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

设置m_hDC后,必须调用wglMakeCurrent。我回复了该示例的第一篇文章。这里Creating an OpenGL view on a Windows Form

解决了我的问题:)

答案 1 :(得分:2)

你可以检查glGetLastError值是什么,因为你选择了错误或不兼容的像素格式,你可以尝试其他格式,那么你的窗口类应该被标记为CS_OWNDC并将DoubleBuffering设置为false。