共用方式為


組合介面

注意

針對Windows 10上的應用程式,我們建議使用 Windows.UI.Composition API,而不是 DirectComposition。 如需詳細資訊,請參閱 使用視覺層將傳統型應用程式現代化

本主題描述 Microsoft DirectComposition 支援的介面類別型。

DirectComposition 邏輯介面

DirectComposition 會公開 IDCompositionSurface 物件來表示邏輯組合介面。 DirectComposition 會公開可用來建立、更新和刪除這些邏輯介面的 API。 每個表面都可以與一或多個視覺效果相關聯。 應用程式負責管理邏輯介面的存留期。

更新邏輯介面

應用程式可以呼叫 BeginDraw ,並在應用程式想要更新的邏輯介面上指定矩形的大小和位移,以更新邏輯介面。 DirectComposition 會配置指定大小的矩形,然後傳回介面和應用程式繪製或更新所需的對應位移。 更新矩形的限制是由表面大小所系結。 例如,40 x 100 圖元表面的更新矩形最多可以 (0,0,40,100 個) 。 此外,可更新的區域會由防護矩形強制執行。 因為一次只能有一個防護矩形,所以一次只能更新一個邏輯介面。 如果EndDrawSuspendDraw在先前呼叫BeginDraw之後尚未呼叫,BeginDraw會傳回錯誤碼。 應用程式可以將已認可的呼叫 新增至 BeginDraw 至批次,但在呼叫並認可 EndDraw 之前不會生效。

暫停邏輯介面的更新

需要更新不同表面的應用程式可以在目前的更新上呼叫 SuspendDraw ,然後呼叫 BeginDraw 開始新的更新。 Microsoft DirectComposition 允許多個更新,但一次只能有一個作用中。 這表示您必須在一個介面上呼叫 SuspendDrawEndDraw ,再呼叫下一個介面上的 BeginDraw 。 不同于 EndDraw,已認可的批次可以包含處於 SuspendDraw 狀態的介面,但在呼叫 EndDraw 之前,不會在螢幕上顯示這類更新。

繼續邏輯介面的更新

應用程式可以呼叫ResumeDraw,繼續更新處於SuspendDraw狀態的介面。 這個方法只能在暫停的介面上呼叫。

結束邏輯介面的更新

呼叫 EndDrawCommit 是查看畫面上點陣圖更新變更的唯一方式。 對 EndDraw 的每個呼叫都必須有 對 BeginDraw 的對應呼叫,才能移除防護矩形。 邏輯介面會保留所有更新,直到呼叫 Commit 為止。 您也可以在處於 SuspendDraw狀態的介面上呼叫EndDraw,因為EndDraw是隱含的繼續/結束。 呼叫 EndDraw之後,會將更新的內容呈現至畫面並捨棄,以便更新的記憶體可以重複使用以供稍後更新使用。

使用邏輯介面的範例

下列範例描述如果應用程式建立包含兩個視覺效果的視覺化樹狀結構,然後需要更新與視覺效果相關聯之兩個邏輯介面的特定區域時,應用程式會採取的步驟:

  1. 建立 DirectComposition 裝置。
  2. 建立包含根節點和視覺效果 1 和 2 的視覺化樹狀結構。
  3. 建立邏輯介面 1 和 2。
  4. 呼叫 SetContent 以將邏輯介面與視覺效果 1 和 2 產生關聯。
  5. 在邏輯介面 1 的子矩形上呼叫 BeginDraw
  6. 更新 DirectComposition 所傳回位移處的介面。
  7. 選擇性步驟:
    1. 在邏輯介面 1 上呼叫 SuspendDraw
    2. 在邏輯介面 2 的子矩形上呼叫 BeginDraw
    3. 更新 DirectComposition 所傳回位移處的介面。
    4. 在邏輯介面 2 上呼叫 EndDraw
    5. 在邏輯介面 1 上呼叫 ResumeDraw
  8. 更新 DirectComposition 所傳回位移處的介面。
  9. 在邏輯介面 1 上呼叫 EndDraw
  10. 呼叫 認可

DirectComposition 虛擬介面

DirectComposition 會公開 IDCompositionVirtualSurface 介面來代表虛擬介面,這是邏輯介面的集合, (磚) 以固定大小的磚排列在固定方格中。 應用程式會在建立時指定虛擬紋理的大小。 大小會建立虛擬表面的界限。 介面可以與一或多個視覺效果相關聯。

初始化虛擬表面時,它不會受到實際配置的支援。 換句話說,它不會保留任何位。 DirectComposition 會在應用程式開始更新介面之後,配置磚 (,也就是組合介面物件) 。 應用程式會呼叫 BeginDraw 並指定虛擬表面座標相關的區域,以更新虛擬表面。 然後,DirectComposition 會配置必要的磚來保存更新,並傳回組合介面和要更新的位移。

如同邏輯介面,您可以在虛擬介面上呼叫 BeginDrawSuspendDrawResumeDrawEndDraw 。 此外,DirectComposition 也會公開可用來調整和修剪現有虛擬介面的方法。

調整虛擬介面的大小

Resize方法會變更虛擬表面的界限,這表示任何新的更新或配置都必須落在新大小所設定的界限中。 應用程式會使用 Resize 來告訴 DirectComposition 不再需要虛擬表面的特定區域,而且可以回收。 如果 Resize 會壓縮虛擬表面,應用程式就無法再更新新界限以外的區域。

下圖顯示調整為 2-by-2 的 3 個虛擬表面。 紅色區域代表在調整大小作業中捨棄的磚,而 DirectComposition 會回收記憶體。 調整大小之後,應用程式無法再次更新紅色區域,而無法重新調整虛擬表面的大小。

調整虛擬介面的大小

調整大小作業會立即生效。 DirectComposition 不會等候應用程式呼叫 Commit 進行調整大小更新。 例如,假設應用程式進行下列一連串的呼叫。

pVirtualSurface->Resize(0, 0);
pVirtualSurface->Resize(INT_MAX, INT_MAX);
pDevice->Commit();

在此範例中,應用程式會在第一次調整大小時遺失所有內容。 即使在 Commit之前呼叫第二個調整大小,第二個調整大小也不會有任何作用。 在此情況下,畫面上不會顯示任何內容。

修剪虛擬介面

Trim方法會識別應用程式所需的虛擬表面區域。 它不會調整虛擬表面的界限大小,但會告訴 DirectComposition 目前需要配置哪些邏輯介面。

在下圖中,綠色方塊是應用程式的檢視區。 應用程式一開始會轉譯為虛擬表面的前六個磚 (藍色) , (位於檢視區中的淺灰色) 。 當虛擬表面所代表的頁面捲動時,應用程式必須轉譯最後六個圖格。 應用程式會呼叫 Trim ,指出最後六個磚所定義的區域是內容所在位置,而且目前不需要其餘部分。 DirectComposition 接著可以選擇回收原本代表前六個磚的邏輯表面, (深灰色) 。

修剪虛擬表面

DirectComposition 概念