Información general sobre destinos de representación

Un destino de representación es un recurso que hereda de la interfaz ID2D1RenderTarget . Un destino de representación crea recursos para dibujar y realiza operaciones de dibujo reales. En este tema se describen los distintos tipos de destinos de representación de Direct2D y cómo usarlos.

Destinos de representación

Un destino de representación es un recurso que hereda de la interfaz ID2D1RenderTarget . Un destino de representación crea recursos para dibujar y realiza operaciones de dibujo reales. Hay varios tipos de destinos de representación que se pueden usar para representar gráficos de las siguientes maneras:

  • Los objetos ID2D1HwndRenderTarget representan el contenido en una ventana.
  • Los objetos ID2D1DCRenderTarget se representan en un contexto de dispositivo GDI.
  • Los objetos de destino de representación de mapa de bits representan el contenido en un mapa de bits fuera de pantalla.
  • Los objetos de destino de representación DXGI se representan en una superficie DXGI para su uso con Direct3D.

Dado que un destino de representación está asociado a un dispositivo de representación determinado, es un recurso dependiente del dispositivo y deja de funcionar si se quita el dispositivo.

Características de destino de representación

Puede especificar si un destino de representación usa la aceleración de hardware y si una pantalla remota se representa mediante un equipo local o remoto. Los destinos de representación se pueden configurar para la representación con alias o suavizado de contorno. Para representar escenas con un gran número de primitivos, un desarrollador también puede representar gráficos 2D en modo con alias y usar suavizado multiample D3D para lograr una mayor escalabilidad.

Los destinos de representación también pueden agrupar las operaciones de dibujo en capas representadas por la interfaz ID2D1Layer . Las capas son útiles para recopilar operaciones de dibujo que se van a componer juntas al representar un marco. En algunos escenarios, esto puede ser una alternativa útil a la representación en un destino de representación de mapa de bits y, a continuación, reutilizar el contenido del mapa de bits, ya que los costos de asignación de capas son menores que para un ID2D1BitmapRenderTarget.

Los destinos de representación pueden crear nuevos destinos de representación compatibles con ellos mismos, lo que resulta útil para la representación intermedia fuera de la pantalla, a la vez que conserva las distintas propiedades de destino de representación que se establecieron en el original.

También es posible representar mediante GDI en un destino de representación de Direct2D llamando a QueryInterface en un destino de representación para ID2D1GdiInteropRenderTarget, que tiene métodos GetDC y ReleaseDC en él que se pueden usar para recuperar un contexto de dispositivo GDI. La representación a través de GDI solo es posible si el destino de representación se creó con la marca D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE establecida. Esto es útil para las aplicaciones que se representan principalmente con Direct2D, pero tienen un modelo de extensibilidad u otro contenido heredado que requiere la capacidad de representar con GDI. Para obtener más información, consulta Introducción a la interoperación de Direct2D y GDI.

Representar recursos de destino

Al igual que un generador, un destino de representación puede crear recursos de dibujo. Los recursos creados por un destino de representación son recursos dependientes del dispositivo (al igual que el destino de representación). Un destino de representación puede crear los siguientes tipos de recursos:

  • Mapas de bits
  • Pinceles
  • Capas
  • Mallas

Comandos de dibujo

Para representar contenido, use los métodos de dibujo de destino de representación. Antes de empezar a dibujar, llame al método ID2D1RenderTarget::BeginDraw . Cuando haya terminado de dibujar, llame al método ID2D1RenderTarget::EndDraw . Entre estas llamadas, se usan métodos Draw y Fill para representar los recursos de dibujo. La mayoría de los métodos Draw y Fill toman una forma (un primitivo o una geometría) y un pincel para rellenar o esquematización de la forma.

Los destinos de representación proporcionan métodos para recortar, aplicar máscaras de opacidad y transformar el espacio de coordenadas.

Direct2D usa un sistema de coordenadas a la izquierda: los valores positivos del eje X continúan hacia abajo y los valores positivos del eje Y.

Tratamiento de errores

Los comandos de dibujo de destino de representación no indican si la operación solicitada se realizó correctamente. Para averiguar si hay errores de dibujo, llame al método Flush de destino de representación o al método EndDraw para obtener un HRESULT.

Ejemplo: Representar contenido en una ventana

En el ejemplo siguiente se usa el método CreateHwndRenderTarget para crear un 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
    );

En el ejemplo siguiente se usa ID2D1HwndRenderTarget para dibujar texto en la ventana.

//  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;
}

El código se ha omitido en este ejemplo.