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);