共用方式為


技術領域概觀

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

地區

您可以在最上層視窗中,將下列作業概念化:每個由交互操作應用程式的技術之一所組成的 HWND 都擁有自己的區域 (亦稱為「空間」)。 視窗內的每個像素只能屬於一個 HWND,其會構成該 HWND 的區域 (嚴格來說,如果有一個以上的 WPF HWND,就會有一個以上的 WPF 區域,但在本討論中,您可以假設只有一個區域。) 區域意謂在應用程式存留期間,嘗試以高於該像素的方式來轉譯的所有層級或其他視窗都必須屬於相同轉譯層技術的一部分。 嘗試以 Win32 轉譯 WPF 像素會產生不理想的結果,因此互通 API 會盡可能避免這種情況發生。

區域範例

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

混合 Win32、DirectX 和 WPF 的應用程式範例。

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

嘗試在 Win32 區域上轉譯 WPF 圓形。

另一項違反是,如果您嘗試在不同技術之間使用透明度/Alpha 透明混色。 在下圖中,WPF 方塊侵犯了 Win32 和 DirectX 區域。 由於 WPF 方塊中的像素是半透明的,必須由 DirectX 和 WPF 共同擁有,但這並不可能。 因此,這是另一項違反且無法建置。

此圖展示了 WPF 方塊侵犯 Win32 和 DirectX 區域的情況。

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

此圖顯示具有矩形孔的 Win32 區域。

區域也可以是非矩形的形狀,或者是任何可由 Win32 HRGN(區域)描述的形狀。

此圖顯示了非矩形區域。

透明度和最上層視窗

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。 如需詳細資訊,請參閱從 Managed 程式碼呼叫原生函式

Win32 分層式視窗的功能依不同作業系統而異。 這是因為 WPF 使用 DirectX 來轉譯,而分層式視窗主要是針對 GDI 轉譯所設計,而非 DirectX 轉譯。

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

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

如需互通操作區域限制的詳細資訊,請參閱 HWNDs inside WPF

另請參閱