Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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:
- nakreslení jednoduchého obdélníku
- Krok 1: Přidání záhlaví Direct2D
- Krok 2: Vytvořte ID2D1Factory1
- Krok 3: Vytvoření id2D1Device a id2D1DeviceContext
- krok 4: Vytvoření štětce
- Krok 5: Nakreslete obdélníkový
- ukázkového kódu
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, ¶meters);
);
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.