Pergunta

eu estou tentando Desenhe retângulos semi-transparentes em um hwnd invisível. No entanto, limpar a janela com ID2D1HWNDRENDERTARGET :: Clear apenas torna a janela inteira preta; portanto, quando eu desenho retângulos por cima, eles parecem semi-pretos.

Se eu não limpar () e não desenhar, a janela é invisível, como deveria ser. Clear () é o culpado aqui; No entanto, se eu não usá -lo, pintar muito mal.

Aqui está o código que estou usando no meu WindowProc:

case WM_PAINT:
    // Begin drawing
    pRenderTarget->BeginDraw();
    pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());

    // Clear the window
    pRenderTarget->Clear();

    // Paint the panel and its children
    D2DSurface()->StartPainting();
    {
        D2DSurface()->PaintTraverse(panel);
    }
    D2DSurface()->FinishPainting();

    // Finish drawing
    HRESULT hr = plat->pRenderTarget->EndDraw();

Desde já, obrigado!

Foi útil?

Solução

Ao criar o seu RenderTarget, você terá que dizer ao D2D que deseja usar o Alpha (no modo pré -multipicado) no formato Pixel:

  HRESULT hr = mD2DFactory->CreateHwndRenderTarget(
    D2D1::RenderTargetProperties( D2D1_RENDER_TARGET_TYPE_DEFAULT, D2D1::PixelFormat( DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED ) ),
    D2D1::HwndRenderTargetProperties( mWindow, size ),
    &mRenderTarget );

Depois disso, chamando Clear() Com um valor alfa de zero, funciona muito bem.

Outras dicas

A transparência é um problema. A única janela que suporta a transparência por pixel são WS_EX_LAYEND Windows. Essas janelas foram projetadas para usos como ícones de arrasto e isso leva a problemas em todos os outros usos.

O uso do D2D com WS_EX_LAYED Windows exige que você use um Target de renderização DXGI. Para endraw, você retira um DC do alvo de renderização e depois passa para a janela em camadas e diz à janela em camadas para se atualizar. (Experimente com um HWNDRERTARGET - ele provavelmente falhará o driver do dispositivo).

Suspeito que sua janela pareça transparente porque não está desenhando.

Outro Gotcha em que você pode encontrar ... Se a janela for suficientemente transparente, os cliques do mouse passarão pela janela subjacente.

Usar ID2D1DCRendTarget ao invés de ID2D1HwndRendTarget, depois vincule o contexto do dispositivo (DC) da sua janela antes do início do desenho.

Claro, você precisa definir o WS_EX_LAYERED para sua janela e depois ligue SetLayeredWindowAttributes Para definir a cor transparente:

SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 0, LWA_COLORKEY);

Captura de tela:

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top