【问题标题】:Winapi: OpenGL can't render in child windowWinapi:OpenGL 无法在子窗口中渲染
【发布时间】:2013-08-13 07:55:22
【问题描述】:

我无法在我的主窗口中的子窗口下渲染我的场景。 我有两个注册窗口:

mainwindow = CreateWindow(bgwinNAME,     
                    TEXT("Benchmark"),
                    WS_OVERLAPPEDWINDOW,   
                    CW_USEDEFAULT,     
                    CW_USEDEFAULT,     
                    CW_USEDEFAULT,     
                    CW_USEDEFAULT,     
                    NULL,              
                    NULL,              
                    hInstance,         
                    NULL);             

ShowWindow(mhwnd, SW_MAXIMIZE);
UpdateWindow(mainwindow);

childwindow = CreateWindow(benchwinNAME,       
                    NULL,
                    WS_CHILD, 
                    (GetSystemMetrics(SM_CXSCREEN)-width)/2,     
                    (GetSystemMetrics(SM_CYSCREEN)-hight)/2,     
                    width,       
                    hight,       
                    mainwindow,              
                    NULL,              
                    hInstance,         
                    NULL);             

UpdateWindow(childwindow);

(子窗口稍后显示)

我的循环看起来像:

while(TRUE)
{
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
}
if(msg.message == WM_QUIT)
break;

StartOpenGL(childwindow, &hdc, &hrc );
   // .... my GL functions
SwapBuffers(hdc);
}
StopOpenGL(childwindow, hdc, hrc );
return msg.wParam;  
}

childwindowStartOpenGL(); 中设置为 hwnd 时,没有任何反应,我只能看到在窗口类 (hbrBackground) 中定义的带有白色背景的窗口。当 hwnd 设置为mainwindow 时,场景在SW_MAXIMIZE 范围内渲染。

我的 StartOpenGL 和 StopOpenGL 函数来自: Link

【问题讨论】:

    标签: winapi opengl window rendering parent-child


    【解决方案1】:

    请停止使用启动/停止 OpenGL 功能。 StartOpenGL 设置只能执行一次的窗口 PIXELFORMATDESCRIPTOR (PFD)。您最好在创建窗口后立即执行此操作。如果您的两个窗口共享一个兼容的 PFD(如果您在设置父窗口的 PFD 后创建子窗口就是这种情况;您仍然需要为子窗口设置非常相同的 PFD) ,您可以简单地使用wglMakeCurrent 在两个窗口之间切换单个 OpenGL 上下文,由它们的 HDC 标识。

    【讨论】:

    • 谢谢。我这样做了(也使用wglMakeCurrent),但我仍然一无所获。我注意到我在childwindow 场景渲染中将HWND 设置为NULL,但在SW_MAXIMIZE 上。我会继续寻找。
    • @user2674257:我需要查看您的完整代码才能就 SW_MAXIMIZE 问题提出任何有用的建议。然而,仅使用纯 Win32 API 创建 OpenGL 上下文并不难。事实上,当我大约 17 年前学习 OpenGL 时,在使用现有的简单 OpenGL 框架 (GLUT) 之一时,我经常遇到障碍。因此,在经历了一个令人沮丧的下午之后,我迅速破解了我使用了很长时间的 oen Win32-API OpenGL 框架。
    • 给你:[link]podidnbusko.pl/uploads/images/Main.zip pass: 123456。不用担心,我在文件上设置了密码,这样它就可以通过反抄袭系统了(这是为了学习目的)。如果您检查一下,我将不胜感激。我没有包含 opengl 代码和 int widthint hight 是:int width = GetSystemMetrics(SM_CXSCREEN)/2 int hight = GetSystemMetrics(SM_CYSCREEN)/2; StartOpenGL 和 StopOpenGL 在问题链接中(别担心,我会在我的工作中提到这些源代码,也有助于我过来!)。很抱歉成为这样的新手。谢谢!
    • 也应该是chwnd = CreateWindow(ChildNAME... insted of chwnd = CreateWindow(MainNAME...
    • 好的,我终于明白了 :) 我已将我的 startopenGL 函数放入孩子的 WM_PAINT 方法中。还添加了一些标志,因此可以按需渲染场景。谢谢你的时间:)
    猜你喜欢
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 2016-06-08
    • 1970-01-01
    相关资源
    最近更新 更多