Direct2D 빠른 시작

Direct2D는 2D 그래픽을 만들기 위한 네이티브 코드 즉시 모드 API입니다. 이 항목에서는 일반적인 Win32 애플리케이션 내에서 Direct2D를 사용하여 HWND에 그리는 방법을 보여 줍니다.

참고

Direct2D를 사용하는 Windows 스토어 앱을 만들려면 Windows 8 대한 Direct2D 빠른 시작을 참조하세요.

 

이 항목에는 다음과 같은 섹션이 포함되어 있습니다.

간단한 사각형 그리기

GDI를 사용하여 사각형을 그리려면 다음 코드와 같이 WM_PAINT 메시지를 처리할 수 있습니다.

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. 

Direct2D를 사용하여 동일한 사각형을 그리는 코드는 유사합니다. 그리기 리소스를 만들고, 그릴 셰이프를 설명하고, 도형을 그린 다음, 그리기 리소스를 해제합니다. 다음 섹션에서는 이러한 각 단계를 자세히 설명합니다.

1단계: Direct2D 헤더 포함

Win32 애플리케이션에 필요한 헤더 외에도 d2d1.h 헤더를 포함합니다.

2단계: ID2D1Factory 만들기

Direct2D 예제에서 수행하는 첫 번째 작업 중 하나는 ID2D1Factory를 만드는 것입니다.

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

ID2D1Factory 인터페이스는 Direct2D를 사용하기 위한 시작점입니다. ID2D1Factory를 사용하여 Direct2D 리소스를 만듭니다.

팩터리를 만들 때 다중 스레드인지 아니면 단일 스레드인지 지정할 수 있습니다. 다중 스레드 팩터리에 대한 자세한 내용은 ID2D1Factory 참조 페이지의 설명을 참조하세요. 이 예제에서는 단일 스레드 팩터리를 만듭니다.

일반적으로 애플리케이션은 팩터리를 한 번 만들고 애플리케이션 수명 동안 유지해야 합니다.

3단계: ID2D1HwndRenderTarget 만들기

팩터리를 만든 후 이를 사용하여 렌더링 대상을 만듭니다.



// 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
);

렌더링 대상은 그리기 작업을 수행하고 브러시와 같은 디바이스 종속 그리기 리소스를 만들 수 있는 디바이스입니다. 다양한 유형의 렌더링 대상이 다른 디바이스에 렌더링됩니다. 앞의 예제에서는 화면의 일부에 렌더링되는 ID2D1HwndRenderTarget을 사용합니다.

가능한 경우 렌더링 대상은 GPU를 사용하여 렌더링 작업을 가속화하고 그리기 리소스를 만듭니다. 그렇지 않으면 렌더링 대상은 CPU를 사용하여 렌더링 지침을 처리하고 리소스를 만듭니다. (렌더링 대상을 만들 때 D2D1_RENDER_TARGET_TYPE 플래그를 사용하여 이 동작을 수정할 수 있습니다.)

CreateHwndRenderTarget 메서드는 세 개의 매개 변수를 사용합니다. 첫 번째 매개 변수인 D2D1_RENDER_TARGET_PROPERTIES 구조체는 렌더링 대상이 소프트웨어 또는 하드웨어에 렌더링되도록 강제할지 여부와 DPI에 대한 원격 표시 옵션을 지정합니다. 이 예제의 코드는 D2D1::RenderTargetProperties 도우미 함수를 사용하여 기본 렌더링 대상 속성을 허용합니다.

두 번째 매개 변수인 D2D1_HWND_RENDER_TARGET_PROPERTIES 구조체는 콘텐츠가 렌더링되는 HWND , 렌더링 대상의 초기 크기(픽셀) 및 프레젠테이션 옵션을 지정합니다. 이 예제에서는 D2D1::HwndRenderTargetProperties 도우미 함수를 사용하여 HWND 및 초기 크기를 지정합니다. 기본 프레젠테이션 옵션을 사용합니다.

세 번째 매개 변수는 렌더링 대상 참조를 수신하는 포인터의 주소입니다.

