Sdílet prostřednictvím


Rychlý start Direct2D pro Windows 8

Direct2D je rozhraní API nativního a okamžitého režimu pro vytváření 2D grafiky. Toto téma ilustruje, jak kreslit pomocí Direct2D do Windows::UI::Core::CoreWindow.

Toto téma obsahuje následující části:

Kreslení jednoduchého obdélníku

Pokud chcete nakreslit obdélník pomocí GDI, můžete zpracovat WM_PAINT zprávu, jak je znázorněno v následujícím kódu.

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. 

Kód pro kreslení stejného obdélníku s Direct2D je podobný: vytváří prostředky výkresu, popisuje obrazec, který se má nakreslit, nakreslí obrazec a uvolní prostředky výkresu. Následující části popisují jednotlivé kroky podrobně.

Krok 1: Zahrnutí hlavičky Direct2D

Kromě hlaviček požadovaných pro aplikaci zahrňte hlavičky d2d1.h a d2d1_1.h.

Krok 2: Vytvoření ID2D1Factory1

Jednou z prvních věcí, které jakýkoli příklad Direct2D dělá, je vytvoření ID2D1Factory1.

DX::ThrowIfFailed(
        D2D1CreateFactory(
            D2D1_FACTORY_TYPE_SINGLE_THREADED,
            __uuidof(ID2D1Factory1),
            &options,
            &m_d2dFactory
            )
        );

Rozhraní ID2D1Factory1 je výchozím bodem pro použití Direct2D; K vytvoření prostředků Direct2D použijte ID2D1Factory1.

Při vytváření továrny můžete určit, zda je vícevláknová nebo jednovláknová. (Další informace o vícevláknových továrnách najdete v poznámkách na referenční stránce ID2D1Factory.) Tento příklad vytvoří jednovláknovou továrnu.

Obecně platí, že aplikace by měla vytvořit továrnu jednou a zachovat ji po dobu životnosti aplikace.

Krok 3: Vytvoření ID2D1Device a ID2D1DeviceContext

Jakmile vytvoříte továrnu, použijte ji k vytvoření zařízení Direct2D a poté tento zařízení použijte k vytvoření kontextu zařízení Direct2D. Chcete-li vytvořit tyto objekty Direct2D, musíte mít zařízení Direct3D 11 , zařízení DXGI a řetězec pro výměnu DXGI . Informace o vytváření nezbytných požadavků najdete v tématu Zařízení a kontexty zařízení.


    // Obtain the underlying DXGI device of the Direct3D11.1 device.
    DX::ThrowIfFailed(
        m_d3dDevice.As(&dxgiDevice)
        );

    // Obtain the Direct2D device for 2-D rendering.
    DX::ThrowIfFailed(
        m_d2dFactory->CreateDevice(dxgiDevice.Get(), &m_d2dDevice)
        );

    // And get its corresponding device context object.
    DX::ThrowIfFailed(
        m_d2dDevice->CreateDeviceContext(
            D2D1_DEVICE_CONTEXT_OPTIONS_NONE,
            &m_d2dContext
            )
        );

Kontext zařízení je zařízení, které může provádět operace kreslení a vytvářet prostředky výkresu závislé na zařízení, jako jsou štětce. Kontext zařízení můžete také použít k propojení ID2D1Bitmap s povrchem DXGI pro použití jako cílovou plochu vykreslování. Kontext zařízení se může vykreslit pro různé typy cílů.

Kód zde deklaruje vlastnosti bitmapy, která se váže k řetězci prohození DXGI, který se vykreslí na CoreWindow. ID2D1DeviceContext::CreateBitmapFromDxgiSurface metoda získá z povrchu DXGI plochu Direct2D. Výsledkem je, že vše, co je vykresleno do cílového ID2D1Bitmap, je vykresleno na povrch swapchainu.

