当前位置: 首页 > 知识库问答 >
问题:

如何让OpenGL和GDI同时正常工作?

益智明
2023-03-14

我有四个窗口,即一个父窗口和三个子窗口。我想做两个小窗口来画东西。第一个子窗口使用OpenGL,第二个子窗口使用GDI。如果我只是在OpenGL窗口上画一些东西,一切都很好,但当我尝试在GDI窗口上画(或只是尝试处理WM_PAINT消息)其他东西时,这些子窗口会变得奇怪。首先,我的第三个子窗口的某些部分(如按钮、静态、标题栏)将丢失。其次,如果我尝试调整这些窗口中的任何一个的大小,将丢失一个或两个子窗口。但一旦我点击这些窗口,它们就会回来。第三,PeekMessage不再工作,它总是返回FALSE,MessageBox似乎也不能正常工作(我看不到弹出窗口,但我可以听到声音)。

我认为消息处理可能有问题,但是我不知道实际发生了什么。这里有人有什么建议吗?

消息循环:

MSG msg;


DWORD dwLast;
DWORD dwCurrent;
DWORD dwInterval = 20;//50 FPS 1000 / 50
dwLast = GetTickCount();

while (1) {

    while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) == FALSE)
    {
        dwCurrent = GetTickCount();
        if (dwCurrent - dwLast < dwInterval)
            continue;

        SendMessage(Handle_Child_Demo, WM_PAINT, 0, 0);

        dwLast = dwCurrent;
    }
    if (GetMessage(&msg, NULL, 0, 0) != TRUE) {
        break;
    }
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

我没有使用MDI来创建我的子窗口,我只是使用CreateWindow来创建我所有的子窗口,我认为这一定是有问题的,我还需要做什么来确保这些子窗口正常工作?

共有1个答案

单于淇
2023-03-14

必须使用MDI来创建子窗口,请记住,使用MDI!!!!否则会有一些非常奇怪的事情,这是因为这些消息没有得到正确处理,MDI将帮助我们做到这一点。

 类似资料:
  • 我有一个由2个网格(平面、立方体)、一个灯和一个相机组成的场景。我想使用GLSL着色器和OpenGL的阴影映射技术在我的场景中显示阴影。 以下是我得到的结果(为了简单起见,我的立方体和平面都是蓝色和蓝色): 这是FBO和深度纹理初始化: 以下是我的顶点着色器的内容: 还有我的片段着色器: 正如你所见,模型上有一些工件,我不知道如何取出它们。但是阴影看起来是正确的,所以我的着色器中输入的变量也应该是

  • 在代码的开头,我已经初始化了vbo: 然后我的顶点和颜色数组: 现在我创建并绑定vbo并分配空间: 最后是渲染函数: 这应该画一个三角形,但我什么都看不见。可能glVertexPointer和glColorPointer的参数不正确。我已经阅读了opengl上关于VBO的文档。或者,我遵循了几个教程,比如:https://www.youtube.com/watch?v=KIeExgOcmv0 我的

  • 我正在一个使用谷歌地图apiv3的网站上工作。我在更新面板中有一个按钮,通过该按钮,我可以使用按钮点击背后的代码和javascript函数执行一些逻辑。 由于按钮在更新面板中,我在firebug的监视窗口中看不到任何东西,javascript函数中的断点也不起作用。在没有更新面板的情况下,我可以在watch中看到执行流程,一切正常,但我在map上得到了重新加载。 aspx中的代码: 单击按钮1:

  • 这是一个Gradle build,建议在这里使用play web framework。 它在构建,启动等时工作正常...从命令行,但一旦项目导入到intellij(使用的项目文件)中,依赖项(来自播放插件)不会显示在项目视图/外部库中(即使在gradle面板中点击“刷新所有gradle项目”之后)。 谢谢:) PS:intellij 15 . 0 . 2/gradle 2.6/play插件

  • 如何让jersey和@webservlet协同工作? 泽西资源配置: 在resourceConfig中注册的jersey资源: web servlet 案例1:访问此http://localhost:8088/ResponseFilterweb/login 控制台日志: 访问这个http://localhost:8088/ResponseFilterweb/hello 案例2:更改应用程序配置资源

  • 问题内容: 我试图使用executemany将值插入数据库中,但对我来说不起作用。这是一个示例: 这给了我以下错误: 但是,当我更改列表时,它可以正常工作: 它按预期工作!我可以在数据库中看到数据。为什么第一个列表不起作用而第二个列表却不起作用? (PS:这只是一个示例,而不是实际的代码。为简单起见,我制作了一个小测试用例)。 问题答案: 根据我对执行力的了解,您的意思是, 或类似的东西。不要在s