Как очистить цель визуализации 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() в качестве параметра в качестве цвета, с помощью которого можно очистить окно.

Другие вопросы по тегам