VC下编程实现3D文字

提起3D文字制作,不少人会马上想到3D MAX等一些专门的3维制作工具,即使选用VC以编程的手段来实现也多是假手于OpenGL图形开发库来完成。熟悉OpenGL开发的编程人员一定对其初始化、材质以及灯光的渲染等一系列烦琐而又必要的编程过程深有感触。虽然通过以上的手段可以产生出包括3D文字在内的质感相当强的3维图形,但如果程序仅需要产生不很复杂的3D文字,而采用OpenGL去实现未免显得大材小用。其实在要求不很苛刻的情况下,完全可以通过MFC提供的CFont类制作出层次感较强的3D文字,其实现过程要比OpenGL简练得多。 实现原理 计算机屏幕是平面二维的,我们之所以能欣赏到真如实物般的三维图像,是因为显示在计算机屏幕上时色彩灰度的不同而使人眼产生视觉上的错觉,而将二维的计算机屏幕感知为三维图像。基于色彩学的有关知识,三维物体边缘的凸出部分一般显高亮度色,而凹下去的部分由于受光线的遮挡而显暗色。这一认识被广泛应用于网页或其他应用中对按钮、3D线条的绘制。对于本文所要绘制的3D文字同样也适用,即在原始位置显示高亮度颜色,而在左下或右上等位置用低亮度颜色勾勒出其轮廓,这样在视觉上便会产生3D文字的效果。具体实现时,可用完全一样的字体在不同的位置分别绘制两个不同颜色的2D文字,只要使两个文字的坐标合适,就完全可以在视觉上产生出不同效果的3D文字。 具体实现 在实现3D文字时一般不使用缺省的字体设置,而是通过对字体的设置而使产生的3D文字在视觉上更美观。在使用CFont类时,首先要通过其成员函数CreateFontIndirect根据预先设定好的LOGFONT结构来初始化CFont对象: CFont m_font; …… m_font.CreateFontIndirect(&lf); 其参数为一个指向LOGFONT结构的指针。LOGFONT结构主要定义了字体的属性,其定义可通过MSDN帮助查到: typedef struct tagLOGFONT { LONG lfHeight; //字符字体高度 LONG lfWidth; //字符平均宽度 LONG lfEscapement; //文本行逆时针旋转角度 LONG lfOrientation; //字体角度 LONG lfWeight; //字体粗细程度 BYTE lfItalic; //倾斜 BYTE lfUnderline; //下划线 BYTE lfStrikeOut; //删除线 …… } LOGFONT; 在对其进行设置时,lfOutPrecision、lfClipPrecision、lfQuality 以及lfPitchAndFamily这几个成员变量一般可如下设置而无需改动: LOGFONT lf; //lf定义字体属性 lf.lfOutPrecision= OUT_STROKE_PRECIS; lf.lfClipPrecision= CLIP_STROKE_PRECIS; lf.lfQuality = DRAFT_QUALITY; lf.lfPitchAndFamily= VARIABLE_ PITCH|FF_MODERN; 对于其他的成员变量则要根据实际需求进行具体的设定。例如,对于本文要显示的没有下划线和删除线并且没有倾斜处理的粗体幼圆汉字,可以采取如下设置: lf.lfHeight = 50; lf.lfWidth = 0; lf.lfEscapement = 0; lf.lfOrientation = 0; lf.lfWeight = FW_HEAVY; lf.lfItalic = FALSE; lf.lfUnderline = FALSE; lf.lfStrikeOut = FALSE; lf.lfCharSet = GB2312_CHARSET; strcpy(lf.lfFaceName,“幼圆”); 同其他使用CDC绘图类进行绘图的程序类似,对字体进行绘制处理也是在视类的OnDraw()函数中完成的。首先需要选择前面设定好的字体,由于3D文字的显示是靠两层(甚至更多层)文字的叠加而成,因此需要并将其背景设定透明,否则将仅在文字的轮廓处有3D效果,而文字内部仍是平面的: CFont* pOldFont = (CFont*)pDC->SelectObject(&m_font); pDC->SetBkMode(TRANSPARENT); 在此为了说明原理仅选择了两层文字进行叠加,可通过API函数GetSysColor获得当前系统的三维高亮度色和三维低亮度色,并对字体进行设置,由于3维文字是文字在前,阴影在后,所以需要先对阴影部分进行绘制: pDC->SetTextColor(::GetSysColor(COLOR_3DDKSHADOW)); pDC->TextOut(10,10,sTemp); //sTemp为待显示文字 此时的效果如下图所示,但仍是2维文字:

  为了显示出3维效果,需要在其上覆盖上一层高亮度文字,显然坐标不能仍是(10,10),否则显示出的文字仍是2维的。一般可通过错开一两个像素来达到不同光源位置的3D文字效果,比如在此就是在原位置向右上移动了3个像素,可通过在平面移动适当的距离来控制3D效果的深度: pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT)); pDC->TextOut(13,7,sTemp); 从下图可以看出此时已经具有了立体感相当强的视觉效果了:

