请教画立体字的方法。突起或者陷下的效果
最好有源代码 问题点数:50、回复次数:4Top
1 楼hugos(疯狂老鼠)回复于 2004-08-01 08:41:24 得分 0
dos下自己画,windows下用word好了Top
2 楼OnlyHappy(说好不打脸)回复于 2004-08-01 08:47:01 得分 0
晕哦。俺要在程序的对话框中用GDI画出来Top
3 楼BLsoft(網龍ζ龍活)(Cyber-Security of [MVP])回复于 2004-08-01 08:47:13 得分 50
思路很简单,你可以先打出一行字来.然后在X Y坐标上分别+1就可以了(当然RGB应该是不同值)
OR
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维文字:
<img src="http://www.pconline.com.cn/pcedu/empolder/gj/vc/10302/pic/030226cw1.jpg">
为了显示出3维效果,需要在其上覆盖上一层高亮度文字,显然坐标不能仍是(10,10),否则显示出的文字仍是2维的。一般可通过错开一两个像素来达到不同光源位置的3D文字效果,比如在此就是在原位置向右上移动了3个像素,可通过在平面移动适当的距离来控制3D效果的深度:
pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
pDC->TextOut(13,7,sTemp);
从下图可以看出此时已经具有了立体感相当强的视觉效果了:
<img src="http://www.pconline.com.cn/pcedu/empolder/gj/vc/10302/pic/030226cw2.jpg">
另外,还可以通过设置路径对象来对普通的3D文字进行轮廓勾勒,使之具备特殊的3D效果:
pDC->BeginPath(); //开始路径
pDC->TextOut(13,7,sTemp,19);
//向路径输出汉字
pDC->EndPath(); //结束路径
pDC->SetPolyFillMode(WINDING); //填充路径
pDC->StrokeAndFillPath(); //绘制路径外观、设置填充模式
Top
4 楼OnlyHappy(说好不打脸)回复于 2004-08-01 08:58:24 得分 0
正是我想要的。谢了Top




