Läs på engelska

Dela via


Snabbstart för Direct2D

Direct2D är ett API med inbyggd kod och omedelbart läge för att skapa 2D-grafik. Det här avsnittet visar hur du använder Direct2D i ett typiskt Win32-program för att rita till en HWND-.

Anteckning

Om du vill skapa en Windows Store-app som använder Direct2D läser du snabbstarten Direct2D för Windows 8.

 

Det här avsnittet innehåller följande avsnitt:

Rita en enkel rektangel

Om du vill rita en rektangel med hjälp av GDI-kan du hantera WM_PAINT-meddelandet enligt följande kod.

switch(message)
{

    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            BeginPaint(hwnd, &ps);

            // Obtain the size of the drawing area.
            RECT rc;
            GetClientRect(
                hwnd,
                &rc
            );          

            // Save the original object
            HGDIOBJ original = NULL;
            original = SelectObject(
                ps.hdc,
                GetStockObject(DC_PEN)
            );

            // Create a pen.            
            HPEN blackPen = CreatePen(PS_SOLID, 3, 0);

            // Select the pen.
            SelectObject(ps.hdc, blackPen);

            // Draw a rectangle.
            Rectangle(
                ps.hdc, 
                rc.left + 100, 
                rc.top + 100, 
                rc.right - 100, 
                rc.bottom - 100);   

            DeleteObject(blackPen);

            // Restore the original object
            SelectObject(ps.hdc, original);

            EndPaint(hwnd, &ps);
        }
        return 0;

// Code for handling other messages. 

Koden för att rita samma rektangel med Direct2D liknar den: den skapar ritresurser, beskriver en form att rita, ritar formen och släpper sedan ritningsresurserna. Avsnitten som följer beskriver vart och ett av dessa steg i detalj.

Steg 1: Inkludera Direct2D-rubrik

Förutom de headerfiler som krävs för ett Win32-program, inkluderar du headerfilen d2d1.h.

Steg 2: Skapa ett ID2D1Factory

En av de första sakerna som ett Direct2D-exempel gör är att skapa en ID2D1Factory-.

ID2D1Factory* pD2DFactory = NULL;
HRESULT hr = D2D1CreateFactory(
    D2D1_FACTORY_TYPE_SINGLE_THREADED,
    &pD2DFactory
    );

Gränssnittet ID2D1Factory är startpunkten för att använda Direct2D. använd en ID2D1Factory- för att skapa Direct2D-resurser.

När du skapar en fabrik kan du ange om den är flera eller entrådad. (Mer information om flertrådade fabriker finns i kommentarerna på referenssidan ID2D1Factory.) Det här exemplet skapar en entrådad fabrik.

I allmänhet bör programmet skapa fabriken en gång och behålla den under programmets livslängd.

Steg 3: Skapa en ID2D1HwndRenderTarget

När du har skapat en fabrik använder du den för att skapa ett återgivningsmål.



// Obtain the size of the drawing area.
RECT rc;
GetClientRect(hwnd, &rc);

// Create a Direct2D render target          
ID2D1HwndRenderTarget* pRT = NULL;          
HRESULT hr = pD2DFactory->CreateHwndRenderTarget(
    D2D1::RenderTargetProperties(),
    D2D1::HwndRenderTargetProperties(
        hwnd,
        D2D1::SizeU(
            rc.right - rc.left,
            rc.bottom - rc.top)
    ),
    &pRT
);

Ett återgivningsmål är en enhet som kan utföra ritningsåtgärder och skapa enhetsberoende ritningsresurser, till exempel penslar. Olika typer av återgivningsmål renderas på olika enheter. I föregående exempel används en ID2D1HwndRenderTarget, som renderar till en del av skärmen.

När det är möjligt använder ett återgivningsmål GPU:n för att påskynda återgivningsåtgärderna och skapa ritningsresurser. I annat fall använder återgivningsmålet processorn för att bearbeta återgivningsinstruktioner och skapa resurser. (Du kan ändra det här beteendet med hjälp av D2D1_RENDER_TARGET_TYPE flaggor när du skapar återgivningsmålet.)

Metoden CreateHwndRenderTarget tar tre parametrar. Den första parametern, en D2D1_RENDER_TARGET_PROPERTIES struct, anger alternativ för fjärrvisning, om återgivningsmålet ska framtvingas för återgivning till programvara eller maskinvara och DPI. Koden i det här exemplet använder D2D1::RenderTargetProperties hjälpfunktion för att acceptera standardåtergivningsmålegenskaper.

