如何裁剪成幾何遮罩
本主題描述如何使用幾何遮罩來裁剪圖層的區域。
使用幾何遮罩裁剪區域
- 建立將用來裁剪區域的 ID2D1Geometry 。
- 呼叫 ID2D1RenderTarget::CreateLayer 以建立圖層。
- 呼叫 ID2D1RenderTarget::P ushLayer ,並傳遞您在步驟 1 中定義的幾何遮罩。
- 繪製要裁剪的內容。
- 呼叫 ID2D1RenderTarget::P opLayer ,以從轉譯目標中移除圖層。
下列範例會使用幾何遮罩來裁剪影像和數個矩形。 下圖顯示左邊的原始點陣圖,而點陣圖會裁剪到右邊的幾何遮罩。
若要裁剪如上圖所示的繪圖,您可以建立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;
}
相關主題