??具体实现
??在实现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维文字:
:[[center]][[image1]][[/center]]
??为了显示出3维效果,需要在其上覆盖上一层高亮度文字,显然坐标不能仍是(10,10),否则显示出的文字仍是2维的。一般可通过错开一两个像素来达到不同光源位置的3D文字效果,比如在此就是在原位置向右上移动了3个像素,可通过在平面移动适当的距离来控制3D效果的深度:
pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
pDC->TextOut(13,7,sTemp);
??从下图可以看出此时已经具有了立体感相当强的视觉效果了::
[[center]][[image2]][[/center]]
??另外,还可以通过设置路径对象来对普通的3D文字进行轮廓勾勒,使之具备特殊的3D效果:
pDC->BeginPath(); //开始路径
pDC->TextOut(13,7,sTemp,19);
//向路径输出汉字
pDC->EndPath(); //结束路径
pDC->SetPolyFillMode(WINDING); //填充路径
pDC->StrokeAndFillPath(); //绘制路径外观、设置填充模式
??下图便为通过路径输出而得到的勾勒出轮廓的空心3D文字:
:[[center]][[image3]][[/center]]
结束语
??本文通过对CFont类和CDC绘图类的使用,结合色彩学的有关知识,成功地在VC下以简单的代码实现了效果比较好的3维立体文字。CFont类对字体控制的能力还是很强的,通过对CFont类的深入研究,可对字体的显示做出更加完备的控制。