1

看来我的问题可能与未回答的相关问题相同(OpenGL with GLUT on windows 7,全屏模式不显示消息框)。

由于我切换到 Win7 作为开发环境以及我的应用程序可能的目标平台,我注意到它们的行为出现了回归。

每当我有一个包含全屏 OpenGL 上下文的全屏窗口时,应用程序在显示模式对话框(例如消息框、文件打开对话框等)时都会出现问题

该窗口刚刚使用 WS_POPUP 样式创建。GL 上下文没有什么花哨的。Windows XP 一切正常。

Windows 7 下的问题是模式对话框在打开时是不可见的(可能它们出现在全屏窗口后面)。您必须 Alt-Tab 应用程序才能显示对话框。

这是一个主要问题,因为应用程序似乎被冻结,而实际上它正在等待用户输入。

有没有人遇到过这种行为?有谁知道解决方法?

我很快就制作了一个示例测试应用程序;它的源代码可以在http://pastebin.com/K4v2NNDs找到。可以在这里找到一个简单的 MSVC8 项目。

PS。我还在 opengl.org 论坛上发过帖子,对于那些同时关注这两个问题的人感到抱歉。

编辑

感谢 Chris 的评论,我已经测试了各种事件的模式对话框,例如 WM_TIMER 或 WM_RBUTTONUP,但问题仍然存在。

我还用“DWM_EC_DISABLECOMPOSITION”调用了“DwmEnableComposition”,只是为了检查:问题仍然存在。

我还通过用 DirectX 替换 OpenGL 位来测试应用程序,这样一切都按预期工作......这真的是 OpenGL 造成的问题。

(更新了 pastebin http://pastebin.com/Rq1Ehm3w和我的暂存器)

编辑

Windows 8 上也存在该问题。

4

4 回答 4

1

Joseph Steel在 opengl.org上发布了一个解决方法,因此,作为参考,我也将其放在这里:

我为这个问题找到的解决方案是确保窗口的像素格式使用 WGL_SWAP_COPY_ARB 交换方法而不是 WGL_SWAP_EXCHANGE_ARB。

我注意到必须使用“wglChoosePixelFormatARB”来获取像素格式。

我尝试使用带有“PFD_SWAP_COPY”标志的经典“ChoosePixelFormat”,但它在我的系统(Win7 x64 + NVidia GeFo 9600GT v196.21)上不起作用,因为它总是返回带有“PFD_SWAP_EXCHANGE”的像素格式。

我对结果只有一半满意,因为它在我的显示器中引入了一些撕裂,但至少它有效!

作为参考,我更新了我的测试源代码

编辑,2013 年 12 月

这种解决方法不再起作用,至少在我的系统(笔记本电脑,Optimus GeForce 650M)上。WGL_SWAP_COPY_ARB 已设置,但模式对话框未显示。到目前为止,似乎创建具有 1 像素边框的窗口(将 WS_BORDER 添加到 WS_POPUP 样式)可以解决问题,并防止进入“全屏”模式。

于 2010-03-08T17:07:15.237 回答
0

Win7 64位下的OpenGL也有同样的问题。不显示模态对话框和模态窗口,它们在后台也处于活动状态。我的项目使用立体显示(四缓冲区)。就我而言,问题是由于显示适配器(Nvidia Quadro FX3800)的控制面板中的设置不正确造成的。设置为“启用立体声”,错误地打开“关闭”。打开它解决了这个问题。

于 2013-12-04T16:00:55.277 回答
0

我系统上的解决方案非常简单: - 不要在创建窗口时指定 WS_POPUP 样式。- 在您获得 hwnd 之后,使用 SetWindowLong(hwnd,GWL_STYLE, yr_styles) 将您的窗口样式重新设置为您想要的(但不再使用 WS_POPUP);

于 2013-09-10T12:00:56.973 回答
0

例如,当我想在 OpenGL 全屏(Windows10 或之前的每个 Windows)中打开一个文件对话框时,我会调用

RedrawWindow(hwnd, 0, 0, RDW_INTERNALPAINT);

(这会导致 WM_PAINT 消息发布到窗口,无论窗口的任何部分是否无效)

就在这之后,我调用了文件对话框。文件对话框现在将以 OpenGL 全屏显示。

在 WM_PAINT 案例内的 WndProc 中:我做了一个 SwapBuffers(hdc)

RedrawWindow(hwnd, 0, 0, RDW_INTERNALPAINT);
// important when fullscreen; forces a WM_PAINT message,
GLwin->Fileselect(s_fname); // or whatever dialog

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lparam)
{
  switch(message)
  {
    case WM_PAINT:
    SwapBuffers(hdc);  // (same as in the render-loop)
    break;
于 2016-01-07T06:19:38.903 回答