렌더링 대상을 만들고 하드웨어 가속을 사용할 수 있는 경우 컴퓨터의 GPU에 리소스를 할당합니다. 렌더링 대상을 한 번 만들고 가능한 한 오랫동안 유지하면 성능상의 이점을 얻을 수 있습니다. 애플리케이션은 렌더링 대상을 한 번 만들고 애플리케이션의 수명 동안 또는 D2DERR_RECREATE_TARGET 오류가 수신될 때까지 계속 유지해야 합니다. 이 오류가 표시되면 렌더링 대상(및 만든 리소스)을 다시 만들어야 합니다.

4단계: 브러시 만들기

팩터리처럼 렌더링 대상은 그리기 리소스를 만들 수 있습니다. 이 예제에서 렌더링 대상은 브러시를 만듭니다.

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

브러시는 도형의 스트로크 또는 기하 도형 채우기와 같은 영역을 그리는 개체입니다. 이 예제의 브러시는 미리 정의된 단색 검은색으로 영역을 그립니다.

Direct2D는 선형 및 방사형 그라데이션을 그리기 위한 그라데이션 브러시와 비트맵 및 패턴으로 그리기 위한 비트맵 브러시와 같은 다른 유형의 브러시도 제공합니다.

일부 그리기 API는 도형을 채우기 위한 윤곽선 및 브러시를 그리기 위한 펜을 제공합니다. Direct2D는 서로 다릅니다. 펜 개체를 제공하지는 않지만 윤곽선을 그리고 도형을 채우는 브러시를 사용합니다. 윤곽선을 그릴 때 브러시와 함께 ID2D1StrokeStyle 인터페이스를 사용하여 경로 쓰다듬기 작업을 제어합니다.

브러시는 만든 렌더링 대상과 동일한 리소스 도메인의 다른 렌더링 대상에서만 사용할 수 있습니다. 일반적으로 브러시를 한 번 만들어 만든 렌더링 대상의 수명 동안 유지해야 합니다. ID2D1SolidColorBrush 는 고독한 예외입니다. 만드는 것이 상대적으로 저렴하기 때문에 눈에 띄는 성능 적중 없이 프레임을 그릴 때마다 ID2D1SolidColorBrush 를 만들 수 있습니다. 단일 ID2D1SolidColorBrush 를 사용하고 사용할 때마다 색을 변경할 수도 있습니다.

5단계: 사각형 그리기

다음으로 렌더링 대상을 사용하여 사각형을 그립니다.

 
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();  

DrawRectangle 메서드는 그릴 사각형과 사각형의 윤곽선을 그리는 데 사용할 브러시라는 두 개의 매개 변수를 사용합니다. 필요에 따라 스트로크 너비, 대시 패턴, 선 조인 및 끝 캡 옵션을 지정할 수도 있습니다.

그리기 명령을 실행하기 전에 BeginDraw 메서드를 호출해야 하며 그리기 명령 실행을 완료한 후 EndDraw 메서드를 호출해야 합니다. EndDraw 메서드는 그리기 명령이 성공했는지 여부를 나타내는 HRESULT를 반환합니다.

6단계: 리소스 릴리스

그릴 프레임이 더 이상 없거나 D2DERR_RECREATE_TARGET 오류가 표시되면 렌더링 대상 및 만든 모든 디바이스를 해제합니다.

 
SafeRelease(pRT);
SafeRelease(pBlackBrush);

애플리케이션이 Direct2D 리소스 사용을 마치면(예: 종료 예정일 때) Direct2D 팩터리를 해제합니다.

 
SafeRelease(pD2DFactory);

간단한 Direct2D 애플리케이션 만들기

이 항목의 코드는 Direct2D 애플리케이션의 기본 요소를 보여줍니다. 간단히 하기 위해 토픽은 잘 작성된 애플리케이션의 특징인 애플리케이션 프레임워크 및 오류 처리 코드를 생략합니다. 간단한 Direct2D 애플리케이션을 만들기 위한 전체 코드를 보여주고 모범 설계 방법을 보여 주는 자세한 연습은 간단한 Direct2D 애플리케이션 만들기를 참조하세요.

간단한 Direct2D 애플리케이션 만들기