在Windows下,当DWM构图处于活动状态时,全屏幕上的OpenGL应用程序有某种"特殊路径" 可以防止所有其他subwindows(弹出式,菜单,菜单,工具)要正确地在全屏opengl窗口的顶部。
虽然这对于游戏等有用,但对于其他全屏OpenGL应用程序(CAD,3D编辑器等)来说,这完全是痛苦的。这个问题正在给QT用户带来无尽的麻烦,请参阅此处,此处或此处。
是否有办法告诉Windows不要为给定的应用程序/全屏窗口启用特殊路径?在清单中或通过DWM API,我不在乎。
是的,这可以通过欺骗窗口来思考该窗口应以透明度进行组合来完成。为此,您可以在窗口上调用DwmEnableBlurBehindWindow
。如果有完整的ws_popup窗口,这使窗口完全透明(而不是玻璃效应),您可以使用窗口的alpha通道来控制不透明度。对于带有标题区域和边框的常规窗口,您会得到玻璃效果。
现在,如果您配置没有Alpha通道的PixelFormat或将Alpha通道设置为所有1(完全不透明度),则合作仪仍然必须假设某种透明度可能存在并通过完整的组合。
>小型更新
尽管WinxP和Win2K超出了EOL,但将dwmapi.dll
链接到可执行文件可能是不受欢迎的,例如如果您由于某种原因必须使用软件来支持旧系统。为此,我写了一个小型包装库dwm_load
,该库在可用的情况下动态加载dwmapi.dll或落回DWM函数的FailSAFE实现。