Direct2D로 그리기
그래픽 리소스를 만들고 나면 그릴 준비가 된 것입니다.
타원 그리기
원 프로그램은 매우 간단한 그리기 논리를 수행합니다.
- 배경색을 단색으로 채웁니다.
- 채워진 원을 그립니다.
렌더링 대상이 비트맵이나 다른 오프스크린 표면이 아닌 창이기 때문에 WM_PAINT 메시지에 대한 응답으로 그리기가 수행됩니다. 다음 코드는 원 프로그램의 창 프로시저를 보여 줍니다.
LRESULT MainWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_PAINT:
OnPaint();
return 0;
// Other messages not shown...
}
return DefWindowProc(m_hwnd, uMsg, wParam, lParam);
}
다음은 원을 그리는 코드입니다.
void MainWindow::OnPaint()
{
HRESULT hr = CreateGraphicsResources();
if (SUCCEEDED(hr))
{
PAINTSTRUCT ps;
BeginPaint(m_hwnd, &ps);
pRenderTarget->BeginDraw();
pRenderTarget->Clear( D2D1::ColorF(D2D1::ColorF::SkyBlue) );
pRenderTarget->FillEllipse(ellipse, pBrush);
hr = pRenderTarget->EndDraw();
if (FAILED(hr) || hr == D2DERR_RECREATE_TARGET)
{
DiscardGraphicsResources();
}
EndPaint(m_hwnd, &ps);
}
}
ID2D1RenderTarget 인터페이스는 모든 그리기 작업에 사용됩니다. 프로그램의 OnPaint
메서드는 다음 작업을 수행합니다.
- ID2D1RenderTarget::BeginDraw 메서드는 그리기 시작을 알립니다.
- ID2D1RenderTarget::Clear 메서드는 전체 렌더링 대상을 단색으로 채웁니다. 색은 D2D1_COLOR_F 구조체로 지정됩니다. D2D1::ColorF 클래스를 사용하여 구조체를 초기화할 수 있습니다. 자세한 내용은 Direct2D에서 색 사용을 참조하세요.
- ID2D1RenderTarget::FillEllipse 메서드는 채우기에 지정된 브러시를 사용하여 채워진 타원을 그립니다. 타원은 중심점과 x 및 y 반지름으로 지정됩니다. x와 y 반지름이 같으면 결과는 원이 됩니다.
- ID2D1RenderTarget::EndDraw 메서드는 이 프레임에 대한 그리기 완료를 알립니다. 모든 그리기 작업은 BeginDraw와 EndDraw 사이에 배치되어야 합니다.
BeginDraw, Clear 및 FillEllipse 메서드는 모두 반환 형식이 void입니다. 이러한 메서드를 실행하는 동안 오류가 발생하면 EndDraw 메서드의 반환 값을 통해 오류 알림이 표시됩니다.
CreateGraphicsResources
메서드는 Direct2D 리소스 만들기 항목에 설명되어 있습니다. 이 메서드는 렌더링 대상 및 단색 브러시를 만듭니다.
디바이스는 그리기 명령을 버퍼링하고 EndDraw 가 호출될 때까지 실행을 연기할 수 있습니다. ID2D1RenderTarget::Flush를 호출하여 디바이스에서 보류 중인 그리기 명령을 강제로 실행할 수 있습니다. 그러나 플러시하면 성능이 저하됩니다.
디바이스 손실 처리
프로그램이 실행되는 동안 사용 중인 그래픽 디바이스를 사용할 수 없게 될 수 있습니다. 예를 들어 디스플레이 해상도가 변경되거나 사용자가 디스플레이 어댑터를 제거하는 경우 디바이스가 손실될 수 있습니다. 디바이스가 손실되면 디바이스에 연결된 디바이스 종속 리소스와 함께 렌더링 대상도 유효하지 않게 됩니다. Direct2D는 EndDraw 메서드에서 D2DERR_RECREATE_TARGET 오류 코드를 반환하여 손실된 디바이스에 신호를 보냅니다. 이 오류 코드가 표시되면 렌더링 대상과 모든 디바이스 종속 리소스를 다시 만들어야 합니다.
리소스를 삭제하려면 해당 리소스에 대한 인터페이스를 해제하기만 하면 됩니다.
void MainWindow::DiscardGraphicsResources()
{
SafeRelease(&pRenderTarget);
SafeRelease(&pBrush);
}
리소스를 만드는 작업은 비용이 많이 들 수 있으므로 모든 WM_PAINT 메시지에 대해 리소스를 다시 만들지 마세요. 리소스를 한 번 만들고 디바이스 손실로 인해 리소스가 유효하지 않게 되거나 해당 리소스가 더 이상 필요하지 않을 때까지 리소스 포인터를 캐시하세요.
Direct2D 렌더링 루프
무엇을 그리는지에 관계없이 프로그램은 다음과 같은 루프를 수행해야 합니다.
- 디바이스 독립적 리소스를 만듭니다.
- 장면을 렌더링합니다.
- 유효한 렌더링 대상이 있는지 확인합니다. 없으면 렌더링 대상 및 디바이스 종속 리소스를 만듭니다.
- ID2D1RenderTarget::BeginDraw를 호출합니다.
- 그리기 명령을 실행합니다.
- ID2D1RenderTarget::EndDraw를 호출합니다.
- EndDraw가 D2DERR_RECREATE_TARGET을 반환하는 경우 렌더링 대상 및 디바이스 종속 리소스를 삭제합니다.
- 장면을 업데이트하거나 다시 그려야 할 때마다 2단계를 반복합니다.
렌더링 대상이 창인 경우 창이 WM_PAINT 메시지를 받을 때마다 2단계가 수행됩니다.
여기에 표시된 루프는 디바이스 종속 리소스를 삭제하고 다음 루프 시작 시 다시 만들어(2a단계) 디바이스 손실을 처리합니다.
다음