다음을 통해 공유


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

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

기하학적 마스크를 사용하여 영역을 잘라내려면

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

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

금붕어 비트맵이 별 모양의 마스크그림

앞의 그림과 같이 그림을 클립 하려면 ID2D1PathGeometry을 만들고 이를 사용하여 별을 생성합니다. 다음 코드는 이 작업을 수행하는 방법을 보여줍니다.

// 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 호출하여 레이어를 팝합니다. 별 모양의 드로잉을 생성합니다. 다음 코드는 이 작업을 수행하는 방법을 보여줍니다.

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 참조