GDI+中文字描边

在网络地图中,有时为突出注记文字,需要将注记文字进行描边,以更好与周边环境颜色区分,使地图可视性更强。


在GDI+中,使用DrawStirng()方法绘制Text,绘制的起始位置与我期望位置有差异,所以,更改为使用FillPath( )绘制文字,然后再用Path描边,完全一气呵成的做法。

但是,发现FillPath( )绘制的效果与DrawString( )绘制效果很大不同,使用DrawPath绘制的文字笔画粗、不清晰,而是用DrawString( )绘制的文字笔画很细,很清晰。

下图左侧为FillPath( )绘制效果,右侧为DrawString( )绘制效果:

DrawString()与DrawPath()绘制文本效果




同时,我尝试将Path转化为Region,使用FillRegion( )绘制文字,效果也不理想,FillRegion()笔画间连接不清晰,有断续、笔画粗细不均、笔画布局不平衡等缺点。

下图左侧为FillRegion( )绘制效果,右侧为DrawString( )绘制效果:

GDI+中文字描边_第1张图片


看来,还有使用DrawString()方法绘制文字,先用Path来矫正文字绘制位置吧。


测试代码如下:

	//string format
	Gdiplus::StringFormat	*strFmt = Gdiplus::StringFormat::GenericTypographic()->Clone();
	strFmt->SetAlignment( StringAlignmentNear );
	strFmt->SetLineAlignment( StringAlignmentNear );


	//create font
	LOGFONTW lfont;
	memset( &lfont, 0, sizeof(lfont) );

	int emSize = 20;
	lfont.lfHeight = -emSize; //   nHeight   注意使用负值,表示character height,  正值表示 cell height
	lfont.lfWeight		= 400;//100;//FW_NORMAL,  //nWeight
	lfont.lfCharSet		= GB2312_CHARSET;//;//ANSI_CHARSET
	wcscpy( lfont.lfFaceName, (L"微软雅黑") );  //   lpszFacename

	HDC hHDC = ::GetDC(NULL);
	Gdiplus::Font gfont( hHDC, &lfont );
	::ReleaseDC( NULL, hHDC );

	
	//antialias
	gs.SetSmoothingMode( SmoothingModeAntiAlias );
	gs.SetTextRenderingHint( TextRenderingHintAntiAliasGridFit );
	gs.SetPixelOffsetMode(PixelOffsetModeHighQuality);


	//contruct path of text
	GraphicsPath	path;
	FontFamily  fontFamily;
	gfont.GetFamily( &fontFamily );
	path.AddString( text.c_str(), text.length(), &fontFamily, gfont.GetStyle(), emSize, org, strFmt );

	//draw path
	Color		clr1(0, 0, 0);
	SolidBrush	br1(clr1);
	//gs.FillPath( &br1, &path );

	Region	rg(&path);
	gs.FillRegion( &br1, &rg );

	//draw text
	org.X += 100;

	gs.DrawString( text.c_str(), text.length(), &gfont, org, strFmt, &br1);



你可能感兴趣的:(Map)