Den andra parametern, en D2D1_HWND_RENDER_TARGET_PROPERTIES struct, anger HWND- som innehåll återges till, den ursprungliga storleken på återgivningsmålet (i bildpunkter) och dess presentationsalternativ. I det här exemplet används hjälpfunktionen D2D1::HwndRenderTargetProperties för att ange en HWND och initial storlek. Den använder standardalternativ för presentation.

Den tredje parametern är adressen till pekaren som tar emot återgivningsmålreferensen.

När du skapar ett återgivningsmål och maskinvaruacceleration är tillgängligt allokerar du resurser på datorns GPU. Genom att skapa ett återgivningsmål en gång och behålla det så länge som möjligt får du prestandafördelar. Ditt program bör skapa återgivningsmål en gång och hålla fast vid dem under programmets livslängd eller tills D2DERR_RECREATE_TARGET-felet tas emot. När du får det här felet måste du återskapa återgivningsmålet (och eventuella resurser som det har skapat).

Steg 4: Skapa en pensel

Precis som en fabrik kan ett återgivningsmål skapa ritningsresurser. I det här exemplet skapar återgivningsmålet en pensel.

ID2D1SolidColorBrush* pBlackBrush = NULL;
if (SUCCEEDED(hr))
{
            
    pRT->CreateSolidColorBrush(
        D2D1::ColorF(D2D1::ColorF::Black),
        &pBlackBrush
        ); 
}

En pensel är ett objekt som målar ett område, till exempel formens linje eller fyllning av en geometri. Penseln i det här exemplet målar ett område med en fördefinierad solid färg, svart.

Direct2D innehåller även andra typer av penslar: toningsborstar för att måla linjära och radiella toningar och en bitmappsborste för målning med bitmappar och mönster.

Vissa rit-API:er innehåller pennor för att rita konturer och penslar för att fylla i former. Direct2D är annorlunda: det ger inte ett pennobjekt, men använder en pensel för att rita konturer och fylla former. När du ritar omrissningar använder du gränssnittet ID2D1StrokeStyle med en pensel för att kontrollera linjeföringsåtgärder.

En pensel kan bara användas med återgivningsmålet som skapade det och med andra återgivningsmål i samma resursdomän. I allmänhet bör du skapa penslar en gång och behålla dem under hela återgivningsmålet som skapade dem. ID2D1SolidColorBrush är det enda undantaget; eftersom det är relativt billigt att skapa kan du skapa en ID2D1SolidColorBrush varje gång du ritar en ram, utan någon märkbar prestandaträff. Du kan också använda en enda ID2D1SolidColorBrush och bara ändra dess färg varje gång du använder den.

Steg 5: Rita rektangeln

Använd sedan återgivningsmålet för att rita rektangeln.

 
pRT->BeginDraw();

pRT->DrawRectangle(
    D2D1::RectF(
        rc.left + 100.0f,
        rc.top + 100.0f,
        rc.right - 100.0f,
        rc.bottom - 100.0f),
        pBlackBrush);

HRESULT hr = pRT->EndDraw();  

Metoden DrawRectangle tar två parametrar: rektangeln som ska ritas och penseln som ska användas för att måla rektangelns kontur. Du kan också ange alternativ för linjebredd, streckmönster, linjekoppling och slutgräns.

Du måste anropa metoden BeginDraw innan du utfärdar några ritkommandon, och du måste anropa metoden EndDraw när du har utfärdat ritkommandon. Metoden EndDraw returnerar en HRESULT- som anger om ritkommandona lyckades.

Steg 6: Frigöra resurser

När det inte finns fler bildrutor att rita, eller när du får D2DERR_RECREATE_TARGET-felet, släpper du återgivningsmålet och alla enheter som det har skapat.

 
SafeRelease(pRT);
SafeRelease(pBlackBrush);

När ditt program har slutat använda Direct2D-resurser (till exempel när det är på väg att avslutas) ska du släppa Direct2D-fabriken.

 
SafeRelease(pD2DFactory);

Skapa ett enkelt Direct2D-program

Koden i det här avsnittet visar de grundläggande elementen i ett Direct2D-program. I korthet utelämnar ämnet programramverket och felhanteringskoden som är kännetecknande för ett välskrivet program. En mer detaljerad genomgång som visar den fullständiga koden för att skapa ett enkelt Direct2D-program och demonstrerar metodtips finns i Skapa ett enkelt Direct2D-program.

Skapa ett enkelt Direct2D-program