您所在的位置: 首页>>开发>>.Net>>vc++.net>>

Visual C++实现各种文字特殊效果(2)

  • 摘要:本文针对Visual C++编程中实现文字的特殊显示效果这一问题,通过编写一个简单的小程序,介绍如何实现这一目标。读者朋友可以稍加改动,将该方法应用到自己的程序中去。
  • 标签:Visual C++  文字  特效

(二)实现3D文字

计算机屏幕是平面二维的,我们之所以能欣赏到真如实物般的三维图像,是因为显示在计算机屏幕上时色彩灰度的不同而使人眼产生视觉上的错觉,而将二维的计算机屏幕感知为三维图像。基于色彩学的有关知识,三维物体边缘的凸出部分一般显高亮度色,而凹下去的部分由于受光线的遮挡而显暗色。这一认识被广泛应用于网页或其他应用中对按钮、3D线条的绘制。对于本文所要绘制的3D文字同样也适用,即在原始位置显示高亮度颜色,而在左下或右上等位置用低亮度颜色勾勒出其轮廓,这样在视觉上便会产生3D文字的效果。具体实现时,可用完全一样的字体在不同的位置分别绘制两个不同颜色的2D文字,只要使两个文字的坐标合适,就完全可以在视觉上产生出不同效果的3D文字。

具体实现的思想是通过CDC::SetTextColor()分别设置文字的颜色为高亮(3DHILIGHT)和阴影(3DSHADOW)的状态下显示文字;同时注意在两次显示文字时要错开几个像素,这样才能达到预期的效果。实现的效果上文的图二所示。

(三)文字的渐变效果

为了实现文字的渐变效果,需要设置一个定时器(使用SetTimer()函数),在定时器响应函数处理过程中,通过调用CDC:SetTextColor()函数不断改变设备上下文中文本的显示颜色,从而实现文字的渐变效果。文本的颜色是通过RGB(红、绿、兰)三种基本颜色的混合所形成的最终结果,RGB三基色的变化范围都是(0,255),R=G=B时,颜色的效果是灰色的,所谓灰色,就是在纯白和纯黑之间的一种过渡色,当R=G=B=0时,颜色为黑色,当R=G=B=255时,颜色为纯白色,可以定义一个修正变量,不断的对该三基色进行递增或递减,从而实现文字的渐变显示。这里仅仅给出实现的思路,读者自己可以很容易的实现代码。

(四)其它

另外,还可以通过设置路径对象来对普通的文字进行轮廓勾勒,使之具备特殊的效果。路径是Win32中新增的一个GDI对象,下面先从概念上谈起。

1)路径的概念

在Windows 95/NT 这样的Win32操作系统中,除了已有的位图,画笔,画刷,字体,调色板和区域之外,还增加了一个新的GDI对象:路径。路径是可以被填充,画出轮廓或同时被画出轮廓并填充的一个或多个图形。路径的引入,大大地丰富了Windows的图形功能,使得应用程序可以方便地建立复杂区域,绘制和填充不规则图形。这里说的不规则图形是指由直线和贝塞尔曲线组成的图形(相对于矩形,多边形,椭圆等规则图形)。

2)路径的使用

与其它原有的GDI对象不同的是,MFC类库没有专门用一个C++类来封装路径对象(或许在以后的版本中会得到支持)。有关路径的定义和使用等各种操作都必须通过调用API函数(或CDC类中对应的成员函数)来实现。路径的使用过程大致如下:

(1)调用BeginPath()函数开始路径定义;
(2)调用GDI绘图函数来定义路径;在Win32中,可以用于定义路径的GDI绘图函数包括:AngleArc()、Arc()、ArcToChord()、Ellipse()、LineTo()、TextOut()等函数;
(3)调用EndPath()函数结束路径定义; 
完成路径定义后,所定义的路径即被同时选进设备描述表,设备描述表中原有的路径对象在调用BeginPath()函数开始路径定义时即被废弃。
(4)使用路径对象。

完成路径定义工作之后,应用程序便可以利用有关GDI函数来使用路径,这些函数包括绘制路径轮廓StrokePath(),填充路径FillPath(),绘制轮廓并填充StrokeAndFillPath(),把路径转换成区域PathToRegion(),把路径直线化FlattenPath(),提取路径数据GetPath(),加宽路径WidenPath()和设置裁剪路径SelectClipPath()等。这些函数的具体使用方法可参阅有关的SDK文档。

下面的代码演示了如何实现字体的空心效果:

应用程序主窗口的重绘函数

void CMyWnd::OnPaint()
{
 // 获得窗口的客户区设备上下文句柄
 CPaintDC dc(this); // 更改当前字体
 LOGFONT lf;
 dc.GetCurrentFont()->GetLogFont(&lf);
 CFont font;
 CFont *pOldFont; // 保存设备上下文最初使用的字体对象
 lf.lfCharSet=134;
 lf.lfHeight=-150;
 lf.lfHeight=-150;
 lf.lfWidth=0;
 strcpy(lf.lfFaceName, "隶书");
 font.CreateFontIndirect(&lf);
 pOldFont=dc.SelectObject(&font);
 dc.SetBkMode(TRANSPARENT); // 更改当前画笔
 CPen pen(PS_SOLID, 1, RGB(255, 0, 0));
 CPen *pOldPen;
 pOldPen=dc.SelectObject(&pen); // 开始一个路径
 dc.BeginPath();
 dc.TextOut(10, 10, "空心字");
 dc.EndPath(); // 绘制路径
 dc.StrokePath();
 //可以用dc.StrokeAndFillPath()函数来代替,不过该函数会使用当前刷子填充路径的内部。
 dc.SelectObject(pOldFont);
 dc.SelectObject(pOldPen);
}


共3页: 上一页 [1] 2 [3] 下一页
【内容导航】
深入Vista应用程序开发
走向银光 —— 一步一步学Silverlight2
让你的代码“炫”起来——WPF开发教程
WebSphere 实现SOA的利器
初探敏捷开发
 
 验证码: (点击刷新验证码)   匿名发表
  • Visual C++ 完全自学宝典

  • 作者:强锋科技,朱洪波
  • Visual C++ 6.0是微软公司为程序人员提供的Visual Studio 6.0工具套件中的重要组成部分。本书由浅入深地介绍使用Visual C++ 6.0..
Copyright©2005-2008 51CTO.COM 版权所有