Cara Klip ke Masker Geometris
Topik ini menjelaskan cara menggunakan masker geometris untuk mengklip wilayah lapisan.
Untuk mengklip wilayah dengan masker geometris
- Buat ID2D1Geometry yang akan digunakan untuk mengklip wilayah.
- Panggil ID2D1RenderTarget::CreateLayer untuk membuat lapisan.
- Panggil ID2D1RenderTarget::P ushLayer dan berikan masker geometris yang Anda tentukan di langkah 1.
- Gambar konten ke klip.
- Panggil ID2D1RenderTarget::P opLayer untuk menghapus lapisan dari target render.
Contoh berikut menggunakan masker geometris untuk mengklip gambar dan beberapa persegi panjang. Ilustrasi berikut menunjukkan bitmap asli di sebelah kiri, dan bitmap diklip ke masker geometris di sebelah kanan.
Untuk mengklip gambar seperti yang diperlihatkan dalam ilustrasi sebelumnya, Anda membuat ID2D1PathGeometry dan menggunakannya untuk menentukan star. Kode berikut menunjukkan cara melakukannya.
// 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);
Panggil CreateLayer untuk membuat lapisan.
Catatan
Dimulai dengan Windows 8, Anda tidak perlu memanggil CreateLayer. Dalam kebanyakan situasi, performa lebih baik jika Anda tidak memanggil metode ini dan Direct2D mengelola sumber daya lapisan.
Panggil PushLayer dengan masker geometri untuk mendorong lapisan. Gambar konten ke klip, lalu panggil PopLayer untuk memunculkan lapisan. Ini menghasilkan gambar berbentuk star. Kode berikut menunjukkan cara melakukannya.
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;
}
Topik terkait
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk