【问题标题】:Disable transparency for a "desktop" child window禁用“桌面”子窗口的透明度
【发布时间】:2016-11-23 19:25:00
【问题描述】:

我将一个窗口固定到桌面,方法是将其设为 WorkerW 窗口的子窗口,该窗口包含 Windows 7 Aero 中的桌面 FolderView。到目前为止,这非常适合将窗口固定在桌面上,但是窗口具有某种透明度,而它作为最顶层窗口所没有的。Instead of a dark background RGB(0,21,32) the actual desktop background/wallpaper shines through

case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    GetClientRect(hWnd, &cr);
    SelectObject(hdc, GetStockObject(DC_BRUSH));
    SetDCBrushColor(hdc, RGB(0,21,32));
    FillRect(hdc, &cr, (HBRUSH) GetStockObject(DC_BRUSH));

客户区是通过 GDI 绘制的,我尝试了所有我能想到的使窗口完全不透明的方法:SetBkColor、SetLayeredWindowAttributes、WNDCLASSEX.style = CS_PARENTDC,使用 RGBA 颜色(只能使透明度达到 100% ,但将其设置为不透明不会改变结果)

有什么方法可以绘制一个不透明的窗口作为 Aero 桌面的子窗口?

【问题讨论】:

  • 据我所知,甚至没有支持为桌面创建子窗口的方法。但是,如果您坚持必须 Hack The Planet™,请考虑创建没有重定向位图 (WS_EX_NOREDIRECTIONBITMAP) 的窗口并手动添加 DirectX 表面以进行渲染。这可能让您更好地控制桌面组合。或者也许你可以使用 DirectComposition API 来控制桌面合成,虽然我没有这方面的经验。
  • 你为什么要尝试做这个不受支持的事情?你知道你不应该这样做吗?
  • 为什么要让它成为一个孩子?简单地放置窗口会导致什么问题?您是否考虑过这将如何在远程桌面下工作?关闭 Aero 开关?使用 Windows 8、8.1 和 10?
  • 为什么应该“不受支持”?没有在文档中阅读有关它的任何内容。这是将窗口固定到桌面的唯一方法,将其置于 z 顺序(底部)不能可靠地工作,请参阅:Openhardwaremonitor 小工具、Rainmeter,或者即使您仍然敢于使用它,Windows 7 侧边栏。 EXE文件。因此,即使 Microsoft 可执行文件也难以将窗口固定在特定的 z 顺序,我也没有看到另一种方法。它不必为8-10工作。如果有人可以提供一种方法以将窗口固定在特定的 z 顺序上,那么我将很乐意实现它;-)
  • @IInspectable DirectComposition 不只是 Win 8 或更高版本吗?

标签: c++ c windows winapi gdi


【解决方案1】:

使用 Direct2D 可以按预期完成工作(100% 不透明),只要我将它与 GDI(CreateDCRenderTarget 或 ID2D1GdiInteropRenderTarget)混合,整个透明度就会再次出现。 “Direct2D 和 GDI 互操作性”就这么多 猜猜是时候将旧版 GDI 代码移植到 Direct2D 了......

【讨论】:

  • 顺便说一句。我尝试了可以​​在文档中找到的每个像素格式(DXGI_FORMAT 和 D2D1_ALPHA_MODE)的组合,只要涉及 GDI,它就不会改变行为,所以如果没有人想出 GDI 的解决方案,Direct2D 方法似乎是只“回答”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 2010-10-21
  • 1970-01-01
  • 2011-05-21
相关资源
最近更新 更多