在VC++程序中输出3D空心字

有时,我们在编程实践中需要输出一些特效文字,比如3D空心文字。要在VC++程序中输出3D空心效果的文字,可以先输入3D文字(如图(图1)1)然后建立一个路径对象,向路径对象输出该文字,之后用当前画刷填充区域内部并用当前画笔勾画路径的轮廓就可达到此目的(如图(图2)2)。下面我们通过一个实际的例程来说明这一实现方法。

图1
图1
图2
图2

   首先用AppWizard创建一个单文档应用程序HollowFont。
   然后给CHollowFontView类添加如下两个数据成员:
   public
   CString m_sText
CFont m_font

这两个数据成员分别存放要显示的文字及文字所使用的字体。
   在ChollowFontView类的构造函数中,我们将m_sText赋初值为“汉字”,并调用CFont类的CreateFontIndirect函数建立合适的字体如下:
   CHollowFontViewCHollowFontView
   LOGFONT lf
//lf定义字体的属性
   lf.lfHeight = -80
//字体字符的高度
   lf.lfWidth = 0
//字符平均宽度
   lf.lfEscapement =450
//文本行逆时针旋转45度
   lf.lfOrientation=0
//字符角度
   lf.lfWeight=FW_HEAVY
//字符的粗细度
   lf.lfItalic = FALSE
//倾斜
   lf.lfUnderline = FALSE
//下划线
   lf.lfStrikeOut = FALSE
//删除线
   lf.lfCharSet = GB2312_CHARSET
//中文字符集
   lf.lfOutPrecision=OUT_STROKE_PRECIS
//字体输出结果和要求的匹配程度
   lf.lfClipPrecision=CLIP_STROKE_PRECIS
//如何裁剪落于裁剪区之外的字符
   lf.lfQuality=DRAFT_QUALITY
//字体属性匹配的精确程度
   lf.lfPitchAndFamily=VARIABLE_PITCH|FF_MODERN
//字体间距和字体族
   strcpy lf.lfFaceName,"楷体_GB2312"
//楷体
   m_font.CreateFontIndirect &lf

m_sText=_T "汉字"

最后如下编辑CHollowFontViewOnDraw 函数:
   void CHollowFontViewOnDraw CDC* pDC
   CHollowFontDoc* pDoc = GetDocument

ASSERT_VALID pDoc

// TODO add draw code for native data here
   if m_font.GetSafeHandle =NULL //如果成功建立字体
   CFont *pOldFont= CFont* pDC→SelectObject &m_font

pDC→SetBkMode TRANSPARENT

int cx=10,cy=100
//文本输出位置
   CString sTemp=m_sText

cx += 3
cy += 3
//以下先输出突出的3D文本
   pDC→SetTextColor GetSysColor COLOR_3DDKSHADOW

pDC→TextOut cx+2,cy-2,sTemp

pDC→TextOut cx+2,cy+2,sTemp

pDC→SetTextColor GetSysColor COLOR_3DHILIGHT

pDC→TextOut cx+1,cy-2,sTemp

pDC→TextOut cx-2,cy+1,sTemp

pDC→TextOut cx-2,cy-2,sTemp

pDC→SetTextColor GetSysColor COLOR_3DSHADOW

pDC→TextOut cx-1,cy+1,sTemp

pDC→TextOut cx+1,cy-1,sTemp

pDC→TextOut cx+1,cy+1,sTemp

pDC→SetTextColor GetSysColor COLOR_3DLIGHT

pDC→TextOut cx,cy-1,sTemp

pDC→TextOut cx-1,cy,sTemp

pDC→TextOut cx-1,cy-1,sTemp

//然后通过路径对象将以上要输出的文本变成空心
   //向路径输出“汉字”
   pDC→BeginPath

pDC→TextOut cx,cy,sTemp,4

pDC→EndPath

//填充路径
   pDC→SetPolyFillMode WINDING
//设置填充模式
   pDC→StrokeAndFillPath
//绘制路径外观
   pDC→SelectObject pOldFont

编译并执行程序,结果如图所示。函数中pDC→StrokeAndFillPath一句是先封闭所有的开放路径,然后用当前画刷和填充方式填充区域内部,由于当前画刷是一个实心的白色画刷(WHITE_BRUSH),因此,文字的显示效果就变成了空心,同时该函数用当前画笔勾画路径的轮廓。