0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MFCからSVG変換Advent Calendar 2022

Day 17

MFC から SVG クラスの基本図形呼び出しコードサンプル(1/2)

Last updated at Posted at 2022-12-16

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 の描画に近づけてあることもありますが、描画を行う上で最低限必要な情報だけ抽出を行うと描画ライブラリと似通ってくるのではないかと思います。
用途に合わせて関数をオーバーロードや追加などしてカスタマイズしてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?