본문 바로가기
Direct2D

Creating a Simple Direct2D Application (Direct2D 프로그램 만들기)

by leo21c 2014. 6. 24.

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