Freigeben über


Beschneiden einer geometrischen Maske

In diesem Thema wird beschrieben, wie Sie eine geometrische Maske verwenden, um einen Bereich einer Ebene zu beschneiden.

So schneiden Sie einen Bereich mit einer geometrischen Maske ab

  1. Erstellen Sie die ID2D1Geometry , die zum Beschneiden des Bereichs verwendet wird.
  2. Rufen Sie ID2D1RenderTarget::CreateLayer auf, um eine Ebene zu erstellen.
  3. Rufen Sie ID2D1RenderTarget::P ushLayer auf, und übergeben Sie die geometrische Maske, die Sie in Schritt 1 definiert haben.
  4. Zeichnen Sie den Zuschnittinhalt.
  5. Rufen Sie ID2D1RenderTarget::P opLayer auf, um die Ebene vom Renderziel zu entfernen.

Im folgenden Beispiel wird eine geometrische Maske verwendet, um ein Bild und mehrere Rechtecke zu beschneiden. Die folgende Abbildung zeigt die ursprüngliche Bitmap auf der linken Seite und die In der geometrischen Maske auf der rechten Seite abgeschnittene Bitmap.

Abbildung einer Goldfisch-Bitmap vor und nach dem Abschneiden der Bitmap in eine star Maske

Um die Zeichnung wie in der vorherigen Abbildung dargestellt zu beschneiden, erstellen Sie eine ID2D1PathGeometry und verwenden sie zum Definieren eines star. Dies wird im folgenden Code veranschaulicht.

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

Rufen Sie CreateLayer auf, um eine Ebene zu erstellen.

Hinweis

Ab Windows 8 müssen Sie CreateLayer nicht aufrufen. In den meisten Fällen ist die Leistung besser, wenn Sie diese Methode nicht aufrufen und Direct2D die Ebenenressourcen verwaltet.

 

Rufen Sie PushLayer mit der Geometriemaske auf, um die Ebene zu pushen. Zeichnen Sie den Inhalt, um den Clip zu beschneiden, und rufen Sie dann PopLayer auf, um die Ebene aufzufüllen. Dies erzeugt die star-förmige Zeichnung. Dies wird im folgenden Code veranschaulicht.

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

Übersicht über Ebenen

Direct2D-Referenz