Очистка содержимого окна в размытии за окном (DWM)

У меня есть окно, в котором я вызываю 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 или какой-либо способ очистить окно вручную, прежде чем я снова его нарисую?


person Prasanth Ravi    schedule 22.02.2012    source источник


Ответы (1)


Как вы инициализируете цель рендеринга? Убедитесь, что вы указали Premultipleed Alpha, а не Straight или Ignore. Затем, чтобы сделать все прозрачным, используйте ID2D1RenderTarget::Clear(D2D1::ColorF(0, 0, 0, 0)). Вы не можете использовать что-то вроде FillRectangle для рисования прозрачным цветом, так как это смешает прозрачный цвет с тем, что уже есть, и это не работает.

person Rick Brewster    schedule 10.04.2012