Как очистить цель визуализации Direct2D до полной прозрачности?
Я пытаюсь нарисовать полупрозрачные прямоугольники на невидимом HWND. Однако очистка окна с помощью ID2D1HwndRenderTarget::Clear просто делает все окно черным, поэтому, когда я рисую прямоугольники сверху, они выглядят полутерными.
Если я не очищаю () и не рисую, то окно невидимо, как и должно быть. Clear() является виновником здесь; однако, если я не использую это, то живопись портит довольно плохо.
Вот код, который я использую в моем 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();
Заранее спасибо!
3 ответа
При создании RenderTarget вам нужно будет указать D2D, что вы хотите использовать альфа (в режиме предварительного умножения) в формате пикселей:
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 );
После этого звоню Clear()
с нулевым значением альфа работает просто отлично.
Использование ID2D1DCRendTarget
вместо ID2D1HwndRendTarget
затем привяжите контекст устройства (DC) вашего окна перед началом рисования.
Конечно, вам нужно установить WS_EX_LAYERED
для вашего окна, а затем позвоните SetLayeredWindowAttributes
установить прозрачный цвет:
SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 0, LWA_COLORKEY);
Прозрачность - это проблема. Единственное окно, которое поддерживает прозрачность по пикселям, это окна WS_EX_LAYERED. Эти окна были разработаны для использования в качестве значков перетаскивания, и это приводит к проблемам при любом другом использовании.
Использование D2D с окнами WS_EX_LAYERED требует использования цели рендеринга DXGI. Для EndDraw вы получаете DC из цели рендеринга, затем передаете его в многослойное окно и говорите многослойному окну обновить себя. (Попробуйте это с HWNDRenderTarget - это, вероятно, приведет к падению драйвера устройства).
Я подозреваю, что ваше окно выглядит прозрачным, потому что оно вообще не рисует.
Еще одна ошибка, с которой вы можете столкнуться... если окно достаточно прозрачное, щелчки мыши будут проходить через него к основному окну.
D2D1::RenderTarget::Clear() требует передачи D2D1::ColorF() в качестве параметра в качестве цвета, с помощью которого можно очистить окно.