技术区域概述

如果在应用程序(如 WPF、Win32 或 DirectX)中使用了多个呈现技术,则必须在公共顶级窗口中共享呈现区域。 本主题介绍可能影响 WPF 互作应用程序的演示文稿和输入的问题。

区域

在顶级窗口中,可以想象每个由互操作应用程序技术构成的 HWND 都有自己的区域(也称为“空域”)。 窗口中的每个像素都只属于一个 HWND,该 HWND 所构成的就是其区域。 (严格来说,如果有多个 WPF HWND,那么就有多个 WPF 区域,但为了方便本次讨论,可以假设只有一个)。 该区域意味着在应用程序生存期内尝试呈现在该像素之上的所有层或其他窗口都必须属于同一呈现级技术。 尝试在 Win32 上呈现 WPF 像素会导致不良结果,并且通过互操作 API 尽可能避免这种情况。

区域示例

下图显示了混合 Win32、DirectX 和 WPF 的应用程序。 每个技术都使用其自己的独立、非重叠的像素集,并且没有区域问题。

混合 Win32、DirectX 和 WPF 的应用程序示例。

假设此应用程序使用鼠标指针位置创建一个动画,该动画尝试在这三个区域中的任何一个上呈现。 无论哪个技术对动画本身负责,这项技术都会违反另外两个区域。 下图显示了尝试在 Win32 区域上呈现 WPF 圆圈。

尝试在 Win32 区域上呈现 WPF 圆圈。

另一种违规是,如果尝试在不同的技术之间使用透明度/阿尔法混合。 下图中,WPF 框违反了 Win32 和 DirectX 区域。 由于该 WPF 框中的像素是半透明的,因此它们必须由 DirectX 和 WPF 共同拥有,这是不可能的。 因此,这是另一个违规,无法建造。

显示违反 Win32 和 DirectX 区域的 WPF 框的关系图。

前面的三个示例使用了矩形区域,但可以采用不同的形状。 例如,某个区域可以有一个洞。 下图显示了包含矩形孔的 Win32 区域,这是组合的 WPF 和 DirectX 区域的大小。

显示 Win32 区域内具有矩形孔的示意图。

区域不仅可以是完全非矩形的,还可以是由 Win32 HRGN(区域)描述的任何形状。

显示非矩形区域的图。

透明度和 Top-Level 窗口

Windows 中的窗口管理器仅真正处理 Win32 HWND。 因此,每个 WPF Window 都是 HWND。 Window HWND 必须遵守任何 HWND 的一般规则。 在该 HWND 中,WPF 代码能够执行所有 WPF API 所支持的操作。 但是,为了与桌面上的其他 HWND 交互,WPF 必须遵守 Win32 处理和呈现规则。 WPF 通过使用 Win32 API(非矩形窗口的 HRGN)和每像素 alpha 的分层窗口支持非矩形窗口。

不支持常量 alpha 键和颜色键。 Win32 分层窗口功能因平台而异。

分层窗口可以通过指定要应用于窗口中的每个像素的 alpha 值,使整个窗口变透明(半透明)。 (Win32 实际上支持每像素 alpha,但由于在这种模式下你需要自己手动绘制包括对话框和下拉列表在内的所有子 HWND,因此在实际程序中使用起来非常困难)。

WPF 支持 HRGN;但是,此功能没有托管 API。 可以使用平台调用并 HwndSource 调用相关的 Win32 API。 有关详细信息,请参阅 从托管代码调用本机函数

WPF 分层窗口在不同作系统上具有不同的功能。 这是因为 WPF 使用 DirectX 来呈现,分层窗口主要用于 GDI 呈现,而不是 DirectX 呈现。

  • WPF 支持硬件加速分层窗口。

  • WPF 不支持透明度颜色键,因为 WPF 无法保证呈现所请求的确切颜色,尤其是在呈现硬件加速时。

有关互操作区域限制的详细信息,请参阅 WPF 中的 HWND

另请参阅