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 16

MFC から SVG クラスの呼び出しコードサンプル

Last updated at Posted at 2022-12-15

MFC から SVG クラスの呼び出し方法

これまでの投稿で SvgImage クラスが出来上がりました。
一通りの基本的なコードは作成したので MFC(GDI+) での描画コードと SVG クラスへの出力コードを比較しながら、どのように実装していくかみていくこととします。
GDI+ の実装に合わせてカスタムが必要な個所は SvgImage クラスにコードを追加したり、サンプルコードを数種類用意します。

MFC で GDI+ にて描画する際の準備と解放のサンプルコード

ウィンドウのサイズのビットマップ領域を用意し、書き込みを行う処理です。
本来であればここで作成したビットマップをウィンドウに対して BitBlt 関数などで書き込むのですがそちらのコードは省略しています。

	CBitmap bmp;
	// ビットマップ形式
	CRect	rect;
	mdRect	rectClient;
	GetClientRect(&rect);
	CDC		dcMem;
	CClientDC dc(this);
	dcMem.CreateCompatibleDC(&dc);
	const int cx = rect.Width();
	const int cy = rect.Height();
	bmp.CreateCompatibleBitmap(&dc, cx, cy);
	CBitmap* pPrev = dcMem.SelectObject(&bmp);

	dcMem.PatBlt(0, 0, cx, cy, WHITENESS);
	dcMem.SetMapMode(MM_ANISOTROPIC);
	dcMem.SetViewportOrg((rect.right - rect.left) / 2,
		(rect.bottom - rect.top) / 2);
	dcMem.SetViewportExt(1, -1);
	dcMem.SetWindowOrg(0, 0);
	dcMem.SetWindowExt(1, 1);
	Gdiplus::Graphics graphics(dcMem.m_hDC);

// TODO: 書き込み処理 graphics に対して行う

    // メモリの解放
	dcMem.SelectObject(pPrev);
	dcMem.DeleteDC();
	bmp.Detach();
	bmp.DeleteObject();

MFC の SvgImage オブジェクトの準備

MFC 側から SvgImage クラスを呼び出す際のコードサンプルは以下の通りです。

    CRect rectAll(0, 0, 640, 480);
	SvgImage *pImage = new SvgImage();
	pImage->CreateSvgImage(rectAll);

SVG の defs タグを一つに統合して宣言したい場合は CreateSvgImage 関数の呼び出し直後に作成するのが良いでしょう。ファイルの可読性が向上します。

これまでの投稿にありましたように defs タグを必要になった際に逐次用意しても表示に問題は発生しません。必要とあれば一つの defs タグにまとめるよう書き換えを行ってください。

SVG クラスのファイル出力

SVG画像の ViewPort 設定と MFC でのファイル出力
にて実装したファイル出力関数を使用して SVG ファイルの書き出しを行うサンプルコードです。
あらかじめ public ユーザの Documents フォルダに image フォルダを作成しておいてください。

ファイル名は任意のものに変更してください。
ここでは GDI+ に描画する際にレイヤ別に出力することを考慮して "layer_0.svg" というファイル名にしてあります。

    UINT uLayer = 0;
	CString strFile;
	strFile.Format(L"C:\\Users\\public\\Documents\\image\\layer_%d.svg", uLayer);
	pImage->OutputSVGImageFile(strFile);
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?