Creating a Simple Direct2D Application
<참고> http://msdn.microsoft.com/en-us/library/windows/desktop/dd370994(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/dd317121(v=vs.85).aspx
1. include header, dll or lib load
Direct2D 헤더 파일과 DLL을 load 한다.
Windows Vista SP2 부터 Direct2D가 정상적으로 지원된다. 그 이전 OS 특히 XP는 지원하지 않는 것을 잊지 말자.
#include <D2D1.h>
#include <D2D1Helper.h>
#pragma comment(lib, "d2d1.lib")
2. Create inline release function
Direct2D에서 사용되는 Object를 삭제할 때 사용하는 inline template 함수이다.
DirectX는 COM 인터페이스로 되어 있다. 따라서 C++ new로 객체를 생성하지 않는다. 또한 delete로 삭제하지 않고 인터페이스의 Release 함수를 이용한다.
template<class Interface>
inline void SafeRelease(Interface **ppInterfaceToRelease)
{
if (*ppInterfaceToRelease != NULL)
{
(*ppInterfaceToRelease)->Release();
(*ppInterfaceToRelease) = NULL;
}
}
3. Create ID2D1Factory
Direct2D API의 root는 ID2D1Factory and ID2D1Resource interfaces이다. Direct2D를 사용하기 위한 시작점으로 두 인터페이스가 사용된다. 예제는 간단한 도형을 그리는 것이기 때문에 ID2D1Factory를 생성한다.
ID2D1Factory *tpD2DFactory; // ID2D1Factory object pointer 선언
::D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &tpD2DFactory);
4. Create RenderTarget
Render target은 ID2D1RenderTarget interface로부터 상속받은 리소스다. 간단히 말해서 그림을 그리는 곳을 가르키는 Object를 만드는 것이다. Form을 타겟으로 할 수도 있고 Bitmap의 Canvas를 타겟으로 할 수도 있다.
MSDN을 참고하면 나오지만 Bitmaps, Brushes, Layers, Meshes 등의 리소스 타입을 타겟으로 생성할 수 있다.
ID2D1DCRenderTarget *tpDCRenderTarget; //Render target object pointer 선언
D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(
// The render target should use hardware rendering if it is available.
D2D1_RENDER_TARGET_TYPE_DEFAULT,
// Create a pixel format and initial its format and alphaMode fields.
D2D1::PixelFormat(
DXGI_FORMAT_B8G8R8A8_UNORM, //with alphaMode fields.
D2D1_ALPHA_MODE_IGNORE),
0,
0,
D2D1_RENDER_TARGET_USAGE_NONE,
D2D1_FEATURE_LEVEL_DEFAULT
);
tpD2DFactory->CreateDCRenderTarget(&props, &tpDCRenderTarget);
<참조, D2D1_RENDER_TARGET_PROPERTIES structure>
http://msdn.microsoft.com/en-us/library/windows/desktop/dd368155(v=vs.85).aspx
5. Create ID2D1PathGeometry
Paint 함수에서 Curve 등 기타 Draw를 진행하기 위해서 생성.
ID2D1PathGeometry *geometry;
hr = tpD2DFactory->CreatePathGeometry(&geometry)
6. Draw Geometry
도형을 그리기 위해 생성.
ID2D1Brush * blackBrush;
FLOAT strokeWidth;
ID2D1StrokeStyle *strokeStyle;
D2D_COLOR_F penColor;
// Dash array for dashStyle D2D1_DASH_STYLE_CUSTOM
float dashes[] = {1.0f, 2.0f, 2.0f, 3.0f, 2.0f, 2.0f};
penColor = D2D1::ColorF(D2D1::ColorF(D2D1::ColorF::Black, 1.0f));
tpRenderTarget->CreateSolidColorBrush(penColor, &blackBrush);
hr = m_pD2DFactory->CreateStrokeStyle(
D2D1::StrokeStyleProperties(
D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_ROUND,
D2D1_LINE_JOIN_MITER,
10.0f,
D2D1_DASH_STYLE_CUSTOM,
0.0f),
dashes,
ARRAYSIZE(dashes),
&m_pStrokeStyleCustomOffsetZero
);
tpDCRenderTarget->BeginDraw();
ID2D1GeometrySink *pSink = NULL;
geometry->Open(&pSink);
pSink->SetFillMode(D2D1_FILL_MODE_WINDING);
pSink->BeginFigure(
D2D1::Point2F(408,182),
D2D1_FIGURE_BEGIN_HOLLOW
);
pSink->AddBezier(
D2D1::BezierSegment(
D2D1::Point2F(408,182),
D2D1::Point2F(416,184),
D2D1::Point2F(422,178)
));
pSink->AddBezier(
D2D1::BezierSegment(
D2D1::Point2F(428,171),
D2D1::Point2F(435,173),
D2D1::Point2F(435,173)
));
pSink->EndFigure(D2D1_FIGURE_END_OPEN);
pSink->Close();
SafeRelease(&pSink);
DCRenderTarget->DrawGeometry(geometry, blackBrush, strokeWidth, strokeStyle);
tpDCRenderTarget->EndDraw();
SafeRelease(&blackBrush);
7. Release resources
생성한 Object를 모두 Release한다.
SafeRelease(&geometry);
SafeRelease(&tpDCRenderTarget);
SafeRelease(&tpD2DFactory);
<참고>Path Geometries Overview
http://msdn.microsoft.com/en-us/library/windows/desktop/ee264309(v=vs.85).aspx
'Direct2D' 카테고리의 다른 글
"Hello, World" by Direct2D (0) | 2014.07.09 |
---|---|
Improving the performance of Direct2D apps (0) | 2014.06.24 |
About Direct2D (Direct2D란?) (0) | 2014.06.24 |
Direct2D API Overview (1) | 2014.06.12 |