VC三两句话实现字体描边和空心效果

来源:http://www.vcfans.com/2008/12/vc-a-couple-of-words-to-achieve-the-effect-of-hollow-characters-and-stroke.html
作者:lonkil (lonkil_at_gmail.com)
日期:2008-12-14
转载请注明出处,谢谢。

最近的项目需要对字体进行描边,也就是将字体缕空。为了实现不同桌面背景图使字体看上去清楚,目前通用的解决方案就是将字体描边。关键现在这款芯片的GUI开发包功能比较弱,一些特殊效都需要自己手动实现,汗。要实现这个效果的第一个想到的解决方案就是将系统字体的点阵取出,进行边缘检测出来,进行处理,运算的开销不小,而且处理起来麻烦,国际化也是个麻烦。

在罗大侠的指点的下(为罗大侠能想出这种歪注意表示万分感谢),想到了一个好的方法。只需写一个描边函数即可,实现相当容易。我在PC下做了一份,效果如下图:

主要实现思路是用背景色将要显示的字体按偏移刷8遍(为了方便算法的实现,我在下面的代码中刷了9遍),最后将前景的字体再刷一遍。实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void CshadowfontView::DrawShadow(CDC *pDC, CString & str, COLORREF clrTxt, COLORREF clrBG, int x, int y)
{
	if( pDC == NULL ) return;
 
	CPen pen;
	pDC->SetBkMode(TRANSPARENT);
	pDC->SetTextColor( clrBG );
	for (int i=0; i < 3; i++)
	{
		for (int j=0; j < 3; j++)
		{
			pDC->TextOut(x+i, y+j, str);
		}
	}
 
	pDC->SetTextColor( clrTxt );
	pDC->TextOut(x+1, y+1, str);
}

测试了CreateFont的画圈效果:

代码下载:

  shadowfont.7z (18.0 KiB, 416 hits)

网友评论(共6条评论)

  1. Tr0j4n

     2008年12月29日 19:17 pm

    MFC的基本开发已经学成,自己写了一个作品,biweilun.ys168.com —-“我编的软件”—- KeyBoardLock.rar 鉴赏下。自我感觉做得很完美,每句代码都是自己码出来的,没有参考任何人的代码


    • lonkil

       2008年12月29日 22:43 pm

      牛人呀,这么短的时间就出成果了?我去看看。


  2. solu

     2008年12月15日 16:15 pm

    不知道是不是我的错觉
    当看着那圆我向下拉的时候,中心向上偏移了
    而向上拉的时候,中心又向下偏移
    一句话,头好晕,看圆晕的,看代码就更晕!
    先把代码收藏了哈


    • lonkil

       2008年12月15日 16:35 pm

      需要一点Windows的编程经验。


  3. 老时

     2008年12月14日 19:58 pm

    我看晕了


    • lonkil

       2008年12月14日 20:05 pm

      哈哈,一个圆而已。


发表评论





XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>