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 的可选指针,该常量 RECT 表示要复制的源图面上的矩形。矩形不能超过源图面的边界。 为了有足够的空间接收请求的像素,目标资源必须具有至少与 destinationOffsetXY 参数以及此矩形的宽度/高度一样多的像素。

如果此参数为 null,则会 (复制整个源图面,并使用源图面大小来验证目标资源) 的大小。

返回值

类型: HRESULT

S_OK 如果成功,则返回 一个 HRESULT 错误代码,指示失败原因。 另请参阅 COM 错误代码 (UI、音频、DirectX、编解码器)

注解

若要创建用于 Windows.UI.Composition 的 Direct2D 或 Direct3D 图面,请使用合成绘图图面互操作 接口。 可以使用 CopySurface 方法读回合成绘图图面 (或合成虚拟绘图图面) 的内容。 CopySurface 是从视频内存的一部分到另一部分的同步和即时复制;无需调用 Commit

对于任何给定的合成绘图图面 (或合成虚拟绘图图面) ,应用程序可以查询 ICompositionDrawingSurfaceInterop2,并在该接口上调用 CopySurface

仅当与源图面属于同一 CompositionGraphicsDevice 的任何图面没有挂起的更新时,才能调用 CopySurface, (ICompositionDrawingSurfaceInterop::BeginDraw 具有相同的要求) 。 在从未更新过的非虚拟合成绘图图面上调用 CopySurface 也是非法的,因为它的像素内容未定义。 对于虚拟表面,由于分配稀疏,因此可以指定与图面未初始化区域相交的源矩形。 在这种情况下,调用是合法的,但这些未初始化区域的副本结果未定义。

注意

此接口在 Windows 10 版本 1903 (10.0;内部版本 18362) ,但在Windows 软件开发工具包 (Windows SDK) (SDK) 版本的头文件中未定义windows.ui.composition.interop.h。 如果首先获取指向 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

另请参阅