【问题标题】:Clearing a window contents in a blur behind window(DWM)在窗口后面的模糊中清除窗口内容(DWM)
【发布时间】:2012-03-13 08:44:15
【问题描述】:

我有一个窗口,我在上面调用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 调用或任何方法可以手动清除窗口?

【问题讨论】:

    标签: winapi dwm direct2d


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-10-25
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多