【问题标题】:Fullscreen borderless window with 'owned' window on-top全屏无边框窗口,顶部有“自有”窗口
【发布时间】:2015-12-18 22:20:45
【问题描述】:

我有两个 OpenGL 窗口:一个主窗口和一个设置为由主窗口“拥有”的较小窗口(在 CreateWindowEx 中设置了 hWndParent,但未设置 WS_CHILD 样式)。 如果我随后将我的主窗口转换为无边框并且与我的桌面大小相同,即使它是拥有的,它也会跳到较小的窗口前面,这应该是不可能的 (https://msdn.microsoft.com/en-us/library/windows/desktop/ms632599%28v=vs.85%29.aspx#owned_windows)。即使较小的窗口设置为始终在顶部也是如此。

就其本身而言,这并不可怕,但核心问题是我仍然可以通过我的主窗口点击小窗口所在的位置,并且小窗口会弹出在前面。通过单击主窗口,然后单击主窗口,我可以像这样无休止地在两个窗口之间切换。

如果我将主窗口大小设置为比完整桌面大小小 1 个像素,则不会出现这些问题,并且窗口的行为与预期一致。

我找不到任何描述此行为的文档。它是一项功能,可防止窗口出现在未记录的内容(例如正在播放的视频)前面,或者我只是错过了它?

我会提到我在这里没有使用分层或透明窗口,所以我认为甚至不可能点击?

谢谢

【问题讨论】:

  • 不确定 OpenGL 是否起作用,但一般来说,您可以通过将 MA_NOACTIVATE 返回到 WM_MOUSEACTIVATE 消息来停止鼠标单击时出现在前面的窗口。
  • 感谢您的回答。不幸的是,问题比这更大,因为较小的窗口正在处理所有鼠标事件,就好像它已经在主窗口的前面(鼠标悬停,点击等)。所以在这种状态下与主窗口的交互被破坏了。
  • 您可以尝试的另一件事是处理WM_NCHITTEST 并返回HTTRANSPARENT。如果您的程序没有更多信息/代码,很难更具体。
  • 如果您没有 OpenGL 上下文,这是否有效?尝试只创建一个带有按钮的常规旧窗口,使其全屏显示,然后在其上打开一个对话框。

标签: windows winapi opengl


【解决方案1】:

您遇到的很可能是一个 OpenGL 实现错误,该错误是由驱动程序在“窗口”和“全屏”渲染之间切换的启发式触发的:您看,对于 OpenGL,没有 Direct3D 所具有的特殊“独占全屏模式” .取而代之的是,覆盖整个屏幕的无边框窗口可能会触发“全屏”检测,这可能会导致相关的 OpenGL 实现切换到另一个代码路径(即一个,其中所有像素所有权测试都被禁用,并且帧缓冲翻转直接进入显示扫描,绕过窗口合成器。

您在那里所做的事情非常罕见,以至于它可能已经通过了所有的一致性测试。 OpenGL 窗口的子窗口一开始并不常见,而且它们浮动的情况更罕见。

如果您有一个最小的示例展示,您可能应该将其作为错误报告给驱动程序供应商。与此同时,我提出了一个解决方法:让你的 OpenGL 窗口成为顶层窗口的子窗口(当然需要在顶层 WM_SIZE 中调整大小),并使浮动窗口成为顶层窗口的另一个子窗口;尊重并保留父窗口中子窗口之间的 z 顺序。作为顶级窗口的子窗口应该抑制大多数启发式方法,并且 OpenGL 驱动程序不应在 OpenGL 父窗口的边框和大小处循环。

【讨论】:

  • Be careful not to confuse child windows with owned windows. 我认为人们想到的场景是像 Photoshop 中的工具箱对话框,但无论出于何种原因在他们的 OpenGL 窗口中。在这种情况下,OpenGL 窗口是全屏的仍然很不寻常,但这是一个完全可能的设计决策(它避免了编写自己的小部件工具包和管理除 OpenGL 内容之外的虚拟窗口的需要)。您的答案仍然有效,并且对“拥有”有意义;请记住区别。
  • @andlabs 对我的场景的描述是正确的。该应用程序是一个 3D 编辑/播放工具,它也可以进入全屏模式来播放内容,但有时让一些对话框仍然可见以在播放场景时对其进行操作很有用。 datenwolf 可能是正确的,这是由全屏显示的特殊行为引起的 OpenGL 特定问题。有趣的是,这种行为发生在 Nvidia、AMD 和 Intel GPU 上,所以如果它与驱动程序相关,那么它们都在做同样的事情(当然这是完全可能的)。
  • @mb13:嗯,如果没有看到您的代码,真的很难判断。下次我在我的机器上启动 Windows 时,我会尝试重现它。
猜你喜欢
  • 2012-03-15
  • 2021-12-27
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
相关资源
最近更新 更多