ICompositionDrawingSurfaceInterop2::CopySurface 方法 (windows.ui.composition.interop.h)
讀取組合繪圖介面的內容 (或組合虛擬繪圖介面) 。
語法
HRESULT CopySurface(
[in] IUnknown *destinationResource,
[in] int destinationOffsetX,
[in] int destinationOffsetY,
[in] const RECT *sourceRectangle
);
參數
[in] destinationResource
類型: IUnknown*
表示將接收復本的 Direct3D 紋理。 您必須已在與 CompositionGraphicsDevice 相關聯的相同 Direct3D 裝置上建立此資源,該裝置是用來建立來源組合繪圖介面 (或組合虛擬繪圖介面) 。
[in] destinationOffsetX
類型: int
位移的 x 座標 (到 destinationResource) 執行複製的位置。 複製作業不會變更此位移上方或左邊的圖元。 自變數不能是負數。
[in] destinationOffsetY
類型: int
位移的 Y 座標 (到 destinationResource) 執行複製的位置。 複製作業不會變更此位移上方或左邊的圖元。 自變數不能是負數。
[in] sourceRectangle
類型: const RECT*
常數 RECT 的選擇性指標,代表要複製之來源介面上的矩形。矩形不能超過來源介面的界限。 若要有足夠的空間來接收要求的圖元,目的地資源必須至少有與 destinationOffsetX 和 Y 參數相同的圖元,加上此矩形的寬度/高度。
如果此參數為 null,則會 (複製整個來源介面,並使用來源介面大小來驗證目的地資源) 的大小。
傳回值
類型: HRESULT
如果 成功,S_OK,否則會傳回 HRESULT 錯誤碼,指出失敗的原因。 另請參閱 COM 錯誤碼 (UI、音訊、DirectX、編解碼器) 。
備註
若要建立 Direct2D 或 Direct3D 介面以搭配 Windows.UI.Composition 使用,您可以使用 組合繪圖介面互通 介面。 您可以使用 CopySurface 方法來讀取組合繪圖介面的內容 (或組合虛擬繪圖介面) 。 CopySurface 是同步且即時的從一部分視訊記憶體複製到另一個部分;您不需要呼叫 Commit。
針對任何指定的組合繪圖介面 (或組合虛擬繪圖介面) ,您的應用程式可以查詢 ICompositionDrawingSurfaceInterop2,並在該介面上呼叫 CopySurface 。
只有在沒有任何屬於相同 CompositionGraphicsDevice 之表面的擱置更新與來源介面 (ICompositionDrawingSurfaceInterop::BeginDraw 具有相同的需求) 時,您才能呼叫 CopySurface。 在從未更新的非虛擬組合繪圖介面上呼叫 CopySurface 也是不合法的,因為其圖元內容未定義。 針對虛擬表面,因為它們是疏鬆配置的,因此可以指定與介面未初始化區域交集的來源矩形。 在此情況下,呼叫是合法的,但未初始化區域的複本結果未定義。
注意
此介面可在 1903 版 Windows 10 1903 (10.0 上使用;組建 18362) ,但未定義於windows.ui.composition.interop.h
該版本的 Windows 軟體開發套件 (SDK) 頭檔中。 如果您先取得 ICompositionDrawingSurfaceInterop 介面的指標,您可以接著透過 QueryInterface) 查詢該 (,以取得 ICompositionDrawingSurfaceInterop2 介面的指標。
範例
在此案例中,我們會建立使用 CompositionDrawingSurface 的架構,以授與將自定義內容轉譯和撰寫至架構所管理的可視化樹狀結構的能力。 架構會實作低資源模式 (,例如,在應用程式最小化或暫停) 期間。 在此模式中時,架構會釋放大部分的組合物件,包括所有介面。 不過,在釋放每個介面之前,架構會擷取其圖元,並將其壓縮 (例如使用 PNG 編解碼器) ,以便稍後重新建構它們,而不需要回呼應用程式程式代碼。 此程式代碼範例示範架構可能會實作的協助程式函式,以處理每個介面。
HRESULT CompressSurface(_In_ ICompositionDrawingSurface* surface)
{
// Get the interop interface.
ComPtr<ICompositionDrawingSurfaceInterop2> surfaceInterop;
RETURN_IF_FAILED(surface.As(&surfaceInterop));
// Allocate a staging surface of equal size to the surface to compress.
SizeInt32 size;
RETURN_IF_FAILED(surface->get_Size(&size));
// Create a staging texture to receive a copy of the pixels.
ComPtr<ID3D11Texture2D> stagingTexture;
RETURN_IF_FAILED(CreateStagingTexture(size, stagingTexture.GetAddressOf()));
// Copy the pixels out.
RETURN_IF_FAILED(surfaceInterop->CopySurface(stagingTexture.get(), 0, 0, nullptr));
// Compress the retrieved pixels.
RETURN_IF_FAILED(CompressTexturePixels(stagingTexture.get()));
return S_OK;
}
HRESULT CreateStagingTexture(const SizeInt32& size, _Outptr_ ID3D11Texture2D** texture)
{
D3D11_TEXTURE2D_DESC surfaceDesc;
surfaceDesc.Width = size.Width;
surfaceDesc.Height = size.Height;
surfaceDesc.MipLevels = 1;
surfaceDesc.ArraySize = 1;
surfaceDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
surfaceDesc.SampleDesc.Count = 1;
surfaceDesc.SampleDesc.Quality = 0;
surfaceDesc.Usage = D3D11_USAGE_STAGING;
surfaceDesc.BindFlags = 0;
surfaceDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
surfaceDesc.MiscFlags = 0;
RETURN_IF_FAILED(g_d3d11Device->CreateTexture2D(surfaceDesc, false, texture));
return S_OK;
}
HRESULT CompressTexturePixels(_In_ ID3D11Texture2D* texture)
{
// ...
// Map the texture, feed the pixels to WIC...
// ...
}
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 10 版本 2004 (10.0;組建 19041) |
最低支援的伺服器 | Windows Server 版本 2004 (10.0;組建 19041) |
目標平台 | Windows |
標頭 | windows.ui.composition.interop.h |