Condividi tramite


Disegno con Direct2D

Dopo aver creato le risorse grafiche, si è pronti per disegnare.

Disegno di un'ellisse

Il programma Circle esegue una logica di disegno molto semplice:

  1. Riempire lo sfondo con un colore a tinta unita.
  2. Disegnare un cerchio pieno.

screenshot del programma circle.

Poiché la destinazione di rendering è una finestra (anziché una bitmap o un'altra superficie fuori schermo), il disegno viene eseguito in risposta a WM_PAINT messaggi. Il codice seguente illustra la procedura della finestra per il programma 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);
}

Ecco il codice che disegna il cerchio.

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

L'interfaccia ID2D1RenderTarget viene usata per tutte le operazioni di disegno. Il metodo del OnPaint programma esegue le operazioni seguenti:

  1. Il metodo ID2D1RenderTarget::BeginDraw segnala l'inizio del disegno.
  2. Il metodo ID2D1RenderTarget::Clear riempie l'intera destinazione di rendering con un colore a tinta unita. Il colore viene assegnato come struttura D2D1_COLOR_F . È possibile usare la classe D2D1::ColorF per inizializzare la struttura. Per altre informazioni, vedere Uso del colore in Direct2D.
  3. Il metodo ID2D1RenderTarget::FillEllipse disegna un'ellisse riempita, usando il pennello specificato per il riempimento. Un'ellisse viene specificata da un punto centrale e da x e y-radii. Se i raggi x e y sono uguali, il risultato è un cerchio.
  4. Il metodo ID2D1RenderTarget::EndDraw segnala il completamento del disegno per questa cornice. Tutte le operazioni di disegno devono essere inserite tra le chiamate a BeginDraw e EndDraw.

I metodi BeginDraw, Clear e FillEllipse hanno tutti un tipo restituito void . Se si verifica un errore durante l'esecuzione di uno di questi metodi, l'errore viene segnalato tramite il valore restituito del metodo EndDraw . Il CreateGraphicsResources metodo viene illustrato nell'argomento Creazione di risorse Direct2D. Questo metodo crea la destinazione di rendering e il pennello a tinta unita.

Il dispositivo potrebbe memorizzare nel buffer i comandi di disegno e rinviarli fino a quando non viene chiamato EndDraw . È possibile forzare il dispositivo a eseguire qualsiasi comando di disegno in sospeso chiamando ID2D1RenderTarget::Flush. Lo scaricamento può tuttavia ridurre le prestazioni.

Gestione della perdita di dispositivi

Durante l'esecuzione del programma, il dispositivo grafico in uso potrebbe non essere disponibile. Ad esempio, il dispositivo può andare perso se la risoluzione dello schermo cambia o se l'utente rimuove la scheda di visualizzazione. Se il dispositivo viene perso, anche la destinazione di rendering diventa non valida, insieme alle risorse dipendenti dal dispositivo associate al dispositivo. Direct2D segnala un dispositivo perso restituendo il codice di errore D2DERR_RECREATE_TARGET dal metodo EndDraw . Se viene visualizzato questo codice di errore, è necessario ricreare la destinazione di rendering e tutte le risorse dipendenti dal dispositivo.

Per eliminare una risorsa, è sufficiente rilasciare l'interfaccia per tale risorsa.

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

La creazione di una risorsa può essere un'operazione costosa, quindi non ricreare le risorse per ogni messaggio di WM_PAINT . Creare una risorsa una sola volta e memorizzare nella cache il puntatore alla risorsa fino a quando la risorsa non diventa non valida a causa della perdita del dispositivo o fino a quando non è più necessaria tale risorsa.

Ciclo di rendering Direct2D

Indipendentemente da ciò che si disegna, il programma deve eseguire un ciclo simile al seguente.

  1. Creare risorse indipendenti dal dispositivo.
  2. Eseguire il rendering della scena.
    1. Controllare se esiste una destinazione di rendering valida. In caso contrario, creare la destinazione di rendering e le risorse dipendenti dal dispositivo.
    2. Chiamare ID2D1RenderTarget::BeginDraw.
    3. Eseguire comandi di disegno.
    4. Chiamare ID2D1RenderTarget::EndDraw.
    5. Se EndDraw restituisce D2DERR_RECREATE_TARGET, eliminare la destinazione di rendering e le risorse dipendenti dal dispositivo.
  3. Ripetere il passaggio 2 ogni volta che è necessario aggiornare o ridisegnare la scena.

Se la destinazione di rendering è una finestra, il passaggio 2 si verifica ogni volta che la finestra riceve un messaggio di WM_PAINT .

Il ciclo illustrato di seguito gestisce la perdita di dispositivi rimuovendo le risorse dipendenti dal dispositivo e ricreandole all'inizio del ciclo successivo (passaggio 2a).

Prossima

DPI e pixel di Device-Independent