C opengl win32未绘制到屏幕

C opengl win32未绘制到屏幕,c,winapi,opengl,glew,wgl,C,Winapi,Opengl,Glew,Wgl,我正在尝试使用glClearBufferfv(GL\u COLOR,0,red)绘制一个红色屏幕 程序显示白色屏幕,光标上的加载图标持续旋转 我正在使用glew。我也在使用VisualStudio,我想我已经链接到了所有必要的库。我使用了整个创建一个临时上下文来使用wglCreateContextAttribsARB扩展 我有两个设置功能。第一个创建窗口并设置pfd:(编辑器没有正确格式化我的代码,因此我将省略函数名) 第二个创建上下文并启动消息循环: HDC hDC; HGLRC hRCt,

我正在尝试使用
glClearBufferfv(GL\u COLOR,0,red)
绘制一个红色屏幕

程序显示白色屏幕,光标上的加载图标持续旋转

我正在使用glew。我也在使用VisualStudio,我想我已经链接到了所有必要的库。我使用了整个创建一个临时上下文来使用wglCreateContextAttribsARB扩展

我有两个设置功能。第一个创建窗口并设置pfd:(编辑器没有正确格式化我的代码,因此我将省略函数名)

第二个创建上下文并启动消息循环:

HDC hDC;
HGLRC hRCt, hRC;
HWND  hWnd;
MSG   msg;

hWnd = CreateOpenGLWindow("minimal", 0, 0, 256, 256, PFD_TYPE_RGBA, 0);
if (hWnd == NULL)
    exit(1);

hDC = GetDC(hWnd);
hRCt = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRCt);
glewExperimental = true;
glewInit();

int attribs[] =
{
    WGL_CONTEXT_MAJOR_VERSION_ARB, 4,
    WGL_CONTEXT_MINOR_VERSION_ARB, 5,
    WGL_CONTEXT_FLAGS_ARB, 0,
    0
};
hRC = wglCreateContextAttribsARB(hDC, 0, attribs);
wglMakeCurrent(hDC, NULL);
wglDeleteContext(hRCt);
wglMakeCurrent(hDC, hRC);

ShowWindow(hWnd, nCmdShow);

while (GetMessage(&msg, hWnd, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

wglMakeCurrent(NULL, NULL);
ReleaseDC(hWnd, hDC);
wglDeleteContext(hRC);
DestroyWindow(hWnd);

return msg.wParam;
这是我的wndproc:

   static PAINTSTRUCT ps;

switch (uMsg) {
case WM_PAINT:
    display();
    BeginPaint(hWnd, &ps);
    EndPaint(hWnd, &ps);
    return 0;

case WM_SIZE:
    //glViewport(0, 0, LOWORD(lParam), HIWORD(lParam));
    PostMessage(hWnd, WM_PAINT, 0, 0);
    return 0;

case WM_CHAR:
    switch (wParam) {
    case 27:            /* ESC key */
        PostQuitMessage(0);
        break;
    }
    return 0;

case WM_CLOSE:
    PostQuitMessage(0);
    return 0;
}

return DefWindowProc(hWnd, uMsg, wParam, lParam);
这是我的显示功能:

glClearBufferfv(GL_COLOR, 0, red);
glFlush();
红色是一个全局变量,定义为:

GLfloat red[4] = {1, 0, 0, 1};
有没有关于它为什么不显示在屏幕上的帮助?

请将
display()
放在
BeginPaint
EndPaint
之间

通过调用BeginPaint函数启动绘制操作。 此函数使用有关的信息填充PAINTSTRUCT结构 重新绘制请求

完成绘制后,调用EndPaint函数。此函数 清除更新区域,该区域向窗口发出该窗口已关闭的信号 完成了绘画本身

参考:

使用示例快速恢复问题:

 HDC hdc = GetDC(hWnd);
 case WM_PAINT:
        {
            PAINTSTRUCT ps; 
            FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 2));         
            BeginPaint(hWnd, &ps);              
            EndPaint(hWnd, &ps);
        }
调试:


调试:

也许你忘了
SwapBuffers(一些hdc)
glFlush()之后display()
的动作可能会影响
WndProc中
WM_PAINT
的背景显示function@AlanSanchez现在,你似乎已经解决了这个问题,你介意分享一下你的尝试吗?
 HDC hdc = GetDC(hWnd);
 case WM_PAINT:
        {
            PAINTSTRUCT ps; 
            FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 2));         
            BeginPaint(hWnd, &ps);              
            EndPaint(hWnd, &ps);
        }
 HDC hdc = GetDC(hWnd);
 case WM_PAINT:
        {
            PAINTSTRUCT ps;         
            BeginPaint(hWnd, &ps);
            FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 2)); 
            EndPaint(hWnd, &ps);
        }