MFC から SVG クラスの基本図形呼び出し
MFC の GDI+ で出力するサンプルコードと SvgImage クラスに出力するサンプルコードを比較しながら基本図形をどのように出力していくかを確認していきます。
MFC(GDI+) と SvgImage のライン出力
MFC(GDI+) でラインを描いている箇所が以下のようにあるとします。
Gdiplus::Pen pen(Color(255, 0, 0, 0));
graphics.DrawLine(&pen, 0, 0, 100, 100);
これを SvgImage に対して描くと次のようになります。
pImage->AddLine(0, 0, 100, 100)
pImage->AddAttrStroke(RGB(0, 0, 0), 1, PS_SOLID);
Gdiplus::Pen クラスの設定項目を SVG タグの属性値として設定する必要があるため描画関数の呼び出し順序が逆になっています。
Gdiplus::Pen のように描画前にペンやブラシなどの設定項目を反映させたい場合は SvgImage クラスにたいして使える属性値をセットにしたクラスオブジェクトを作成する必要があります。
CPoint クラスでポイントを指定したい場合は関数をオーバーロードして宣言してください。
MFC(GDI+) と SvgImage の接続された複数のライン
1辺が解放されている八角形を描く例です。
MFC(GDI+) の場合以下のようになります。
Gdiplus::Point poly[8];
int nPoints = 8;
poly[0] = Gdiplus::PointF(10,20);
poly[1] = Gdiplus::PointF(20,10);
poly[2] = Gdiplus::PointF(30,10);
poly[3] = Gdiplus::PointF(40,20);
poly[4] = Gdiplus::PointF(40,30);
poly[5] = Gdiplus::PointF(30,40);
poly[6] = Gdiplus::PointF(20,40);
poly[7] = Gdiplus::PointF(10,30);
Gdiplus::Pen pen(Color(255, 0, 0, 0));
pGraphics->DrawLines(&pen, poly, nPoints);
SvgImage に書き出すと以下のようになります。
CPoint poly[8];
int nPoints = 8;
poly[0] = CPoint(10,20);
poly[1] = CPoint(20,10);
poly[2] = CPoint(30,10);
poly[3] = CPoint(40,20);
poly[4] = CPoint(40,30);
poly[5] = CPoint(30,40);
poly[6] = CPoint(20,40);
poly[7] = CPoint(10,30);
pImage->AddLines(poly, nPoints)
pImage->AddAttrStroke(RGB(0, 0, 0), 1, PS_SOLID);
普通のラインの項目と同様に大きな差分はありません。
MFC(GDI+) と SvgImage の多角形出力
八角形を描く例です。
MFC(GDI+) の場合以下のようになります。
Gdiplus::Point poly[8];
int nPoints = 8;
poly[0] = Gdiplus::PointF(10,20);
poly[1] = Gdiplus::PointF(20,10);
poly[2] = Gdiplus::PointF(30,10);
poly[3] = Gdiplus::PointF(40,20);
poly[4] = Gdiplus::PointF(40,30);
poly[5] = Gdiplus::PointF(30,40);
poly[6] = Gdiplus::PointF(20,40);
poly[7] = Gdiplus::PointF(10,30);
Gdiplus::Pen pen(Color(255, 0, 0, 0));
pGraphics->DrawPolygon(&pen, poly, nPoints);
SvgImage に書き出すと以下のようになります。
CPoint poly[8];
int nPoints = 8;
poly[0] = CPoint(10,20);
poly[1] = CPoint(20,10);
poly[2] = CPoint(30,10);
poly[3] = CPoint(40,20);
poly[4] = CPoint(40,30);
poly[5] = CPoint(30,40);
poly[6] = CPoint(20,40);
poly[7] = CPoint(10,30);
pImage->AddPolygon(poly, nPoints)
pImage->AddAttrStroke(RGB(0, 0, 0), 1, PS_SOLID);
こちらも大きな差分はありません。
SvgImage クラスの描画が MFC の描画に近づけてあることもありますが、描画を行う上で最低限必要な情報だけ抽出を行うと描画ライブラリと似通ってくるのではないかと思います。
用途に合わせて関数をオーバーロードや追加などしてカスタマイズしてください。