Общие сведения об областях применения технологий
Если в приложении используется несколько технологий представления, например, WPF, Win32 и DirectX, они должны совместно использовать области визуализации в общем окне верхнего уровня. В этом разделе рассматриваются проблемы, которые могут оказывать влияние на визуализацию и выходные данные взаимодействующего приложения WPF.
Области
В окне верхнего уровня каждый дескриптор HWND, который обозначает одну из технологий взаимодействующего приложения, имеет собственную область (также называемую "airspace"). Каждый пиксель в окне принадлежит ровно одному дескриптору HWND, который определяет область для этого HWND (строго говоря, при наличии нескольких дескрипторов HWND WPF существует несколько областей WPF; однако в целях данного материала предполагается, что имеется только одна область). Область подразумевает, что все уровни или другие окна, которые могут отображаться над этим пикселем во время существования приложения, должны быть частью одной и той же технологии уровня визуализации. Отображение точек WPF над Win32 приводит к нежелательным результатам и настоятельно не рекомендуется при взаимодействии с APIs.
Примеры областей
На следующем рисунке показано приложение, в котором одновременно используются технологии Win32, DirectX и WPF. В каждой технологии используется собственный отдельный, неперекрывающийся набор пикселей, поэтому проблемы областей отсутствуют.
Предположим, что в приложении используется позиция указателя мыши для создания анимации, которая пытается выполнить визуализацию в любой из трех областей. Независимо от того, какая технология применяется для анимации, ее использование приведет к нарушению областей двух других технологий. На следующем рисунке показана попытка отобразить круг WPF в области Win32.
Другим примером нарушения областей является применение эффектов прозрачности или альфа-смешения между различными технологиями. На следующем рисунке поле WPF нарушает области Win32 и DirectX. Поскольку точки в этом поле WPF являются полупрозрачными, они должны принадлежать DirectX и WPF, что невозможно. Это приводит к нарушению областей и невозможности построения приложения.
В трех предыдущих примерах используются прямоугольные области, однако форма областей может быть произвольной. Например, в области может присутствовать отверстие. На следующем рисунке показана область Win32 с прямоугольным отверстием, в котором помещаются области WPF и DirectX.
Области могут быть полностью непрямоугольными или иметь произвольную форму, описываемую дескриптором региона HRGN Win32.
Прозрачность и окна верхнего уровня
Диспетчер окон Windows в действительности поддерживает обработку только дескрипторов HWND Win32. Поэтому каждый объект Window системы WPF является дескриптором HWND. Дескриптор HWND Window должен соответствовать общим правилам, установленным для дескрипторов HWND. В коде WPF этого дескриптора HWND могут выполняться любые операции, поддерживаемые в WPF APIs. Однако для взаимодействия с другими дескрипторами HWND на рабочем столе в WPF должны соблюдаться правила обработки и отрисовки Win32. В WPF реализуется поддержка непрямоугольных окон с помощью дескрипторов HRGN Win32 APIs, а также поддержка многоуровневых окон для попиксельной альфа-версии.
Постоянные ключевые альфа-значения и значения цвета не поддерживаются. Возможности многоуровневых окон в Win32 зависят от платформы.
Использование многоуровневых окон позволяет сделать все окно прозрачным (полупрозрачным), указав альфа-значение, которое применяется к каждой точке окна. (В Win32 фактически поддерживается поточечное альфа-смешение. Однако на практике этот режим очень трудно использовать, поскольку в нем необходимо вручную рисовать дескриптор HWND каждого дочернего окна, включая диалоговые окна и раскрывающиеся меню.)
В WPF поддерживаются дескрипторы HRGN, однако для них не предусмотрены управляемые интерфейсы APIs. Можно использовать вызов неуправляемого кода и класс HwndSource для вызова соответствующего интерфейса Win32 APIs. Дополнительные сведения см. в разделе Вызов неуправляемых функций из управляемого кода.
Многоуровневые окна WPF поддерживают различные возможности в разных операционных системах. Это происходит потому, что WPF использует DirectX для визуализации, а многоуровневые окна в первую очередь предназначены не для визуализации DirectX, а для визуализации GDI.
WPF поддерживает аппаратное ускорение многоуровневых окон в операционной системе Windows Vista или более поздних версиях. Аппаратное ускорение многоуровневых окон в Microsoft Windows XP требует поддержки Microsoft DirectX, поэтому доступные возможности будут зависеть от версии Microsoft DirectX, установленной на компьютере.
В WPF не поддерживаются ключевые значения прозрачности цвета, поскольку в WPF не обеспечивается гарантированную точечную отрисовку необходимого цвета, особенно при использовании аппаратного ускорения.
Если приложение выполняется в операционной системе Microsoft Windows XP, многоуровневые окна, расположенные над поверхностями DirectX, мерцают при отображении приложения DirectX. (Используется следующая фактическая последовательность отрисовки: многоуровневое окно скрывается в Microsoft Windows Graphics Device Interface (GDI), после чего оно отрисовывается в DirectX и повторно отображается в Microsoft Windows Graphics Device Interface (GDI).) Это ограничение также распространяется на многоуровневые окна, отличные от WPF.
См. также
Задачи
Пошаговое руководство. Размещение часов WPF в Win32
Размещение содержимого Win32 в WPF