Очистка содержимого окна в размытии за окном (DWM) - PullRequest
0 голосов
/ 23 февраля 2012

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

1 Ответ

0 голосов
/ 10 апреля 2012

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

...