У меня есть написанный класс, который может отображать анимированные GIF-файлы с помощью Direct 2d, как в этом примере из MSDN:
GIF, который я показываю, представляет собой постоянно растущий/сокращающийся не заполненный синий круг. Все остальные пиксели белые / фон белый.
В отличие от опубликованного примера, я создаю CWnd без подписи и границы, с размером GIF, с ID2D1RenderTarget, заполняющим весь CWnd, и размещаю его над содержимым моего основного фрейма.
Поскольку я никогда раньше не использовал Direct2d, я предположил, что могу просто применить SetLayerdWindow() к моему CWnd, чтобы достичь моей цели — отображать только синий круг.
SetLayeredWindowAttributes(RGB(255,255,255), 204, LWA_ALPHA | LWA_COLORKEY);
Это должно привести к CWnd без белых пикселей + прозрачность 80%. К сожалению, результирующее окно прозрачно на 80%, но ни один из удаленных белых пикселей не отображается.
Почему в этом случае не работает LWA_COLORKEY? И как мне добиться, чтобы мой CWnd или ID2D1HwndRenderTarget отрисовывал белый цвет как полностью прозрачный?!
Примечание:
Кроме того, я просто ради интереса попытался нарисовать полностью прозрачный фон с ID2D1HwndRenderTarget, например:
m_pHwndRT->Clear(D2D1::ColorF(D2D1::ColorF::White, 0.0f));
Microsoft заявляет: «Альфа-значение для создаваемого цвета. Значение альфа-канала находится в диапазоне от 0,0 до 1,0, где 0,0 представляет полностью прозрачный цвет, а 1,0 — полностью непрозрачный цвет. Значение по умолчанию — 1,0».
Что приводит к полностью белому непрозрачному окну... Что заставило меня задуматься, работает ли вообще вся эта прозрачность.