清除窗口后面的模糊窗口内容(DWM)

时间:2012-02-22 23:07:32

标签: winapi dwm direct2d

我有一个窗口,我称之为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. 但是,如果我不做任何这样的事情,我会尝试调整主窗口的大小,它就可以正常工作,即之前的绘画消失了。

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

1 个答案:

答案 0 :(得分:0)

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