2014-12-16 7 views
0

Я ищу для создания дочернего фрейма (CWnd подкласс), который имеет прозрачные области.Direct2D Transparency With MFC

Однако я не могу заставить работать прозрачность. Из того, что я понимаю, мне нужно было бы обеспечить прозрачность при создании ID2D1HwndRenderTarget с использованием флага D2D1_ALPHA_MODE_IGNORE (as seen here) Однако я не создаю цель визуализации таким образом. Вместо этого я использую EnableD2DSupport() в моем методе OnCreate(). Когда я пытаюсь очистить цель рендеринга с помощью CHwndRenderTarget::Clear(ColorF), используя цвет с непрозрачностью, равным 0,0, непрозрачность игнорируется. Я делаю это в своей функции, обрабатывая сообщение AFX_WM_DRAW2D, с целью рендеринга, взятой из LPARAM.

Любые идеи о том, как добиться прозрачности для этого?

ответ

1

D2D1_ALPHA_MODE_IGNORE means what it says - альфа-канал игнорируется (чертежи всегда непрозрачны). Вопрос SO, связанный с мишенью, касается противоположной проблемы, когда чертежи всегда прозрачны.

Как я вижу, EnableD2DSupport() создает ID2D1HwndRenderTarget, но, скорее всего, с флагом D2D1_ALPHA_MODE_IGNORE. Вам нужно D2D1_ALPHA_MODE_PREMULTIPLIED или D2D1_ALPHA_MODE_STRAIGHT, так что вы можете использовать альфа-канал.

Если возможно, создать ID2D1HwndRenderTarget вручную с соответствующим режимом альфа, а затем прикрепить его к CHwndRenderTarget с CHwndRenderTarget::Attach

Другой путь (который я выбрал бы) является Direct2D 1,1 пути (точнее - ID2D1DeviceContext), управляя всем процессом рисования вручную. Для некоторых руководств смотрите this answer.

+0

Большое спасибо за помощь Питер, высоко ценим! –