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 3

MFCからSVGタグの追加と属性の追加

Last updated at Posted at 2022-12-02

SVGタグの追加

基本的にタグ要素を生成してタグ名 m_strName とタグの値 m_strValue を設定します。
例に挙げている title タグの追加は値が存在しますので値のない単独タグであることを示すフラグ m_bOne が "FALSE" となります。
階層は svg タグ内の宣言となりますので m_nDepth は "1" となります。

ヘッダは宣言の部分のみ

SvgImage.h
class SvgImage
{
public:
+   void AddTitle(LPCTSTR strTitle);
}
SVGImage.cpp
void SvgImage::AddTitle(LPCTSTR strTitle)
{
	SvgTag* svgRoot = new SvgTag();
	svgRoot->m_strName = L"title";
	svgRoot->m_strValue = strTitle;
	svgRoot->m_nDepth = 1;
	svgRoot->m_bOne = FALSE;

	m_arrayTag.Add(svgRoot);
}

属性の追加

属性は指定された属性が既に登録済みであった場合のことも考慮して準備します。

ヘッダは宣言の部分のみ

SvgImage.h
class SvgImage
{
public:
+   void AddAttribute(LPCTSTR attrName, LPCTSTR attrValue, BOOL bOverwrite);
}
SvgImage.cpp
void mdSvgImage::AddAttribute(LPCTSTR attrName, LPCTSTR attrValue, BOOL bOverwrite)
{
	SvgTag *svgTag = m_arrayTag.GetAt(m_arrayTag.GetSize() - 1);
	BOOL bFind = FALSE;
	for (int i = 0; i < svgTag->m_arrAttr.GetSize(); i++)
	{
		if (svgTag->m_arrAttr.GetAt(i).CompareNoCase(attrName) == 0)
		{
			CString strProp = svgTag->m_arrAttrValue.GetAt(i);
			strProp = bOverwrite ? attrValue : svgTag->m_arrAttrValue.GetAt(i) + attrValue;
			svgTag->m_arrAttrValue.SetAt(i, strProp);
			bFind = TRUE;
		}
	}
	if (bFind == FALSE)
	{
		svgTag->m_arrAttr.Add(attrName);
		svgTag->m_arrAttrValue.Add(attrValue);
	}
}

現在終端にあるタグが保持している属性全てに対してループをします。
bFind は追加したい属性名が重複していないか判定するためのフラグです。
FALSEのままであれば属性リストに追加する処理を行います。

	SvgTag *svgTag = m_arrayTag.GetAt(m_arrayTag.GetSize() - 1);
	BOOL bFind = FALSE;
	for (int i = 0; i < svgTag->m_arrAttr.GetSize(); i++)
	{

属性が重複しないかを調べます。
重複している場合は上書きか追記かを bOverwrite フラグから参照し、TRUE の場合は上書きし、FALSE の場合は追記を行います。

		if (svgTag->m_arrAttr.GetAt(i).CompareNoCase(attrName) == 0)
		{
			CString strProp = svgTag->m_arrAttrValue.GetAt(i);
			strProp = bOverwrite ? attrValue : svgTag->m_arrAttrValue.GetAt(i) + attrValue;
			svgTag->m_arrAttrValue.SetAt(i, strProp);
			bFind = TRUE;
		}

属性リストで重複が見つからなければ(bFind == FALSE の場合)新規追加を行います。

	if (bFind == FALSE)
	{
		svgTag->m_arrAttr.Add(attrName);
		svgTag->m_arrAttrValue.Add(attrValue);
	}

MFC のカラーコードを考慮した属性の追加

SVG の fill や stroke 属性にはカラーコードかURLが必要となります。
MFC のカラーコードから SVG 画像のカラーコード(16進数テキスト)に変換して出力します。

カラーコードは上書きを指定しています。

ヘッダは宣言の部分のみ

SvgImage.h
class SvgImage
{
public:
+   void AddAttrColor(LPCTSTR attrName, COLORREF color);
}
SvgImage
void SvgImage::AddAttrColor(LPCTSTR attrName, COLORREF color)
{
	CString strColor;
	strColor.Format(L"#%02x%02x%02x", GetRValue(color), GetGValue(color), GetBValue(color));
    AddAttribute(attrName, strColor, TRUE);
}
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?