Como faço para limpar um alvo direto de renderizar para totalmente transparente
-
25-09-2019 - |
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!
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);