Какой лучший способ рисования оверлейной графики в Windows?

Я работаю с приложением Win32, которое должно создавать различные типы окон. В частности, эти окна часто не прямоугольные, имеют тени или в основном прозрачные.

Я сейчас пользуюсь WS_EX_LAYERED с UpdateLayeredWindow создать прозрачные окна, на которых я могу рисовать произвольную графику. Однако я считаю, что многослойные окна ограничивают то, что вы не можете иметь многослойные дочерние окна, и при этом многослойное окно не может должным образом содержать "нормальные" элементы управления Win32.

Нашей кодовой базе уже несколько лет, в основном используются Win32 и GDI, но мы находимся в процессе модернизации, и пришло время взглянуть на новые технологии.

Я подумал о том, чтобы сделать свое собственное оконное управление в WPF, но меня беспокоит то, что я читал о проблемах "воздушного пространства". Кажется, что WPF использует многослойные окна для выполнения альфа-смешения на пиксель, и поэтому он также будет страдать от ограничений, с которыми я сталкивался ранее.

Я не знаю много (что-нибудь, действительно) о Direct2D, но эта технология звучит так, как будто она может быть интересной. Тем не менее, я не могу найти никаких ссылок на то, что он может делать оверлейные окна.

Итак, все это подводит меня к моей проблеме: какова лучшая технология для создания оверлейных окон под Windows? (Vista и Win7 как минимум, XP было бы неплохо иметь)

Я пренебрегаю некоторыми, особенно хорошими технологиями? Мы ценим любые предложения.

2 ответа

Решение

Я рекомендую Direct2D и DirectWrite, поскольку вы получаете высококачественный рендеринг, который также смехотворно быстр по сравнению с GDI или чем-то, что делается в пространстве.Net. Единственная проблема заключается в том, что вам нужна Vista или более поздняя ОС для ее использования.

WPF может сделать то, что вы ищете, очень легко, но эта особенность WPF (окна с прозрачностью на пиксель) имеет тенденцию быть очень проблематичной из-за ошибок графических драйверов (очевидно, производители графического оборудования не тестируют многослойные окна Direct3D с альфа-значение пикселя очень хорошо).

WPF использует многоуровневые окна для прозрачности, но он не использует "нормальные" элементы управления win32, все элементы управления wpf в окне отображают их самостоятельно, используя только одно окно win32, все они поддерживают прозрачность.

Проблема "воздушного пространства" возникает только тогда, когда вы размещаете элемент управления WinForms в окне WPF.

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