代码之家  ›  专栏  ›  技术社区  ›  rotoglup

在Windows 7上,由全屏OpenGL窗口打开的模式对话框不显示

  •  0
  • rotoglup  · 技术社区  · 16 年前

    看来我的问题和一个没有答案的相关问题是一样的( OpenGL with GLUT on windows 7, fullscreen mode not showing the message box ).

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

    每当我有一个包含全屏OpenGL上下文的全屏窗口时,应用程序就无法显示模式对话框(如消息框、文件打开对话框等)

    窗口是用WS_弹出式创建的。德国劳埃德船级社的背景并不奇特。Windows XP的一切都很好。

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

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

    有人遇到过这种行为吗?有人知道解决办法吗?

    我很快编写了一个示例测试应用程序;其源代码可以在 http://pastebin.com/K4v2NNDs . 可以找到一个简单的MSVC8项目 here .

    另外,我也在opengl.org论坛上发了帖子,很抱歉你们两个都关注。

    编辑

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

    我还用“DWM-EC-u-DISABLECOMPOSITION”调用了“DwmEnableComposition”,只是为了检查:问题仍然存在。

    我还测试了应用程序,用DirectX替换了OpenGL位,这样一切都按预期工作。。。是OpenGL造成了这个问题。

    (更新的pastebin http://pastebin.com/Rq1Ehm3w 和我的草稿行)

    编辑

    这个问题也存在于Windows 8上。

    4 回复  |  直到 9 年前
        1
  •  1
  •   rotoglup    12 年前

    解决办法是 posted on opengl.org 约瑟夫·斯蒂尔,所以,我也把它放在这里作为参考:

    我为这个问题找到的解决方案是确保窗口的像素格式使用WGL_SWAP_COPY_ARB SWAP方法,而不是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样式)似乎起到了作用,并防止进入“全屏”模式。

        2
  •  0
  •   user2764809user2764809    12 年前

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

        3
  •  0
  •   erez    12 年前

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

        4
  •  0
  •   user5755892user5755892    10 年前

    例如,当我需要时,在OpenGL全屏(Windows10)中打开一个文件对话框 或者以前所有的窗户),我打电话给

    重画窗口(hwnd,0,0,RDW_INTERNALPAINT);

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

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

    在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;