【问题标题】:ID2D1HwndRenderTarget always having black background instead of transparentID2D1HwndRenderTarget 总是有黑色背景而不是透明
【发布时间】:2013-09-21 03:05:05
【问题描述】:

我正在尝试创建一个简单的透明窗口,我可以在其中使用 Direct2D 进行绘图。

到目前为止我做了什么:

  1. 创建的窗口
  2. 将样式设置为 WS_EX_LAYERED
  3. 将 alpha 颜色键设置为 #FFF
  4. 使用 Windows 图形绘制一个白色矩形
  5. 现在窗口是透明的,具有每个像素的 Alpha 值
  6. 然后在窗口外制作一个目标并使用 Direct2D 进行绘制
    • 制作 ALPHA _PREMULIPLIED 目标
    • 使用 0.0f alpha 的 #FFF 清除
  7. 窗口现在是黑色的

我只是不知道如何使窗口透明。如果您能指出我的错误,我将不胜感激

【问题讨论】:

    标签: c++ c user-interface mfc direct2d


    【解决方案1】:

    这里是如何使用 DirectComposition API 实现的

    俄语:http://www.oszone.net/25395/

    英文:https://msdn.microsoft.com/magazine/dn745861.aspx

    基本上作者所做的是

    1. 设置 WS_EX_NOREDIRECTIONBITMAP 扩展样式以删除 DWM 的重定向位图。窗口的内容现在是空的。

    2. 创建 DirectComposition 设备

    3. 创建组合交换链(而不是 hwnd 交换链)

    4. 将一个带有 SwapChain 的视觉对象作为根视觉对象的内容。

    5. 使用 Direct2D API 渲染到 SwapChain。

    它也适用于 WS_EX_TRANSPARENT | WS_EX_LAYERED | WS_EX_TOPMOST 创建事件透明覆盖。

    【讨论】:

      【解决方案2】:

      我认为使用 directX 是不可能的。但是 GDI 确实有效。

      在此处查看源代码以了解它是如何完成的:http://pastebin.com/NJf8wi2V

      在源代码中,您可以看到有一个尝试使用 directx/opengl 的选项。但是,正如您从运行中看到的那样,它们不起作用。

      【讨论】:

      • 感谢您的确认。我继续使用 GDI 代替
      猜你喜欢
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 2015-04-01
      • 2012-09-10
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多