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 9

MFC から SVG の塗りとストローク

Last updated at Posted at 2022-12-08

塗り

パスや基本図形の中を一色で塗りつぶす場合の処理です。
先述の記事にて AddAttribute 関数を宣言しておりますのでそちらを呼び出し側で使用すれば十分です。
ただ、すべての属性を呼び出し側で行うというのは機能単位に分けたクラスとして機能不足であると考えられるため、AddAttrFill 関数を追加します。

SvgImage
class SvgImage
{
public:
+   void AddAttrFill(COLORREF crFill, BOOL bTransparent = FALSE);
+   void AddAttrFillUrl(LPCTSTR strFill);
}
SvgImage.cpp
void SvgImage::AddAttrFill(COLORREF crFill, BOOL bTransparent)
{
    if (bTransparent)
    {
        AddAttribute(L"fill", L"none");
    }
    else
    {
        AddAttrColor(L"fill", crFill);
    }
}
void SvgImage::AddAttrFillUrl(LPCTSTR strFill)
{
    CString strUrl;
    strUrl.Format(L"url(#%s)", (LPCTSTR)strFill);
    AddAttribute(L"fill", strUrl);
}

塗りつぶしを行わないことも考慮しておきます。

    if (bTransparent)
    {
        AddAttribute(L"fill", L"none");
    }
    else
    {
        AddAttrColor(L"fill", crFill);
    }

単色塗りではなく、パターン塗りやグラデーションを行うときに使用します。

    CString strUrl;
    strUrl.Format(L"url(#%s)", (LPCTSTR)strFill)
    AddAttribute(L"fill", strUrl);

ストローク

塗りと同じくストロークにも関数を用意します。
線の太さ設定や点線の設定もここで行います。

SvgImage

+#define PS_SOLID            0
+#define PS_DASH             1       /* -------  */
+#define PS_DOT              2       /* .......  */
+#define PS_DASHDOT          3       /* _._._._  */
+#define PS_DASHDOTDOT       4       /* _.._.._  */
+#define PS_NULL             5

class SvgImage
{
public:
+   void AddAttrLineType(BYTE byLineType);
+   void AddAttrStrokeWidth(int nWidth);
+   void AddAttrStroke(COLORREF crPen, int nWidth, BYTE byLineType);
}
SvgImage.cpp
void SvgImage::AddAttrLineType(BYTE byLineType)
{
	switch (byLineType)
	{
	case PS_SOLID:
		break;
	case PS_DASH:
		AddAttribute(L"stroke-dasharray", L"5,1", TRUE);
		break;
	case PS_DOT:
		AddAttribute(L"stroke-dasharray", L"1,1", TRUE);
		break;
	case PS_DASHDOT:
		AddAttribute(L"stroke-dasharray", L"10,1,2,1", TRUE);
		break;
	case PS_DASHDOTDOT:
		AddAttribute(L"stroke-dasharray", L"8,1,2,1,2,1", TRUE);
		break;
	case PS_NULL:
	default:
		break;
	}
}

void SvgImage::AddAttrStrokeWidth(int nWidth)
{
	CString strWidth;
    strWidth.Format(L"%d", nWidth);
	AddAttribute(L"stroke-width", strWidth, TRUE);
}

void SvgImage::AddAttrStroke(COLORREF crPen, int nWidth, BYTE byLineType)
{
	AddAttrColor(L"stroke", crPen, TRUE);
    AddAttrStrokeWidth(nWidth);
    AddAttrLineType(byLineType);
}

ラインの装飾をしています。
点線などは "stroke-dasharray" 属性で繰り返し内容を明記します。

	switch (byLineType)
	{
	case PS_SOLID:
		break;
	case PS_DASH:
		AddAttribute(L"stroke-dasharray", L"5,1", TRUE);
		break;
	case PS_DOT:
		AddAttribute(L"stroke-dasharray", L"1,1", TRUE);
		break;
	case PS_DASHDOT:
		AddAttribute(L"stroke-dasharray", L"10,1,2,1", TRUE);
		break;
	case PS_DASHDOTDOT:
		AddAttribute(L"stroke-dasharray", L"8,1,2,1,2,1", TRUE);
		break;
	case PS_NULL:
	default:
		break;
	}

ストロークのカラー、幅、点線の設定を一度に行います。

	AddAttrColor(L"stroke", crPen, TRUE);
    AddAttrStrokeWidth(nWidth);
    AddAttrLineType(byLineType);
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?