다음을 통해 공유


기하학적 마스크로 클립하는 방법

이 항목에서는 기하학적 마스크를 사용하여 레이어의 영역을 클리핑하는 방법을 설명합니다.

기하학적 마스크를 사용하여 영역을 클리핑하려면

  1. 영역을 클리핑하는 데 사용할 ID2D1Geometry 를 만듭니다.
  2. ID2D1RenderTarget::CreateLayer를 호출하여 레이어를 만듭니다.
  3. ID2D1RenderTarget::P ushLayer를 호출하고 1단계에서 정의한 기하학적 마스크를 전달합니다.
  4. 클립할 콘텐츠를 그립니다.
  5. ID2D1RenderTarget::P opLayer를 호출하여 렌더링 대상에서 레이어를 제거합니다.

다음 예제에서는 기하학적 마스크를 사용하여 이미지와 여러 사각형을 클리핑합니다. 다음 그림에서는 왼쪽의 원래 비트맵과 오른쪽의 기하학적 마스크로 잘린 비트맵을 보여 줍니다.

비트맵이 star 모양의 마스크로 잘린 전후 금붕어 비트맵 그림

앞의 그림과 같이 드로잉을 잘라내려면 ID2D1PathGeometry를 만들고 이를 사용하여 star 정의합니다. 다음 코드에서는 이 작업을 수행하는 방법을 보여 줍니다.

// Create the path geometry.
if (SUCCEEDED(hr))
{
    hr = m_pD2DFactory->CreatePathGeometry(&m_pPathGeometry);
}

// Write to the path geometry using the geometry sink to create a star.
if (SUCCEEDED(hr))
{
    hr = m_pPathGeometry->Open(&pSink);
}
if (SUCCEEDED(hr))
{
    pSink->SetFillMode(D2D1_FILL_MODE_WINDING);
    pSink->BeginFigure(D2D1::Point2F(20, 50), D2D1_FIGURE_BEGIN_FILLED);
    pSink->AddLine(D2D1::Point2F(130, 50));
    pSink->AddLine(D2D1::Point2F(20, 130));
    pSink->AddLine(D2D1::Point2F(80, 0));
    pSink->AddLine(D2D1::Point2F(130, 130));
    pSink->EndFigure(D2D1_FIGURE_END_CLOSED);

    hr = pSink->Close();
}

SafeRelease(&pSink);

CreateLayer를 호출하여 레이어를 만듭니다.

참고

Windows 8 시작하여 CreateLayer를 호출할 필요가 없습니다. 대부분의 경우 이 메서드를 호출하지 않고 Direct2D가 계층 리소스를 관리하는 경우 성능이 향상됩니다.

 

기하 도형 마스크를 사용하여 PushLayer 를 호출하여 레이어를 푸시합니다. 콘텐츠를 클립에 그린 다음 PopLayer 를 호출하여 레이어를 팝합니다. 이렇게 하면 star 모양의 드로잉이 생성됩니다. 다음 코드에서는 이 작업을 수행하는 방법을 보여 줍니다.

HRESULT DemoApp::RenderWithLayer(ID2D1RenderTarget *pRT)
{
    HRESULT hr = S_OK;

    // Create a layer.
    ID2D1Layer *pLayer = NULL;
    hr = pRT->CreateLayer(NULL, &pLayer);

    if (SUCCEEDED(hr))
    {
        pRT->SetTransform(D2D1::Matrix3x2F::Translation(350, 50));

        // Push the layer with the geometric mask.
        pRT->PushLayer(
            D2D1::LayerParameters(D2D1::InfiniteRect(), m_pPathGeometry),
            pLayer
            );
            
  
        pRT->DrawBitmap(m_pOrigBitmap, D2D1::RectF(0, 0, 200, 133));
        pRT->FillRectangle(D2D1::RectF(0.f, 0.f, 25.f, 25.f), m_pSolidColorBrush);  
        pRT->FillRectangle(D2D1::RectF(25.f, 25.f, 50.f, 50.f), m_pSolidColorBrush);
        pRT->FillRectangle(D2D1::RectF(50.f, 50.f, 75.f, 75.f), m_pSolidColorBrush); 
        pRT->FillRectangle(D2D1::RectF(75.f, 75.f, 100.f, 100.f), m_pSolidColorBrush);    
        pRT->FillRectangle(D2D1::RectF(100.f, 100.f, 125.f, 125.f), m_pSolidColorBrush); 
        pRT->FillRectangle(D2D1::RectF(125.f, 125.f, 150.f, 150.f), m_pSolidColorBrush);    
        

        pRT->PopLayer();
    }

    SafeRelease(&pLayer);

    return hr;
}

레이어 개요

Direct2D 참조