2012-02-22 2 views
0

У меня есть окно, на котором я называю DwmExtendFrameIntoClientArea(), оконные хосты и другие дочерние окна, я использую Direct2D рисовать на одном из дочерних окон, Когда растровое изображение который имеет черную область на нем, эта область становится размытой. Я хочу очистить все в дочернем окне и нарисовать его снова на WM_PAINT, однако я не могу очистить содержимое.Очистка содержимого окна в пятне за окном (DWM)

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

ответ

0

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

Смежные вопросы