微信公众号 
图码生活

每天发布有五花八门的文章,各种有趣的知识等,期待您的订阅与参与
电脑报 1992-2001 十年文章全集
电脑报 1992-2001 十年文章全集
包含从 1992 年 - 2001 年间,两万余篇期刊文章,查询最少输入两个字符
随便看看
读取中
读取中
标题在VC++程序中输出3D空心字
栏目软件世界
作者穆宣社
发布2001年28期
  有时,我们在编程实践中需要输出一些特效文字,比如3D空心文字。要在VC++程序中输出3D空心效果的文字,可以先输入3D文字(如图

1)然后建立一个路径对象,向路径对象输出该文字,之后用当前画刷填充区域内部并用当前画笔勾画路径的轮廓就可达到此目的(如图

2)。下面我们通过一个实际的例程来说明这一实现方法。
  首先用AppWizard创建一个单文档应用程序HollowFont。
  然后给CHollowFontView类添加如下两个数据成员:
  public
  CString m_sText  CFont m_font
  这两个数据成员分别存放要显示的文字及文字所使用的字体。
  在ChollowFontView类的构造函数中,我们将m_sText赋初值为“汉字”,并调用CFont类的CreateFontIndirect函数建立合适的字体如下:
  CHollowFontViewCHollowFontView
  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"汉字"
  最后如下编辑CHollowFontViewOnDraw函数:
  void CHollowFontViewOnDraw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),因此,文字的显示效果就变成了空心,同时该函数用当前画笔勾画路径的轮廓。