呈现目标概述

呈现器目标是继承自 ID2D1RenderTarget 接口的资源。 呈现目标创建用于绘制的资源并执行实际绘制操作。 本主题介绍不同类型的 Direct2D 呈现目标及其使用方法。

呈现目标

呈现器目标是继承自 ID2D1RenderTarget 接口的资源。 呈现目标创建用于绘制的资源并执行实际绘制操作。 有多种类型的呈现目标可用于以下列方式呈现图形:

  • ID2D1HwndRenderTarget 对象将内容呈现到窗口。
  • ID2D1DCRenderTarget 对象呈现到 GDI 设备上下文。
  • 位图呈现目标对象将内容呈现到屏幕外位图。
  • DXGI 呈现目标对象呈现到 DXGI 图面,以便与 Direct3D 一起使用。

由于呈现目标与特定呈现设备相关联,因此它是一个依赖于设备的资源,如果设备被删除,它将停止运行。

呈现目标功能

可以指定呈现目标是否使用硬件加速,以及远程显示是由本地计算机还是远程计算机呈现。 可以为别名或抗锯齿呈现设置呈现目标。 对于具有大量基元的渲染场景,开发人员还可以在别名模式下呈现二维图形,并使用 D3D 多重采样抗锯齿实现更高的可伸缩性。

呈现目标还可以将绘图操作分组到 ID2D1Layer 接口表示的层中。 图层可用于收集在呈现帧时要组合在一起的绘图操作。 在某些情况下,这可以是呈现到位图呈现目标,然后重用位图内容的有用替代方法,因为分层的分配成本低于 ID2D1BitmapRenderTarget

呈现器目标可以创建与自身兼容的新呈现目标,这对于中间屏幕外呈现非常有用,同时保留对原始对象设置的各种呈现目标属性。

还可以通过在 ID2D1GdiInteropRenderTarget 的呈现目标上调用 QueryInterface,在 Direct2D 呈现目标上使用 GDI 呈现,该目标上具有 GetDCReleaseDC 方法,可用于检索 GDI 设备上下文。 仅当创建具有D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE标志的呈现目标时,才能通过 GDI 进行 呈现 。 对于主要使用 Direct2D 呈现但具有扩展性模型或需要能够使用 GDI 呈现的其他旧内容的应用程序,这非常有用。 有关详细信息,请参阅 Direct2D 和 GDI 互操作概述

呈现目标资源

与工厂一样,呈现器目标可以创建绘图资源。 呈现器目标创建的任何资源都是依赖于设备的资源 (就像呈现目标) 一样。 呈现器目标可以创建以下类型的资源:

  • 位图
  • 画笔
  • 图层
  • 网格

绘图命令

若要呈现内容,请使用呈现目标绘图方法。 在开始绘制之前,请调用 ID2D1RenderTarget::BeginDraw 方法。 完成绘图后,调用 ID2D1RenderTarget::EndDraw 方法。 在这些调用之间,可以使用 Draw 和 Fill 方法来呈现绘图资源。 大多数绘制和填充方法采用形状 (基元或几何图形) 以及用于填充或勾勒形状的画笔。

呈现目标提供剪裁、应用不透明蒙板和转换坐标空间的方法。

Direct2D 使用左手坐标系:正 x 轴值继续向右,正 y 轴值继续向下。

错误处理

呈现目标绘图命令不指示请求的操作是否成功。 若要了解是否存在绘图错误,请调用呈现目标 Flush 方法或 EndDraw 方法以获取 HRESULT

示例:将内容呈现到窗口

以下示例使用 CreateHwndRenderTarget 方法创建 ID2D1HwndRenderTarget

RECT rc;
GetClientRect(m_hwnd, &rc);

D2D1_SIZE_U size = D2D1::SizeU(
    rc.right - rc.left,
    rc.bottom - rc.top
    );

// Create a Direct2D render target.
hr = m_pD2DFactory->CreateHwndRenderTarget(
    D2D1::RenderTargetProperties(),
    D2D1::HwndRenderTargetProperties(m_hwnd, size),
    &m_pRenderTarget
    );

下一个示例使用 ID2D1HwndRenderTarget 将文本绘制到窗口。

//  Called whenever the application needs to display the client
//  window. This method writes "Hello, World"
//
//  Note that this function will automatically discard device-specific
//  resources if the Direct3D device disappears during function
//  invocation, and will recreate the resources the next time it's
//  invoked.
//
HRESULT DemoApp::OnRender()
{
    HRESULT hr;

    hr = CreateDeviceResources();

    if (SUCCEEDED(hr))
    {
        static const WCHAR sc_helloWorld[] = L"Hello, World!";

        // Retrieve the size of the render target.
        D2D1_SIZE_F renderTargetSize = m_pRenderTarget->GetSize();

        m_pRenderTarget->BeginDraw();

        m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());

        m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));

        m_pRenderTarget->DrawText(
            sc_helloWorld,
            ARRAYSIZE(sc_helloWorld) - 1,
            m_pTextFormat,
            D2D1::RectF(0, 0, renderTargetSize.width, renderTargetSize.height),
            m_pBlackBrush
            );

        hr = m_pRenderTarget->EndDraw();

        if (hr == D2DERR_RECREATE_TARGET)
        {
            hr = S_OK;
            DiscardDeviceResources();
        }
    }

    return hr;
}

此示例中已省略代码。