另外,还可以通过设置路径对象来对普通的3D文字进行轮廓勾勒,使之具备特殊的3D效果: pDC->BeginPath(); //开始路径 pDC->TextOut(13,7,sTemp,19); //向路径输出汉字 pDC->EndPath(); //结束路径 pDC->SetPolyFillMode(WINDING); //填充路径 pDC->StrokeAndFillPath(); //绘制路径外观、设置填充模式 下图便为通过路径输出而得到的勾勒出轮廓的空心3D文字:

结束语 本文通过对CFont类和CDC绘图类的使用,结合色彩学的有关知识,成功地在VC下以简单的代码实现了效果比较好的3维立体文字。CFont类对字体控制的能力还是很强的,通过对CFont类的深入研究,可对字体的显示做出更加完备的控制。 (本文所述算法在Windows 98下,由Microsoft Visual C++ 6.0编译通过)
,Sun下周将发布StarOffice的公开测试版
2004-10-08
小猪优惠app下载-小猪优惠app是一款网络购物应用,是个能收集淘宝天猫等商城商家内部及独家优惠券发布并免费为用户提供优质的优惠券信息的移动工具。小猪优惠app旨在让用户们轻松买到物美价廉的产品,您可以免费下载安卓手机小猪优惠。
2020-04-28
神代梦华谭经津主怎么样?经津主好吗?神代梦华谭经津主值不值得入手?神代梦华谭经津主技能是什么?很多玩家都在问:神代梦华谭经津主怎么样?下面小编就为各位玩家带来:神代梦华谭经津主属性介绍。,神代梦华谭经津主怎么样 神代梦华谭经津主属性介绍
2017-02-08
魔兽世界7.2版本日前已经更新,相应的7.2大秘境词缀已经进行的更新,除了新加入四种词缀外,还将原有的词缀进行了调整,下面就来介绍一下魔兽世界7.2大秘境新词缀,魔兽世界7.2大秘境新词缀 魔兽世界7.2词缀一览
2017-02-08
10010联通网上营业厅app下载-10010联通网上营业厅app是一款联通自助服务软件,10010联通手机营业厅让您随时随地查询、办理各项业务,通过10010联通网上营业厅app一手掌握联通最新资讯,真正实现“一厅在手,服务无忧”,您可以免费下载安卓手机10010手机营业厅。
2017-09-11
请勿疲劳驾驶app下载-请勿疲劳驾驶是一款安全提醒软件,通过人脸识别检测功能,检测驾驶员面部特征,当出现闭眼、打哈欠、左顾右盼的情况时APP会发出警报提醒驾驶员。,您可以免费下载安卓手机请勿疲劳驾驶。
2020-05-27
首先这个项目有收费的和免费的两种,这点在sprint官网可以看得到,收费的就是你使用sprint的手机号在全世界进行漫游,免费的是将机子彻底带出美国,而且不在美国使用之后才可以使用,关于sprint的国际漫游
2012-11-05
英魂之刃作为一款MOBA类游戏,手游版和电脑版玩家都可以体验到,具体英魂之刃手游和电脑版哪个更好玩呢?很多玩家都想要知道这个问题的答案,现在的手机配置在游戏方便的性能也不输于电脑多少,关键还是要从游戏可玩性和游戏难易度出发!,英魂之刃手游和电脑版哪个更好玩 英魂之刃手游与电脑端对比分析
2017-01-13
车词典app下载-车词典app是一款互联网用车服务平台,汽车配件应有尽有,只需动动手指头就能送货上门,此外车词典app还提供全面的机动车违章查询范围覆盖全国各地大中型城市,有车一族的朋友必备,您可以免费下载安卓手机车词典。
2016-04-11
正念软件是一种可以帮助用户放松身心的软件,正念app内置多种方法可以帮助用户释放压力,有冥想音乐、白噪音,各种自然的声音,还有冥想课程,帮助你解压,提高专注力,下面就为大家推荐免费好用的正念软件。
2023-12-02