8

我正在尝试在不可见的 HWND 上绘制半透明矩形。但是,清除窗口ID2D1HwndRenderTarget::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();

提前致谢!

4

3 回答 3

5

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

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

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

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

于 2010-10-28T02:10:22.960 回答
4

使用ID2D1DCRenderTarget代替ID2D1HwndRendTarget,然后在绘图开始之前绑定窗口的设备上下文 (DC)。

当然,您需要WS_EX_LAYERED为您的窗口设置 ,然后调用SetLayeredWindowAttributes设置透明颜色:

SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 0, LWA_COLORKEY);

截屏:

于 2015-12-08T03:28:11.637 回答
1

创建 RenderTarget 时,您必须告诉 D2D 您要以像素格式使用 alpha(在预乘模式下):

  HRESULT hr = mD2DFactory->CreateHwndRenderTarget(
    D2D1::RenderTargetProperties( D2D1_RENDER_TARGET_TYPE_DEFAULT, D2D1::PixelFormat( DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED ) ),
    D2D1::HwndRenderTargetProperties( mWindow, size ),
    &mRenderTarget );

Clear()在此之后,使用零 alpha 值调用就可以了。

于 2012-05-16T22:29:24.257 回答