OpenGL Swapbuffers()在OnCreate和OnPaint中的行为不同,MFC在做什么?

OpenGL Swapbuffers()在OnCreate和OnPaint中的行为不同,MFC在做什么?,opengl,mfc,Opengl,Mfc,我使用MS Visual Studio 2013创建了一个MFC单文档界面应用程序,并取消选中了大多数复选框以简化自动生成的代码。我的视图类继承自CView,它重写OnCreate()和OnPaint()。我成功地在OnCreate()中创建了OpenGL渲染上下文,并调用了glClearColor()和glClear()。但是,从OnCreate()调用的SwapBuffers()似乎什么都不做,而从OnPaint()调用它时,窗口的客户区将以clearColor绘制 MFC在OnCreate

我使用MS Visual Studio 2013创建了一个MFC单文档界面应用程序,并取消选中了大多数复选框以简化自动生成的代码。我的视图类继承自CView,它重写OnCreate()和OnPaint()。我成功地在OnCreate()中创建了OpenGL渲染上下文,并调用了glClearColor()和glClear()。但是,从OnCreate()调用的SwapBuffers()似乎什么都不做,而从OnPaint()调用它时,窗口的客户区将以clearColor绘制

MFC在OnCreate和OnPaint之间做了什么使SwapBuffers()工作


MFC什么也没做。你认为这是为什么?MFC只是一个围绕Win32 API的C++包装器。您可能会问Win32 API在做什么

但是,您是否正在尝试使用WM_CREATE(MFC中的OnCreate()进行绘制)?我想问,为什么?通常,视图创建为不可见,然后使其可见。在不可见窗口中绘图没有任何用处。当窗口的一部分失效时,需要重新绘制。Windows在需要重新绘制时发送WM_PAINT消息。在看不见的窗口里画画是没有意义的。什么也没发生。一旦窗口可见,整个窗口将无效,需要重新绘制


通常,对于CView派生类,您不会重写OnPaint()或为WM_PAINT提供处理程序。相反,您将重写OnDraw(),框架将调用OnDraw()以响应WM_PAINT消息。

WM_CREATE和WM_PAINT之间发生了一些允许SwapBuffers产生效果的事情。不管最终是由Win32还是MFC完成,这都不是重点。所发生的是。在WM_CREATE和WM_PAINT之间发生了一些事情,允许SwapBuffers产生效果。不管最终是由Win32还是MFC完成,这都不是重点。所发生的事情是。(注释输入有问题,无法分成段落)为什么要重新创建?因为我想弄清楚在MFC应用程序中发生了什么以及发生了什么。我在哪里可以获得“创建视图并使其可见”的逐步描述?你的陈述很有帮助。正如“一旦窗口可见…”一样。我读过的MSDN文档并没有明确说明这些问题。
int CMFCApplication1View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    /* Most OpenGL context creation code removed */

    wglMakeCurrent(hdc, myOpenGLRenderContext); // Make the newly created OpenGL context current

    glClearColor(0.0f, 0.1f, 0.9f, 0.0f); // Set the clear color
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); // Clear buffers

    //SwapBuffers(hdc); // This line of code seems to do nothing.

    myHdc = hdc; // Save my HDC so I can call it from OnPaint

    return 0;
}

void CMFCApplication1View::OnPaint()
{
    CPaintDC dc(this); // device context for painting
    // TODO: Add your message handler code here

    //SwapBuffers(dc);
    SwapBuffers(myHdc); // The result is the same as using dc.

}