Jakmile máte tuto plochu Direct2D, použijte metodu ID2D1DeviceContext::SetTarget k jejímu nastavení jako aktivního cíle vykreslování.

    // Now we set up the Direct2D render target bitmap linked to the swapchain. 
    // Whenever we render to this bitmap, it will be directly rendered to the 
    // swapchain associated with the window.
    D2D1_BITMAP_PROPERTIES1 bitmapProperties = 
        BitmapProperties1(
            D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW,
            PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED),
            m_dpi,
            m_dpi
            );

    // Direct2D needs the dxgi version of the backbuffer surface pointer.
    ComPtr<IDXGISurface> dxgiBackBuffer;
    DX::ThrowIfFailed(
        m_swapChain->GetBuffer(0, IID_PPV_ARGS(&dxgiBackBuffer))
        );

    // Get a D2D surface from the DXGI back buffer to use as the D2D render target.
    DX::ThrowIfFailed(
        m_d2dContext->CreateBitmapFromDxgiSurface(
            dxgiBackBuffer.Get(),
            &bitmapProperties,
            &m_d2dTargetBitmap
            )
        );

    // So now we can set the Direct2D render target.
    m_d2dContext->SetTarget(m_d2dTargetBitmap.Get());

Krok 4: Vytvoření štětce

Podobně jako v továrně může kontext zařízení vytvářet prostředky výkresu. V tomto příkladu kontext zařízení vytvoří štětec.

ComPtr<ID2D1SolidColorBrush> pBlackBrush;
DX::ThrowIfFailed(
   m_d2dContext->CreateSolidColorBrush(
        D2D1::ColorF(D2D1::ColorF::Black),
        &pBlackBrush
        )
);

Štětec je objekt, který maluje povrch, například čáru obrazce nebo výplň geometrie. Štětec v tomto příkladu maluje oblast s předdefinovanou plnou barvou, černou.

Direct2D také poskytuje další typy štětců: přechodové štětce pro malování lineárních a paprskových přechodů, rastrový štětec pro malování rastrovými obrázky a vzory a počínaje Windows 8, štětec obrázku pro malování pomocí vykresleného obrázku.

Některá rozhraní API kreslení poskytují pera pro obrysy výkresu a štětce pro vyplňování obrazců. Direct2D se liší: neposkytuje objekt pera, ale používá štětec pro obrysy výkresu a vyplňování obrazců. Při kreslení obrysů použijte rozhraní ID2D1StrokeStyle nebo ve Windows 8 rozhraní ID2D1StrokeStyle1 ve spojení se štětcem pro řízení operací kreslení cesty.

Štětec lze použít pouze s cílem vykreslení, který ho vytvořil, a s jinými cíli vykreslení ve stejné doméně prostředků. Obecně platí, že byste měli vytvořit štětce jednou a uchovávat je po celou dobu životnosti vykreslovacího cíle, který je vytvořil. ID2D1SolidColorBrush je jedinou výjimkou; vzhledem k tomu, že vytváření je relativně levné, můžete vytvořit ID2D1SolidColorBrush pokaždé, když kreslíte rámec, aniž by bylo znatelné snížení výkonu. Můžete také použít jeden ID2D1SolidColorBrush a jen změnit jeho barvu nebo neprůhlednost při každém použití.

Krok 5: Kreslení obdélníku

Potom pomocí kontextu zařízení nakreslete obdélník.

 
m_d2dContext->BeginDraw();

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

DX::ThrowIfFailed(
    m_d2dContext->EndDraw()
);

DX::ThrowIfFailed(
    m_swapChain->Present1(1, 0, &parameters);
);

Metoda DrawRectangle má dva parametry: obdélník, který se má nakreslit, a štětec, který se má použít k vykreslení obrysu obdélníku. Volitelně můžete také zadat šířku tahu, vzorek čáry, typ spojení linií a možnosti zakončení.

Před vydáním příkazů výkresu je nutné volat metodu BeginDraw a po dokončení vydávání příkazů výkresu je nutné volat metodu EndDraw. EndDraw metoda vrátí HRESULT, který označuje, zda příkazy výkresu byly úspěšné. Pokud není úspěšná, vyvolá pomocná funkce ThrowIfFailed výjimku.

Metoda IDXGISwapChain::Present vymění povrch vyrovnávací paměti s povrchem na obrazovce, aby se zobrazil výsledek.

Ukázkový kód

Kód v tomto tématu ukazuje základní prvky aplikace Direct2D. Pro stručnost téma vynechá aplikační architekturu a kód zpracování chyb, který je charakteristický pro dobře napsanou aplikaci.