Compartir a través de


Dibujo con Direct2D

Después de crear los recursos gráficos, estará listo para dibujar.

Dibujo de una elipse

El programa Circle realiza una lógica de dibujo muy sencilla:

  1. Rellene el fondo con un color sólido.
  2. Dibuja un círculo lleno.

captura de pantalla del programa de círculo.

Dado que el destino de representación es una ventana (en lugar de un mapa de bits u otra superficie fuera de la pantalla), el dibujo se realiza en respuesta a WM_PAINT mensajes. En el código siguiente se muestra el procedimiento de ventana del programa Circle.

LRESULT MainWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_PAINT:
            OnPaint();
            return 0;

         // Other messages not shown...
    }
    return DefWindowProc(m_hwnd, uMsg, wParam, lParam);
}

Este es el código que dibuja el círculo.

void MainWindow::OnPaint()
{
    HRESULT hr = CreateGraphicsResources();
    if (SUCCEEDED(hr))
    {
        PAINTSTRUCT ps;
        BeginPaint(m_hwnd, &ps);
     
        pRenderTarget->BeginDraw();

        pRenderTarget->Clear( D2D1::ColorF(D2D1::ColorF::SkyBlue) );
        pRenderTarget->FillEllipse(ellipse, pBrush);

        hr = pRenderTarget->EndDraw();
        if (FAILED(hr) || hr == D2DERR_RECREATE_TARGET)
        {
            DiscardGraphicsResources();
        }
        EndPaint(m_hwnd, &ps);
    }
}

La interfaz ID2D1RenderTarget se usa para todas las operaciones de dibujo. El método del OnPaint programa hace lo siguiente:

  1. El método ID2D1RenderTarget::BeginDraw señala el inicio del dibujo.
  2. El método ID2D1RenderTarget::Clear rellena todo el destino de representación con un color sólido. El color se da como una estructura D2D1_COLOR_F . Puede usar la clase D2D1::ColorF para inicializar la estructura. Para obtener más información, consulta Usar color en Direct2D.
  3. El método ID2D1RenderTarget::FillEllipse dibuja una elipse rellena, utilizando el pincel especificado para el relleno. Una elipse se especifica mediante un punto central y los radios x e y. Si los radios x e y son iguales, el resultado es un círculo.
  4. El método ID2D1RenderTarget::EndDraw señala la finalización del dibujo para este fotograma. Todas las operaciones de dibujo deben colocarse entre las llamadas a BeginDraw y EndDraw.

Los métodos BeginDraw, Clear y FillEllipse tienen un tipo de valor devuelto void . Si se produce un error durante la ejecución de cualquiera de estos métodos, el error se señala a través del valor devuelto del método EndDraw . El CreateGraphicsResources método se muestra en el tema Creación de recursos de Direct2D. Este método crea el destino de representación y el pincel de color sólido.

El dispositivo podría almacenar en búfer los comandos de dibujo y aplazar su ejecución hasta que se llame a EndDraw . Puede forzar que el dispositivo ejecute los comandos de dibujo pendientes llamando a ID2D1RenderTarget::Flush. Sin embargo, el vaciado puede reducir el rendimiento.

Controlar la pérdida de dispositivos

Mientras se ejecuta el programa, es posible que el dispositivo gráfico que esté usando deje de estar disponible. Por ejemplo, el dispositivo se puede perder si cambia la resolución de pantalla o si el usuario quita el adaptador de pantalla. Si se pierde el dispositivo, el destino de representación también deja de ser válido, junto con los recursos dependientes del dispositivo asociados al dispositivo. Direct2D señala un dispositivo perdido devolviendo el código de error D2DERR_RECREATE_TARGET desde el método EndDraw . Si recibe este código de error, debe volver a crear el destino de representación y todos los recursos dependientes del dispositivo.

Para descartar un recurso, simplemente libere la interfaz de ese recurso.

void MainWindow::DiscardGraphicsResources()
{
    SafeRelease(&pRenderTarget);
    SafeRelease(&pBrush);
}

La creación de un recurso puede ser una operación costosa, por lo que no vuelva a crear los recursos para cada mensaje de WM_PAINT . Cree un recurso una vez y almacene en caché el puntero de recurso hasta que el recurso deje de ser válido debido a la pérdida del dispositivo o hasta que ya no necesite ese recurso.

Bucle de representación de Direct2D

Independientemente de lo que dibuje, el programa debe realizar un bucle similar al siguiente.

  1. Cree recursos independientes del dispositivo.
  2. Representar la escena.
    1. Compruebe si existe un destino de representación válido. Si no es así, cree el destino de representación y los recursos dependientes del dispositivo.
    2. Llame a ID2D1RenderTarget::BeginDraw.
    3. Emitir comandos de dibujo.
    4. Llame a ID2D1RenderTarget::EndDraw.
    5. Si EndDraw devuelve D2DERR_RECREATE_TARGET, descarte el destino de representación y los recursos dependientes del dispositivo.
  3. Repita el paso 2 siempre que necesite actualizar o volver a dibujar la escena.

Si el destino de representación es una ventana, el paso 2 se produce cada vez que la ventana recibe un mensaje de WM_PAINT .

El bucle que se muestra aquí controla la pérdida de dispositivos al descartar los recursos dependientes del dispositivo y volver a crearlos al principio del siguiente bucle (paso 2a).

Siguientes

PPP y píxeles de Device-Independent