IDCompositionDevice::CreateVirtualSurface 方法 (dcomp.h)

创建可与一个或多个视觉对象关联的稀疏填充图面,以便进行合成。

语法

HRESULT CreateVirtualSurface(
  [in]  UINT                        initialWidth,
  [in]  UINT                        initialHeight,
  [in]  DXGI_FORMAT                 pixelFormat,
  [in]  DXGI_ALPHA_MODE             alphaMode,
  [out] IDCompositionVirtualSurface **virtualSurface
);

参数

[in] initialWidth

类型: UINT

图面的宽度(以像素为单位)。 最大宽度为 16,777,216 像素。

[in] initialHeight

类型: UINT

图面的高度(以像素为单位)。 最大高度为 16,777,216 像素。

[in] pixelFormat

类型: DXGI_FORMAT

图面的像素格式。

[in] alphaMode

类型: DXGI_ALPHA_MODE

如果像素格式包含 alpha 通道,则 alpha 通道的含义。 可以为下列值之一:

含义
DXGI_ALPHA_MODE_UNSPECIFIED
未指定 alpha 通道。 此值与 DXGI_ALPHA_MODE_IGNORE 具有相同的效果。
DXGI_ALPHA_MODE_PREMULTIPLIED
颜色通道包含与 alpha 通道预乘的值。
DXGI_ALPHA_MODE_IGNORE
应忽略 alpha 通道,并且位图应不透明呈现。

[out] virtualSurface

类型: IDCompositionVirtualSurface**

新创建的 Surface 对象。 此参数不能为 NULL。

返回值

类型: HRESULT

如果函数成功,则返回S_OK。 否则,将返回 HRESULT 错误代码。 有关错误代码列表,请参阅 DirectComposition 错误代码。

注解

Microsoft DirectComposition 稀疏图面是一个逻辑对象,其行为类似于像素的矩形数组,可以与视觉对象关联进行组合。 对于其每个像素,图面不一定由任何物理视频或系统内存提供支持。 应用程序可以在不同时间实现或虚拟化逻辑图面的各个部分。

新创建的 Surface 对象处于未初始化状态。 虽然图面未初始化,但对可视化树的组成没有影响。 它的行为与使用 100% 透明像素初始化的图面完全相同。

若要使用像素数据初始化图面,请使用 IDCompositionSurface::BeginDraw 方法。 此方法不仅为图面提供像素,而且还为这些像素分配实际存储空间。 内存分配将一直保留,直到应用程序将部分内存返回到系统。 应用程序可以通过调用 IDComposition::VirtualSurfaceTrim 方法释放部分或全部分配的内存。

DirectComposition 图面支持以下像素格式:

  • DXGI_FORMAT_B8G8R8A8_UNORM
  • DXGI_FORMAT_R8G8B8A8_UNORM
  • DXGI_FORMAT_R16G16B16A16_FLOAT
如果 initialWidthinitialHeight 超过 16,777,216 像素,此方法将失败。

示例

以下示例演示如何创建虚拟表面并将其与视觉对象相关联。

HRESULT RenderAVisual(IDCompositionDevice *pDCompDevice, HWND hwndTarget,
                         UINT surfaceWidth, UINT surfaceHeight) 
{
    // Validate the input parameters.
    if (pDCompDevice == nullptr || hwndTarget == NULL)
        return E_INVALIDARG;
    
    HRESULT hr = S_OK;
    IDCompositionTarget *pTargetWindow = nullptr;
    IDCompositionVisual *pVisual = nullptr;
    IDCompositionVirtualSurface *pVirtualSurface = nullptr;
    ID3D10Texture2D *pTex2D = nullptr;
    POINT offset = {0};

    // Create the rendering target. 
    hr = pDCompDevice->CreateTargetForHwnd(hwndTarget, TRUE, &pTargetWindow);

    if (SUCCEEDED(hr))
    {
        // Create a visual.
        hr = pDCompDevice->CreateVisual(&pVisual);
    }

    if (SUCCEEDED(hr))
    {
        // Add the visual to the root of the composition tree.
        hr = pTargetWindow->SetRoot(pVisual);
    }

    if (SUCCEEDED(hr))
    {
        // Create a virtual surface.
        hr = pDCompDevice->CreateVirtualSurface(surfaceWidth, surfaceHeight, 
            DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ALPHA_MODE_IGNORE, 
            &pVirtualSurface);
    }

    if (SUCCEEDED(hr))
    {
        // Set the virtual surface as the content of the visual.
        hr = pVisual->SetContent(pVirtualSurface);
    }
    
    if (SUCCEEDED(hr))
    {
        // Retrieve and interface pointer for draw on the surface.
        hr = pVirtualSurface->BeginDraw(NULL, __uuidof(ID3D10Texture2D), 
            (void **) &pTex2D, &offset);
    }

    //
    // TODO: Draw on the surface.
    //
    
    if (SUCCEEDED(hr))
    {
        // Complete the updates to the surface.
        hr = pVirtualSurface->EndDraw();
    }

    // Commit the composition for rendering.
    hr = pDCompDevice->Commit();

    // Clean up.
    SafeRelease(&pTargetWindow);
    SafeRelease(&pVisual);
    SafeRelease(&pVirtualSurface);
    SafeRelease(&pTex2D);

    return hr;

}

要求

要求
最低受支持的客户端 Windows 8 [仅限桌面应用]
最低受支持的服务器 Windows Server 2012 [仅限桌面应用]
目标平台 Windows
标头 dcomp.h
Library Dcomp.lib
DLL Dcomp.dll

另请参阅

IDCompositionDevice

IDCompositionDevice::CreateSurface