ID2D1HwndRenderTarget 接口 (d2d1.h)

将绘图指令呈现到窗口。

继承

ID2D1HwndRenderTarget 接口继承自 ID2D1RenderTargetID2D1HwndRenderTarget 也具有以下类型的成员:

方法

ID2D1HwndRenderTarget 接口具有这些方法。

 
ID2D1HwndRenderTarget::CheckWindowState

指示与此呈现目标关联的 HWND 是否被遮挡。
ID2D1HwndRenderTarget::GetHwnd

返回与此呈现目标关联的 HWND。
ID2D1HwndRenderTarget::Resize

将呈现器目标的大小更改为指定的像素大小。 (重载 2/2)
ID2D1HwndRenderTarget::Resize

将呈现器目标的大小更改为指定的像素大小。 (重载 1/2)

注解

与其他呈现目标一样,在发出绘图命令之前,必须调用 BeginDraw 。 完成绘图后,调用 EndDraw 以指示绘图已完成,并释放对支持呈现目标的缓冲区的访问权限。

对于 ID2D1HwndRenderTarget,BeginDraw 的唯一副作用是更改呈现器目标的状态以允许发出绘图命令。

EndDraw 刷新任何批处理的绘图命令。 如果未发生任何错误,则它还会显示缓冲区,从而导致它显示在关联的窗口中。 最后, EndDraw 返回绘制或演示时发生的第一个错误的 HRESULT,以及发生错误时的标记状态。

ID2D1HwndRenderTarget 对象是双重缓冲的,因此发出的绘图命令不会立即显示,而是在屏幕外图面上执行。 调用 EndDraw 时,如果没有呈现错误,则会显示屏幕外缓冲区。 如果 EndDraw 刷新的批处理中存在呈现错误,则不会显示缓冲区,并且应用程序必须调用 BeginDraw 并重新绘制帧。 如果应用程序希望不考虑错误显示帧,则调用 EndDraw 之前,可以使用 Flush 来检查错误。

硬件呈现目标的后台缓冲区是 GetPixelSize 指定的大小。 如果 EndDraw 显示缓冲区,则此位图将拉伸以覆盖呈现该位图的图面:窗口的整个工作区。 如果呈现目标在硬件中呈现,则使用双线性筛选执行此拉伸;如果呈现目标使用软件,则使用最近邻筛选。 (通常,应用程序将调用 Resize 来确保呈现目标的像素大小和目标的像素大小匹配,并且不需要缩放,但这不是要求。)

如果窗口跨适配器,Direct2D 可确保屏幕外呈现目标的部分从正在呈现的适配器复制到需要显示内容的适配器。

如果在应用程序运行时删除了呈现器目标打开的适配器或升级了驱动程序,则 EndDraw 调用中会返回此错误。 在这种情况下,应用程序应根据需要创建新的呈现目标和资源。

创建 ID2D1HwndRenderTarget 对象

若要创建 ID2D1HwndRenderTarget,请使用 ID2D1Factory::CreateHwndRenderTarget 方法。

应用程序应创建呈现目标一次,并在应用程序的生命周期内保留这些目标,或者直到呈现目标的 EndDraw 方法返回 D2DERR_RECREATE_TARGET 错误为止。 收到此错误时,需要重新创建呈现目标 (以及它) 创建的任何资源。

示例

以下示例使用 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;
}

此示例中已省略代码。

要求

要求
最低受支持的客户端 Windows 7、带 SP2 的 Windows Vista 和适用于 Windows Vista 的平台更新 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows Server 2008 R2、Windows Server 2008 SP2 和适用于 Windows Server 2008 的平台更新 [桌面应用 |UWP 应用]
目标平台 Windows
标头 d2d1.h

另请参阅

ID2D1RenderTarget