c++ - 如何将 Direct2D 渲染目标清除为完全透明

标签 c++ c transparency hwnd direct2d

我正在尝试在不可见的 HWND 上绘制半透明矩形。但是,使用 ID2D1HwndRenderTarget::Clear 清除窗口只会使整个窗口变黑,因此当我在顶部绘制矩形时,它们看起来是半黑色的。

如果我不使用 Clear() 并且不进行绘制,则窗口是不可见的,它应该是不可见的。 Clear() 是这里的罪魁祸首;但是,如果我不使用它,那么绘画就会变得非常糟糕。

这是我在 WindowProc 中使用的代码:

case WM_PAINT:
    // Begin drawing
    pRenderTarget->BeginDraw();
    pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());

    // Clear the window
    pRenderTarget->Clear();

    // Paint the panel and its children
    D2DSurface()->StartPainting();
    {
        D2DSurface()->PaintTraverse(panel);
    }
    D2DSurface()->FinishPainting();

    // Finish drawing
    HRESULT hr = plat->pRenderTarget->EndDraw();

提前致谢!

最佳答案

透明度是个问题。唯一支持逐像素透明度的窗口是 WS_EX_LAYERED 窗口。这些窗口专为拖放图标等用途而设计,这会导致其他所有用途出现问题。

将 D2D 与 WS_EX_LAYERED 窗口一起使用需要您使用 DXGI 渲染目标。对于 EndDraw,您从渲染目标中获取一个 DC,然后将其传递到分层窗口并告诉分层窗口自行更新。 (用 HWNDRenderTarget 试试这个 - 它可能会使设备驱动程序崩溃)。

我怀疑你的窗口看起来是透明的,因为它根本没有绘制。

您可能会遇到的另一个陷阱...如果窗口足够透明,鼠标点击将通过它到达底层窗口。

关于c++ - 如何将 Direct2D 渲染目标清除为完全透明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2603276/

相关文章:

css - 透明的 div 背景,带有淡淡的颜色?

WPF:如何避免图像超出 Canvas 的边界?

c++ - 数据长度过大的解压缓冲区会崩溃

java - 使用 c++ java native 代码的 GraphicsMagick 性能问题

c - 链表附加函数在开头添加一个额外的空节点

c - 静态分析“指向本地外部范围的指针”——误报?

c++ - 64 位架构 - 从函数返回时字符指针被截断

c++ - GNU Makefile 自动依赖解析

c++ - 无法捕获 C++ 异常

jquery - 在没有 JS 的情况下在图像上创建插入透明叠加层? (回应)