Direct2D 빠른 시작
Direct2D는 2D 그래픽을 만들기 위한 네이티브 코드 즉시 모드 API입니다. 이 항목에서는 일반적인 Win32 애플리케이션 내에서 Direct2D를 사용하여 HWND그리는 방법을 보여 줍니다.
메모
Direct2D를 사용하는 Windows 스토어 앱을 만들려면 Windows 8 항목에 대한 Direct2D 빠른 시작을 참조하세요.
이 항목에는 다음 섹션이 포함되어 있습니다.
- 간단한 사각형 그리기
- 1단계: Direct2D 헤더 포함
- 2단계: ID2D1Factory 만들기
- 3단계: ID2D1HwndRenderTarget 만들기
- 4단계: 브러시 만들기
- 5단계: 사각형 그리기
- 6단계: 리소스 해제
- 간단한 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 애플리케이션만들기를 참조하세요.
관련 항목