Поделиться через


Общие сведения об областях применения технологий

Если в приложении используются несколько технологий представления, такие как WPF, Win32 или DirectX, то они должны совместно использовать области отрисовки в общем окне верхнего уровня. В этом разделе описываются проблемы, которые могут повлиять на представление и выходные данные приложения взаимодействия с WPF.

Регионы

В окне верхнего уровня можно представить, что каждый HWND, который представляет собой одну из технологий приложения взаимодействия, имеет собственную область (также называемую "свободное пространство"). Каждый пиксель в окне принадлежит только одному дескриптору HWND, который определяет область этого HWND. (Строго говоря, существует более одной области WPF, если имеется более одного дескриптора HWND WPF, но для целей этого обсуждения можно предположить, что есть только один). Область подразумевает, что все слои или другие окна, которые пытаются отобразиться поверх этого пикселя во время существования приложения, должны быть частью одной и той же технологии уровня отрисовки. Попытка отобразить пиксели WPF поверх Win32 приводит к нежелательным результатам и в максимально возможной степени запрещается через API-интерфейсы взаимодействия.

Примеры областей

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

Пример приложения, которое смешивает Win32, DirectX и WPF.

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

Попытка отрисовки круга WPF через регион Win32.

Другое нарушение — это попытка использовать прозрачность/альфа-смешение между различными технологиями. На следующей иллюстрации окно WPF нарушает области Win32 и DirectX. Так как пиксели в этом окне WPF являются полупрозрачными, они должны принадлежать и DirectX, и WPF, что невозможно. Так что это еще одно нарушение, и его нельзя построить.

Схема, показывающая поле WPF, нарушающее регионы Win32 и DirectX.

В предыдущих трех примерах использовались прямоугольные области, но возможны разные формы. Например, в области может быть отверстие. На следующем рисунке показана область Win32 с прямоугольным отверстием. Это размер областей WPF и DirectX вместе.

Схема, на которую показана область Win32 с прямоугольным отверстием.

Области также могут быть полностью непрямоугольными или иметь любую форму, описываемую Win32 HRGN (область).

Схема, показывающая неректулярную область.

Прозрачность и окна верхнего уровня

Диспетчер окон Windows в действительности обрабатывает только HWND Win32. Таким образом, каждое WPF Window представляет собой HWND. HWND Window должен соответствовать общим правилам для всех дескрипторов. Внутри этого HWND код WPF может выполнять любые операции, поддерживаемые WPF API. Но для взаимодействия с другими HWND на рабочем столе код WPF должен соответствовать правилам обработки и отрисовки Win32. WPF поддерживает непрямоугольные окна с помощью API-интерфейсов Win32 — HRGN для непрямоугольных окон, и многослойные окна для альфа-смешения на уровне отдельных пикселей.

Постоянные альфа- и цветовые ключи не поддерживаются. Возможности многослойных окон Win32 зависят от платформы.

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

WPF поддерживает HRGN. Тем не менее для этой функциональности нет управляемых API. Можно использовать вызов платформы и HwndSource для вызова соответствующего API-интерфейса Win32. Дополнительную информацию см. в разделе Вызов встроенных функций из управляемого кода.

Многослойные окна WPF имеют разные функциональные возможности в различных операционных системах. Это связано с тем, что WPF использует DirectX для отрисовки, а многослойные окна были в первую очередь предназначены для отрисовки GDI, а не DirectX.

  • WPF поддерживает аппаратное ускорение многослойных окон.

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

Дополнительные сведения об ограничениях регионов взаимодействия см. в разделе HWND в WPF.

См. также