本主题介绍如何使用几何掩码来裁剪层的区域。
使用几何掩码剪辑区域
- 创建将用于剪裁区域的 ID2D1Geometry。
- 调用 ID2D1RenderTarget::CreateLayer 来创建层。
- 调用 ID2D1RenderTarget::P ushLayer ,并传递在步骤 1 中定义的几何掩码。
- 绘制要剪辑的内容。
- 调用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;
}
相关主题