技術領域概觀

如果應用程式中使用了多種展示技術 (例如 WPF、Win32 或 DirectX),它們就必須在通用的最上層視窗中共用轉譯區域。 本主題所描述的問題可能會影響您 WPF 交互操作應用程式的展示與輸入。

區域

您可以在最上層視窗中,將下列作業概念化:每個由交互操作應用程式的技術之一所組成的 HWND 都擁有自己的區域 (亦稱為「空間」)。 視窗內的每個像素只能屬於一個 HWND,其會構成該 HWND 的區域 (嚴格來說,如果有一個以上的 WPF HWND,就會有一個以上的 WPF 區域,但針對此討論的目的,您可以假設只有一個。 區域意謂在應用程式存留期間,嘗試以高於該像素的方式來轉譯的所有層級或其他視窗都必須屬於相同轉譯層技術的一部分。 嘗試透過 Win32 轉譯 WPF 圖元會導致不想要的結果,而且不允許盡可能透過交互操作 API。

區域範例

下圖顯示混合 Win32、DirectX 和 WPF 的應用程式。 每一種技術都會使用一組自己個別的非重疊像素,因此不會產生區域問題。

An example of an application that mixes Win32, DirectX, and WPF.

假設此應用程式會使用滑鼠指標位置來建立動畫,此動畫會嘗試透過這三個區域的任一個來轉譯。 無論哪一個技術負責動畫本身,該技術都可能違反其他兩個區域。 下圖顯示嘗試透過 Win32 區域來轉譯 WPF 圓形。

An attempt to render a WPF circle over a Win32 region.

另一項違反是,如果您嘗試在不同技術之間使用透明度/Alpha 透明混色。 在下圖中,WPF 方塊違反 Win32 和 DirectX 區域。 因為該 WPF 方塊中的圖元是半透明,所以它們必須由 DirectX 和 WPF 共同擁有,這是不可能的。 因此,這是另一項違反且無法建置。

Diagram showing a WPF box violating the Win32 and DirectX regions.

前三個範例使用了矩形區域,但可能會有不同的圖形。 例如,區域可以有一個洞。 下圖顯示具有矩形孔的 Win32 區域,這是結合 WPF 和 DirectX 區域的大小。

Diagram that shows a Win32 region with a rectangular hole.

區域也可以完全非條形,或 Win32 HRGN (region) 可描述的任何圖形。

Diagram that shows a nonrectangular region.

透明度和最上層視窗

Windows 中的視窗管理員只會真正處理 Win32 HWND。 因此,每個 WPF Window 都是 HWND。 WindowHWND 必須遵守任何 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。 如需詳細資訊,請參閱從 Managed 程式碼呼叫原生函式

WPF 分層視窗在不同的作業系統上有不同的功能。 這是因為 WPF 會使用 DirectX 來轉譯,而分層視窗主要是針對 GDI 轉譯所設計,而不是 DirectX 轉譯。

  • WPF 支援硬體加速分層視窗。

  • WPF 不支援透明度色彩索引鍵,因為 WPF 無法保證轉譯您要求的確切色彩,尤其是在轉譯為硬體加速時。

另請參閱