Dela via


Ritning med Direct2D

När du har skapat dina grafikresurser är du redo att rita.

Rita en Ellips

Programmet Circle utför mycket enkel ritningslogik:

  1. Fyll bakgrunden med en solid färg.
  2. Rita en fylld cirkel.

en skärmdump av cirkelprogrammet.

Eftersom återgivningsmålet är ett fönster (till skillnad från en bitmapp eller annan offscreen-yta) görs ritningen som svar på WM_PAINT meddelanden. Följande kod visar fönsterproceduren för Circle-programmet.

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

Här är koden som ritar cirkeln.

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

Gränssnittet ID2D1RenderTarget används för alla ritningsåtgärder. Programmets OnPaint metod gör följande:

  1. Metoden ID2D1RenderTarget::BeginDraw signalerar början av ritningen.
  2. Metoden ID2D1RenderTarget::Clear fyller hela återgivningsmålet med en solid färg. Färgen ges som en D2D1_COLOR_F struktur. Du kan använda klassen D2D1::ColorF för att initiera strukturen. För mer information, se Använda färg i Direct2D.
  3. Metoden ID2D1RenderTarget::FillEllipse ritar en fylld ellips med den angivna penseln för fyllningen. En ellips anges av en mittpunkt och x- och y-radii. Om x- och y-radii är desamma blir resultatet en cirkel.
  4. Metoden ID2D1RenderTarget::EndDraw signalerar slutförandet av ritningen för den här ramen. Alla ritningsåtgärder måste placeras mellan anrop till BeginDraw och EndDraw.

Metoderna BeginDraw, Clearoch FillEllipse har alla void returtyp. Om ett fel inträffar under körningen av någon av dessa metoder signaleras felet via returvärdet för metoden EndDraw. Metoden CreateGraphicsResources visas i avsnittet Skapa Direct2D-resurser. Den här metoden skapar renderingmålet och den enfärgade penseln.

Enheten kan buffra ritkommandona och skjuta upp körningen tills EndDraw anropas. Du kan tvinga enheten att köra väntande ritningskommandon genom att anropa ID2D1RenderTarget::Flush. Tömning kan dock minska prestandan.

Hantera enhetsförlust

När programmet körs kan grafikenheten som du använder bli otillgänglig. Enheten kan till exempel gå förlorad om visningsupplösningen ändras eller om användaren tar bort bildskärmskortet. Om enheten går förlorad blir återgivningsmålet också ogiltigt, tillsammans med alla enhetsberoende resurser som har associerats med enheten. Direct2D signalerar en förlorad enhet genom att returnera felkoden D2DERR_RECREATE_TARGET från metoden EndDraw. Om du får den här felkoden måste du återskapa återgivningsmålet och alla enhetsberoende resurser.

Om du vill ta bort en resurs släpper du bara gränssnittet för den resursen.

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

Att skapa en resurs kan vara en dyr åtgärd, så återskapa inte dina resurser för varje WM_PAINT meddelande. Skapa en resurs en gång och cachelagra resurspekaren tills resursen blir ogiltig på grund av enhetsförlust eller tills du inte längre behöver resursen.

Direct2D-återgivningsloopen

Oavsett vad du ritar bör programmet utföra en loop som liknar följande.

  1. Skapa enhetsoberoende resurser.
  2. Återge scenen.
    1. Kontrollera om det finns ett giltigt återgivningsmål. Om inte skapar du återgivningsmålet och de enhetsberoende resurserna.
    2. Anropa ID2D1RenderTarget::BeginDraw.
    3. Utfärda ritningskommandon.
    4. Anropa ID2D1RenderTarget::EndDraw.
    5. Om EndDraw returnerar D2DERR_RECREATE_TARGET, ska renderingsmålet och de enhetsberoende resurserna kasseras.
  3. Upprepa steg 2 när du behöver uppdatera eller rita om scenen.

Om återgivningsmålet är ett fönster inträffar steg 2 när fönstret tar emot ett WM_PAINT meddelande.

Loopen som visas här hanterar enhetsförlust genom att ta bort de enhetsberoende resurserna och återskapa dem i början av nästa loop (steg 2a).

Nästa

DPI och Device-Independent Pixels