다음을 통해 공유


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 애플리케이션 만들기