Общие сведения об областях применения технологий
Если в приложении используются несколько технологий представления, такие как WPF, Win32 или DirectX, то они должны совместно использовать области отрисовки в общем окне верхнего уровня. В этом разделе описываются проблемы, которые могут повлиять на представление и выходные данные приложения взаимодействия с WPF.
Области
В окне верхнего уровня можно представить, что каждый HWND, который представляет собой одну из технологий приложения взаимодействия, имеет собственную область (также называемую "свободное пространство"). Каждый пиксель в окне принадлежит только одному дескриптору HWND, который определяет область этого HWND. (Строго говоря, существует более одной области WPF, если имеется более одного HWND WPF, но для целей этого обсуждения можно предположить, что есть только один). Область подразумевает, что все слои или другие окна, которые пытаются отобразиться поверх этого пикселя во время существования приложения, должны быть частью одной и той же технологии уровня отрисовки. Попытка отобразить пиксели WPF поверх Win32 приводит к нежелательным результатам и в максимально возможной степени запрещается через взаимодействие API.
Примеры областей
На следующем рисунке показано приложение, в котором одновременно используются Win32, DirectX и WPF. Каждая технология использует отдельный, неперекрывающийся набор пикселей, и проблемы с областями отсутствуют.
Предположим, что это приложение использует положение указателя мыши для создания анимации, которая пытается выполнить отрисовку поверх любой из этих трех областей. Независимо от того, какая технология отвечает за анимацию, эта технология нарушила бы область двух других. На рисунке показана попытка отрисовать круг WPF поверх области Win32.
Другое нарушение — это попытка использовать прозрачность/альфа-смешение между различными технологиями. На следующей иллюстрации окно WPF нарушает области Win32 и DirectX. Так как пиксели в этом окне WPF являются полупрозрачными, они должны принадлежать и DirectX, и WPF, что невозможно. Так что это еще одно нарушение, и его нельзя построить.
В предыдущих трех примерах использовались прямоугольные области, но возможны разные формы. Например, в области может быть отверстие. На следующем рисунке показана область Win32 с прямоугольным отверстием. Это размер областей WPF и DirectX вместе.
Области также могут быть полностью непрямоугольными или иметь любую форму, описываемую Win32 HRGN (область).
Прозрачность и окна верхнего уровня
Диспетчер окон Windows в действительности обрабатывает только HWND Win32. Таким образом каждый WPF Window является HWND. Window HWND должны соблюдаться общие правила для любого HWND. Внутри этого HWND код WPF может выполнять любую поддержку WPF API. Но для взаимодействия с другими HWND на рабочем столе WPF должен соответствовать правилам обработки и отрисовки Win32. WPF поддерживает непрямоугольные окна с помощью Win32 API— HRGN для непрямоугольных окон и многослойные окна для альфа на пиксель.
Постоянные альфа- и цветовые ключи не поддерживаются. Win32 возможности многослойных окон зависят от платформы.
Многослойные окна позволяют сделать все окно прозрачным (полупрозрачным), указав альфа-значение, которое применяется к каждому пикселю в окне. (Win32 фактически поддерживает альфа-смешение на уровне отдельных пикселей, но это очень сложно использовать в практических программах, потому что в этом режиме нужно рисовать все дочерние HWND самостоятельно, включая диалоговые окна и выпадающие списки).
WPF поддерживает HRGN. Тем не менее, есть нет управляемых API для использования этой функции. Можно использовать платформу вызова и HwndSource для вызова соответствующего Win32 API. Дополнительную информацию см. в разделе Вызов встроенных функций из управляемого кода.
WPF Многослойные окна имеют разные функциональные возможности в различных операционных системах. Это связано с тем, что WPF использует DirectX для отрисовки, а многослойные окна были в первую очередь предназначены для отрисовки GDI, а не DirectX.
WPF поддерживает аппаратное ускорение многослойных окон в Windows Vista и более поздних версий. Для многослойных окон с аппаратным ускорением в Microsoft Windows XP требуется поддержка Microsoft DirectX, поэтому их возможности будут зависеть от версии Microsoft DirectX на данном компьютере.
WPF не поддерживает цветовые ключи прозрачности, так как WPF не может гарантировать отрисовку необходимого цвета, особенно при использовании аппаратного ускорения.
Если приложение работает в Microsoft Windows XP, многослойные окна поверх поверхностей DirectX мерцают при отрисовке приложения DirectX. (Фактическая последовательность отрисовки заключается в том, что Windows GDI скрывает многослойное окно, выполняется рисование DirectX, а затем возвращает Windows GDI многослойное окно). Это ограничение накладывается и на многослойные окна вне WPF.