全屏无边框窗口,顶部有'拥有'窗口

时间:2015-12-18 22:20:46

标签: windows winapi opengl

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

就它而言,这并不可怕,但核心问题是我仍然可以点击我的主窗口,在较小的窗口所在的位置,较小的窗口将弹出正面。我可以通过点击主窗口,然后点击主窗口,无休止地在两个窗口之间进行操作。

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

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

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

由于

1 个答案:

答案 0 :(得分:1)

你所经历的很可能是一个由启发式触发的OpenGL实现错误,其中驱动程序在窗口之间切换"和"全屏"渲染:你看,对于OpenGL,没有特殊的全屏模式"就像Direct3D一样。相反,覆盖整个屏幕的无边框窗口(不与外部窗口重叠)可能会触发全屏"检测,这可能是有问题的OpenGL实现切换到另一个代码路径(即一个,所有像素所有权测试被禁用,帧缓冲区翻转直接进入显示扫描输出,绕过窗口合成器。

你在那里做的事情是如此罕见,它可能已经在所有一致性测试中滑落。将子窗口连接到OpenGL窗口首先是不常见的,它们的浮动甚至更少。

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