请教画立体字的方法。突起或者陷下的效果

OnlyHappy 2004-08-01 08:36:49
最好有源代码
...全文
288 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
OnlyHappy 2004-08-01
  • 打赏
  • 举报
回复
正是我想要的。谢了
名牌大灰狼 2004-08-01
  • 打赏
  • 举报
回复
思路很简单,你可以先打出一行字来.然后在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(); //绘制路径外观、设置填充模式
OnlyHappy 2004-08-01
  • 打赏
  • 举报
回复
晕哦。俺要在程序的对话框中用GDI画出来
hugos 2004-08-01
  • 打赏
  • 举报
回复
dos下自己画,windows下用word好了

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