Partager via


Comment découper à l’aide d’un masque géométrique

Cette rubrique explique comment utiliser un masque géométrique pour découper une région d’une couche.

Pour découper une région à l’aide d’un masque géométrique

  1. Créez l’ID2D1Geometry qui sera utilisé pour découper la région.
  2. Appelez ID2D1RenderTarget ::CreateLayer pour créer une couche.
  3. Appelez ID2D1RenderTarget::PushLayer et passez le masque géométrique que vous avez défini à l’étape 1.
  4. Dessinez le contenu à découper.
  5. Appelez ID2D1RenderTarget::PopLayer pour supprimer la couche de la cible de rendu.

L’exemple suivant utilise un masque géométrique pour découper une image et plusieurs rectangles. L’illustration suivante montre la bitmap d’origine à gauche et la bitmap clippée au masque géométrique à droite.

illustration d’une bitmap de poisson rouge avant et après que la bitmap soit clippée à un masque en forme d’étoile

Pour découper le dessin comme illustré précédemment, vous devez créer un ID2D1PathGeometry et l’utiliser pour définir une étoile. Le code suivant montre comment procéder.

// 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);

Appelez CreateLayer pour créer une couche.

Remarque

À compter de Windows 8, vous n’avez pas besoin d’appeler CreateLayer. Dans la plupart des situations, les performances sont meilleures si vous n’appelez pas cette méthode et Direct2D gère les ressources de couche.

 

Appelez PushLayer avec le masque de géométrie pour pousser la couche. Dessinez le contenu à découper, puis appelez PopLayer pour afficher le calque. Cela produit le dessin en forme d’étoile. Le code suivant montre comment procéder.

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;
}

Vue d'ensemble des couches

Référence Direct2D