0

我有一个我调用DwmExtendFrameIntoClientArea()的窗口,该窗口承载其他子窗口,我使用 Direct2D 在其中一个子窗口上进行绘制,当加载一个具有黑色区域的位图时,该区域变得模糊。我希望清除子窗口中的所有内容并在 上重新绘制WM_PAINT,但是我似乎无法清除内容。

  1. 我试图清除它使用

    m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::Black))
    

    这会使子窗口区域变黑,它会擦除​​所有以前的绘图,但没有透明度。

  2. 我试图绘制一个位图,它只是客户区上的一个黑条

    m_pRenderTarget->DrawBitmap(m_pBkgrnd,D2D1::Rect<float> (0.f,0.f,GetWidth(),GetHeight()))
    

    这使得之前出现的任何东西都变成了黑色。

  3. 尝试了在整个子窗口上绘制黑色区域的旧 GDI 方法,

    RECT rc;
    GetClientRect(m_hwnd, &rc);
    HBRUSH brush = CreateSolidBrush(RGB(0,0,0));
    HDC hc=GetDC(m_hwnd);
    FillRect(hc, &rc, brush);
    ReleaseDC(m_hwnd,hc);
    DeleteObject(brush);
    

    不工作。

  4. 但是,如果我不执行任何这些操作并尝试调整主窗口的大小,它会正常工作,即之前的绘画消失了。

在我再次绘制窗口之前,是否有任何 API 调用或任何方法可以手动清除窗口?

4

1 回答 1

0

你是如何初始化你的渲染目标的?确保您指定 Premultipled Alpha,而不是 Straight 或 Ignore。然后,要将所有内容清除为透明,请使用 ID2D1RenderTarget::Clear(D2D1::ColorF(0, 0, 0, 0))。您不能使用 FillRectangle 之类的东西来绘制透明颜色,因为这会将透明颜色混合到已经存在的颜色中,并且这是无操作的。

于 2012-04-10T18:49:46.267 回答