MFC から SVG クラスのクリップパス呼び出し
クリッピングを複数行い、それに重なる形で四角形を描画するサンプルコードです。
Gdiplus::GraphicsPath オブジェクトをリセットしていますが、クリップしたい部分を一度に入れてしまってもかまいません。
SVG 出力のサンプルとして複数のパスを使うときのパターンを示しておきたいため故意に分けてクリップを設定しています。
MFC(GDI+) で複数のクリップを設定する際には Gdiplus::Graphics::SetClip 関数の第二引数でクリップのマージ方法を指定することができます。本サンプルコードでは SVG への出力に合わせて "Gdiplus::CombineModeUnion" を設定しています。
MFC(GDI+) の場合以下のようになります。
Gdiplus::Point poly[4];
int nPoints = 4;
poly[0] = Gdiplus::PointF(100,100);
poly[1] = Gdiplus::PointF(100,200);
poly[2] = Gdiplus::PointF(200,200);
poly[3] = Gdiplus::PointF(200,100);
Gdiplus::GraphicsPath path;
path.AddPolygon(poly, 4);
pGraphics->SetClip(path);
poly[0] = Gdiplus::PointF(200,200);
poly[1] = Gdiplus::PointF(200,300);
poly[2] = Gdiplus::PointF(300,300);
poly[3] = Gdiplus::PointF(300,200);
path.Reset();
path.AddPolygon(poly, 4);
pGraphics->SetClip(path,Gdiplus::CombineModeUnion);
Solic
Gdiplus::SolidBrush brush(Color(255, 0, 0, 255));
pGraphics->FillRectangle(brush, brushGdiplus::Rect(150,150,100,100));
pGraphics->ResetClip()
SvgImage に書き出すと以下のようになります。
CPoint pn[4];
pn[0] = CPoint(100, 100);
pn[1] = CPoint(100, 200);
pn[2] = CPoint(200, 200);
pn[3] = CPoint(200, 100);
CString csClipName = pImage->AddClipPath(pn, 4);
pn[0] = CPoint(200, 200);
pn[1] = CPoint(200, 300);
pn[2] = CPoint(300, 300);
pn[3] = CPoint(300, 200);
pImage->AddClipPath(pn, 4, csClipName);
pImage->AddRect(150, 150, 100, 100, 0, 0);
pImage->AddAttrFill(RGB(0, 0, 255), FALSE);
pImage->AddAttrClip(csClipName);