现在的位置: 首页 > 综合 > 正文

vc++字体类CFont详解及用法实例《转》

2013年08月22日 ⁄ 综合 ⁄ 共 4569字 ⁄ 字号 评论关闭
CFont详解:
 Windows提供了多种与设备无关的不同尺寸的字体。有效地使用这些Windows字体,不用在编程时下很大功夫,就可以明显地增强各种应用程序的功能。字体是Windows GDI必要的组成部分,这意味字体的使用与其他GDI对象一样。它们可以缩放和剪切,可以像选取画笔或者画刷一样选取设备环境。所有关于撤消选中和删除的GDI规则都适用于字体。
字体由CFont类进行管理,创建CFont类必须使用CFont类的成员函数,这点与CPen和CBrush有所不同。
1.CFont提供的创建字体的成员函数
利用CFont创建字体的方法有两种,它们是:
(1)BOOL CreateFontIndirect(const LOGFONT* lpLogFont )
该对象通过LOGFONT结构创建字体,LOGFONT结构的定义如下:
typedef struct tagLOGFONT {
	LONG lfHeight;
	LONG lfWidth;
	LONG lfEscapement;
	LONG lfOrientation;
	LONG lfWeight;
	BYTE lfItalic;
	BYTE lfUnderline;
	BYTE lfStrikeOut;
	BYTE lfCharSet;
	BYTE lfOutPrecision;
	BYTE lfClipPrecision;
	BYTE lfQuality;
	BYTE lfPitchAndFamily;
	TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;

LOGFONT结构中各个成员的含义如下:
lfHeight:设置字体的高度。
lfWidth:设置字体的平均宽度。
LfEscapement:设定字符串底线与水平线的夹角,夹角是以0.1度为单位。
lfOrientation:设定每一个字符的底线与水平线的夹角,夹角是以0.1度为单位。
lfWeight:设置字体的粗细,其取值范围为0~1000,通常400为正常粗细,700为粗,如果取值为0,则选择默认粗细。
lfItalic:如果为TRUE,则字体为斜体。
lfUnderline:如果为TRUE,则字体带下划线。
lfStrikeOut:如果为TRUE,则字体带删除线。
lfCharSet:指定字符集。
LfOutPrecision:指定输出时字体的精度。
lfClipPrecision:指定输出时字体被裁剪的精度。
lfQuality:指定输出质量。
lfPitchAndFamily:设置字体的斜度和字体类型。
lfFaceName[LF_FACESIZE]:设置字体字样。
(2)CreateFont()成员函数
CreateFont()成员函数的原型:

BOOL CreateFont(
	int nHeight,                //以逻辑单位方式指定字体的宽度
	int nWidth,                //以逻辑单位方式指定字体中字符的平均宽度
	int nEscapement,            //指定偏离垂线和X轴在显示面上的夹角(单位:0.1度)
	int nOrientation,      //指定符串基线和X轴之间的夹角(单位:0.1度)
	int nWeight,                //指定字体镑数
	BYTE bItalic,              //指定字体是否为斜体
	BYTE bUnderline,           //指定字体是否带下划线
	BYTE cStrikeOut,           //指定是否是字体字符突出
	BYTE nCharSet,            //指定字体的字符集
	BYTE nOutPrecision,       //指定所需的输出精度
	BYTE nClipPrecision,       //指定所需的剪贴精度
	BYTE nQuality,           //指示字体的输出质量
	BYTE nPitchAndFamily,     //指定字体的间距和家族
	LPCTSTR lpszFacename  //指定字体字样的名称
	)

参数说明:
nHeight:其取值范围可以大于0、等于0或小于0。nHeight以逻辑单位方式指定字体的高度,字体的高度可任选下列值。
     大于0:此时高度被转化为设备单位,与可用字体的网格高度做比较。
     等于0:使用合理的缺省大小。
     小于0:此时高度被转化为设备单位,而绝对值与可用字体的字符高度做比较。
注意:nHeight绝对值在转化后不可超过16384设备单位。
nEscapement:指定偏离垂线与X轴在显示面上的夹角。偏离垂线是从一行中开始到最后一个字符的线,此角从x轴逆时针方向度量。
nOrientation:指定字符基线和X轴之间的夹角。此度数在坐标轴中由X轴逆时针方向度量时坐标系中Y轴向下,顺时针方向从X轴旋转时,Y轴向上。
用法举例:
 

(一)显示倾斜的文字

 上文中的图一显示了通过显示一系列的倾斜字符串来实现环绕显示的效果,下面来详细说明如何实现这个效果。

 实现上述的效果其实很容易,只要使用CFONT类和LOGFONT结构来灵活的创建字体,设置字体的属性,就可以实现倾斜文字的效果。LOGFONT结构中包含了所要创建的字体中的全部信息,其中的ifEscapement 成员制定了所创建的字体与水平方向所倾斜的角度,需要读者注意的是该成员变量角度的单位是十分之一度而不是度,例如,如果ifEscapement定义为 450,它表示字体的倾斜角度为45度。为了保证所有的字体按照一个方向旋转,一定要设置ifEscapenent的CLIP_LH_ANGLES位,否则字体有可能向反方向旋转。

 如同使用其它GDI(图形用户界面接口)对象一样,在使用你定义的字体以前,必须要将创建的字体选入DC中(设备上下文)。

 (二)实现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);
}

抱歉!评论已关闭.