다음을 통해 공유


Direct2D를 사용하여 그리기

그래픽 리소스를 만든 후에는 그릴 준비가 된 것입니다.

타원 그리기

Circle 프로그램은 매우 간단한 그리기 논리를 수행합니다.

  1. 배경색을 단색으로 채웁니다.
  2. 채워진 원을 그립니다.

원 프로그램의 스크린샷입니다.

렌더링 대상은 비트맵 또는 다른 오프스크린 화면이 아닌 창이므로 WM_PAINT 메시지에 대한 응답으로 그리기를 수행합니다. 다음 코드에서는 Circle 프로그램에 대한 창 프로시저를 보여 있습니다.

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 메서드는 다음을 수행합니다.

  1. ID2D1RenderTarget::BeginDraw 메서드는 그리기 시작을 알립니다.
  2. ID2D1RenderTarget::Clear 메서드는 전체 렌더링 대상을 단색으로 채웁니다. 색은 D2D1_COLOR_F 구조체로 지정됩니다. D2D1::ColorF 클래스를 사용하여 구조를 초기화할 수 있습니다. 자세한 내용은 Direct2D에서의 색상 사용 을 참조하세요.
  3. ID2D1RenderTarget::FillEllipse 메서드는 채우기에 지정된 브러시를 사용하여 채워진 타원을 그립니다. 타원은 중심점과 x-및 y-radii로 지정됩니다. x-및 y-radii가 같으면 결과는 원입니다.
  4. ID2D1RenderTarget::EndDraw 메서드는 이 프레임에 대한 그리기 완료를 알립니다. 모든 그리기 작업은 BeginDraw 호출과 EndDraw사이에 배치되어야 합니다.

BeginDraw, ClearFillEllipse 메서드에는 모두 void 반환 형식이 있습니다. 이러한 메서드를 실행하는 동안 오류가 발생하면 EndDraw 메서드의 반환 값을 통해 오류가 표시됩니다. CreateGraphicsResources 메서드는 Direct2D 리소스 만들기 항목에 나와 있습니다. 이 메서드는 렌더링 대상 및 단색 브러시를 만듭니다.

디바이스는 그리기 명령을 버퍼링하고 EndDraw 호출될 때까지 실행을 연기할 수 있습니다. ID2D1RenderTarget::Flush호출하여 디바이스에서 보류 중인 그리기 명령을 강제로 실행할 수 있습니다. 그러나 플러시하면 성능이 저하됩니다.

디바이스 손실 처리

프로그램을 실행하는 동안 사용 중인 그래픽 디바이스를 사용할 수 없게 될 수 있습니다. 예를 들어 디스플레이 해상도가 변경되거나 사용자가 디스플레이 어댑터를 제거하는 경우 디바이스가 손실될 수 있습니다. 디바이스가 손실되면 디바이스와 연결된 디바이스 종속 리소스와 함께 렌더링 대상도 유효하지 않습니다. Direct2D는 EndDraw 메서드에서 D2DERR_RECREATE_TARGET 오류 코드를 반환하여 분실된 디바이스에 신호를 전송합니다. 이 오류 코드가 표시되면 렌더링 대상 및 모든 디바이스 종속 리소스를 다시 만들어야 합니다.

리소스를 삭제하려면 해당 리소스에 대한 인터페이스를 해제하기만 하면됩니다.

void MainWindow::DiscardGraphicsResources()
{
    SafeRelease(&pRenderTarget);
    SafeRelease(&pBrush);
}

리소스를 만드는 작업은 비용이 많이 들 수 있으므로 모든 WM_PAINT 메시지에 대한 리소스를 다시 만들지 마세요. 리소스를 한 번 만들고 디바이스 손실로 인해 리소스가 유효하지 않거나 더 이상 해당 리소스가 필요하지 않을 때까지 리소스 포인터를 캐시합니다.

Direct2D 렌더링 루프

그리는 항목에 관계없이 프로그램은 다음과 유사한 루프를 수행해야 합니다.

  1. 디바이스 독립적 리소스를 만듭니다.
  2. 장면을 렌더링합니다.
    1. 유효한 렌더링 대상이 있는지 확인합니다. 그렇지 않은 경우 렌더링 대상 및 디바이스 종속 리소스를 만듭니다.
    2. ID2D1RenderTarget::BeginDraw호출합니다.
    3. 그리기 명령을 실행합니다.
    4. ID2D1RenderTarget::EndDraw호출합니다.
    5. EndDrawD2DERR_RECREATE_TARGET반환하는 경우 렌더링 대상 및 디바이스 종속 리소스를 삭제합니다.
  3. 장면을 업데이트하거나 다시 그려야 할 때마다 2단계를 반복합니다.

렌더링 대상이 창이면 창이 WM_PAINT 메시지를 받을 때마다 2단계가 발생합니다.

여기에 표시된 루프는 디바이스 종속 리소스를 삭제하고 다음 루프 시작 시 다시 만들어 디바이스 손실을 처리합니다(2a단계).

다음

DPI 및 Device-Independent 픽셀