Share via


WPF 互通性:空間與視窗區域概觀

更新:2007 年 11 月

「空間」是互通性的兩個部分如何在通用最上層視窗 (Top-Level Window) 內共用呈現區域的一種概念性思考方式。本主題說明「空間」概念如何影響 WPF 互通性應用程式的展示設計以及輸入考量。

空間

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

空間範例

在第一項範例中,說明混合 Win32、DirectX,和 WPF 的應用程式。每一項技術都使用一組各自分開、不重疊的像素,因此沒有空間問題。

沒有空間問題的視窗

但是假設您從該應用程式開始,並建立由滑鼠指標位置控制的動畫,而可以嘗試呈現在這三個區域任何一個的上方。這項作業最後可能會侵犯空間。不論負責動畫本身的技術為何,該技術都會侵犯另外兩項技術的空間。以下圖片顯示這種情況,其中綠色圓形嘗試在視窗中四處移動:

Interop 圖表

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

Interop 圖表

前述三個範例使用的都是矩形區域,但空間不一定是矩形;它可能是有洞的矩形 (例如,下圖的 Win32 空間包含 WPF 和 DirectX 空間以外的所有區域):

Interop 圖表

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

Interop 圖表

透明度和最上層視窗

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

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

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

WPF 支援 HRGN,但是這項功能沒有 Managed API。您可以使用平台叫用和 HwndSource 呼叫相關的 Win32 API。如需詳細資訊,請參閱從 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 繪圖裝置介面 (GDI) 隱藏層次視窗,接著由 DirectX 進行繪製,然後 Microsoft Windows 繪圖裝置介面 (GDI) 將層次放回原位)。非 WPF 層次視窗也有這項限制。

請參閱

工作

教學課程:建立裝載 WPF 內容的 Win32 應用程式

教學課程:建立裝載 Win32 內容的 WPF 應用程式

概念

WPF 和 Win32 互通性概觀