Windows 7上的全屏OpenGL窗口打开的模态对话框未显示

时间:2010-03-04 11:40:23

标签: winapi opengl windows-8 windows-7 modal-dialog

似乎我的问题可能与未回答的相关问题(OpenGL with GLUT on windows 7, fullscreen mode not showing the message box)相同。

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

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

窗口刚刚使用WS_POPUP样式创建。 GL背景没什么特别的。 Windows XP一切都很好。

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

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

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

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

PS。我也发布在opengl.org论坛上,对于那些跟随这两者的人都很抱歉。

修改

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

我也用“DWM_EC_DISABLECOMPOSITION”调用'DwmEnableComposition'来检查:问题仍然存在。

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

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

修改

Windows 8上也存在此问题。

4 个答案:

答案 0 :(得分:1)

Joseph Steel已经解决了posted on 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'的像素格式

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

作为参考,我已更新了test source code

编辑,2013年12月

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我在Win7 64位下遇到了与OpenGL相同的问题。 模态对话框和模态窗口未显示,它们在后台也处于活动状态。 我的项目使用立体显示(四重缓冲)。 在我的情况下,问题是由于显示适配器(Nvidia Quadro FX3800)的控制面板中的设置不正确。 设置为“Stereo Enabled”,错误地“关闭”。 打开它解决了这个问题。

答案 3 :(得分:0)

当我想要的时候,例如,在OpenGL全屏幕中打开一个fieldialog(Windows10 或之前的每个Windows),我打电话

RedrawWindow(hwnd,0,0,RDW_INTERNALPAINT);

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

就在此之后我打电话给了锉刀。 该文件将在OpenGL全屏显示。

在案例中的WndProc WM_PAINT:我做一个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;