共用方式為


技術領域概觀

如果在應用程式中使用了多項展示技術,例如 WPF、Win32 或 DirectX,則這些技術必須共用通用最上層視窗內的轉譯區域。 本主題說明可能會影響 WPF 互通性應用程式之展示和輸入的問題。

區域

在最上層視窗內,您可以將組成其中一種互通性應用程式技術的每個 HWND,想像成各自擁有自己的區域 (也稱為「空間」)。 視窗內的每個像素各屬於一個 HWND,也構成該 HWND 的區域 (嚴格來說,如果有一個以上的 WPF HWND,則 WPF 區域也會超過一個,但是為了進行以下討論,可以假設只有一個這種區域)。 這種區域表示,嘗試在應用程式存留期期間呈現在像素上方的所有分層或其他視窗,全都必須是相同呈現層級技術的一部分。 嘗試將 WPF 像素呈現在 Win32 上會造成非預期的結果,因此互通性 APIs 盡可能阻止這項嘗試。

區域範例

下圖顯示混合了 Win32、DirectX 和 WPF 的應用程式。 每一項技術都使用一組各自分開、不重疊的像素,因此沒有區域問題。

沒有空間問題的視窗

假設這個應用程式使用滑鼠指標位置來建立嘗試在這三個區域任何一個上方呈現的動畫。 不論負責動畫本身的技術為何,該技術都會侵犯另外兩項技術的區域。 下圖顯示嘗試在 Win32 區域上呈現 WPF 圓形時的情況。

Interop 圖表

另一種違規情形是您嘗試在不同的技術之間使用透明度/Alpha 透明混色。 在下圖中,WPF 方塊違反 Win32 和 DirectX 區域。 因為該 WPF 方塊的像素呈半透明狀,所以必須由 DirectX 和 WPF 共同擁有,但這是不可能的。 因此這是另一項無法建置的違規情況。

Interop 圖表

前述三個範例使用的都是矩形區域,但也可能是其他形狀。 例如,區域可以有洞。 下圖顯示的 Win32 區域具有矩形洞,大小為 WPF 和 DirectX 區域的結合。

Interop 圖表

區域也可能完全不是矩形,或是能以 Win32 HRGN (區域) 描述的任何形狀。

Interop 圖表

透明度和最上層視窗

Windows 中的視窗管理員實際上只會處理 Win32 HWND。 因此,每個 WPF Window 都是一個 HWND。 Window HWND 必須遵守任何 HWND 的一般規則。 在該 HWND 中,WPF APIs 支援的事情 WPF 程式碼都能做。 但對於在桌面上和其他 HWND 互動方面,WPF 必須遵從 Win32 處理和呈現規則。 WPF 使用 Win32 APIs 支援非矩形視窗,以 HRGN 支援非矩形視窗,以層次視窗支援每像素 Alpha 值。

常數 Alpha 和色彩鍵則不支援。 Win32 層次視窗功能依平台而不同。

層次視窗可以透過指定要套用到視窗中各個像素的 Alpha 值,將整個視窗變成半透明 (雖然 Win32 實際上可支援每像素 Alpha 值,但是在實際的程式中,要使用這項功能非常困難,因為在這種模式下,您必須自行繪製任何子 HWND,包括對話方塊和下拉式清單)。

WPF 支援 HRGN,但是這項功能沒有 Managed APIs。 您可以使用平台叫用和 HwndSource 呼叫相關的 Win32 APIs。 如需詳細資訊,請參閱從 Managed 程式碼呼叫原生函式

WPF 層次視窗在不同的作業系統上具有不同的功能。 這是因為 WPF 使用 DirectX 來呈現,而層次視窗主要是針對 GDI 呈現所設計,而非 DirectX 呈現。

  • 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 層次視窗也有這項限制。

請參閱

工作

逐步解說:在 Win32 中裝載 WPF 時鐘

在 WPF 中裝載 Win32 內容

概念

WPF 和 Win32 互通