用户名: 密码: 验证码: gdcode 注册

VCGDI编程的字体和文本绘制

时间:2007-06-15 来源: 作者: 【字体: 减小 增大点击: 收藏 | 投稿
  
字体是文字显示和打印的外观形式,它包括了文字的字样、风格和尺寸等多方面的属性。适当地选用不同的字体,可以大大地丰富文字的外在表现力。例如,把文字中某些重要的字句用较粗的字体显示,能够体现出突出、强调的意图。当然,文本输出时还可使用其格式化属性和显示质量来优化文本显示的效果。

  字体属性和字体创建

  字体的属性有很多,这里主要介绍字样、风格和尺寸三个主要属性。

  字样是字符书写和显示时表现出的特定模式,例如,对于汉字,通常有宋体、楷体、仿宋、黑体、隶书以及幼圆等多种字样。GDI是通过FontFamily类来定义字样的,例如下面的代码:
程序代码:

FontFamilyfontFamily(L"幼圆");//定义"幼圆"字样

  字体风格主要表现为字体的粗细和是否倾斜等特点。GDI为用户提供了一些预定义的字体风格:FontStyleRegular(正常)、FontStyleBold(加粗)、FontStyleItalic(斜体)、FontStyleBoldItalic(粗斜体)、FontStyleUnderline(下划线)和FontStyleStrikeout(删除线)。 财管家,园,fs119.net

  字体尺寸是用来指定字符所占区域的大小,通常用字符高度来描述。字体尺寸可以取毫米或英寸作为单位,但为了直观起见,也常常采用一种称为点的单位,一点约折合为1/72英寸。对于汉字,还常用号数来表示字体尺寸,初号字最大,以下依次为小初、一号、小一、二号、小二??,如此类推,字体尺寸起来越小。GDI为用户提供了UnitDisplay(1/75英寸)、UnitPixel(像素)、UnitPoint(点)、UnitInch(英寸)、UnitDocument(1/300英寸)、UnitMillimeter(毫米)等字体尺寸单位。

  使用GDI中的Font类,可以直接通过构造函数创建一个字体对象,例如下列代码:
程序代码:

Fontfont(&fontFamily,12,FontStyleRegular,UnitPoint);

  构造函数的第一个参数是用来指定FontFamily类对象指针,第二参数是用来指定字体的尺寸,它的实际大小取决于第四个参数所指定的尺寸单位。第三个参数用来指定字体风格。 财管.家园.fs119.net

  为了与原来的GDI字体相兼容,Font的构造函数还有另外一种型式:

程序代码:
Font(HDChdc,constLOGFONTW*logfont)

  其中,hdc是用来指定一个窗口的设备环境句柄,logfon是指向LOGFONT(逻辑字体)数据结构的指针。

财管家.园.fs119.net

财管 家园 fs119.net

财,管家园,fs119.net


财管家园,fs119.net

财.管家园.fs119.net

  文本输出

  文本的最终输出不仅依赖于文本的字体,而且还跟文本的颜色、对齐方式、字符间隔等有很大关系。GDI只有一个输出文本的函数DrawString,它的原型如下:

财软联,盟,fs119.net

程序代码:

DrawString(constWCHAR*string,INTlength,constFont*font,
constRectF&layoutRect,constStringFormat*stringFormat,
constBrush*brush);

DrawString(constWCHAR*string,INTlength,constFont*font,
constPointF&origin,constBrush*brush);

DrawString(constWCHAR*string,INTlength,constFont*font,
constPointF&origin,constStringFormat*stringFormat,
constBrush*brush);

  其中,string用来指定要输出的字符串,length表示该字符串的长度,font用来指定字体,layoutRect用来指定一个字符串所输出的矩形区域,stringFormat用来指定文本输出格式化属性,origin用来指定字符串输出的起点。需要注意的是,PointF和RectF类与Point和Rect类基本相同,所不同的是数据类型是浮点而后者是INT型。brush用来指定一个画刷,这个画刷既可以是SolidBrush和HatchBrush,也可以是TextureBrush(纹理画刷),甚至是渐变画刷。例如下面的代码,结果如图7.14所示。

财软 联盟 fs119.net




财软,联盟,fs119.net

程序代码:

Graphicsgraphics(pDC->m_hDC);

FontFamilyfontFamily(L"幼圆");
Fontfont(&fontFamily,20,FontStyleRegular,UnitPoint);
PointFpointF(30,10);
Imageimage(L"image.jpg");
TextureBrushtBrush(&image);

LinearGradientBrushlinGrBrush(
Point(30,50),
Point(100,50),
Color(255,255,0,0),
Color(255,0,0,255));

WCHARstring[256];
wcscpy(string,L"欢迎使用GDI!");

graphics.DrawString(string,(INT)wcslen(string),&font,pointF,&tBrush);
pointF.Y=50;
graphics.DrawString(string,(INT)wcslen(string),&font,pointF,
&linGrBrush);

  需要说明的是,在GDI中,我们可以通过SetTextRenderingHint来控制文本输出的质量。例如下面的代码,其结果如图7.15所示。
财.管家园.fs119.net

程序代码:

Graphicsgraphics(pDC->m_hDC);

FontFamilyfontFamily(L"楷体_GB2312");
Fontfont(&fontFamily,30,FontStyleRegular,UnitPixel);
SolidBrushsolidBrush(Color(255,0,0,255));
WCHARstring1[]=L"没有任何优化处理";
WCHARstring2[]=L"字体优化,但边不作平滑处理";
WCHARstring3[]=L"消除走样,且边作平滑处理";

graphics.SetTextRenderingHint(TextRenderingHintSingleBitPerPixel);
graphics.DrawString(
string1,(INT)wcslen(string1),&font,PointF(10,10),&solidBrush);

graphics.SetTextRenderingHint(TextRenderingHintSingleBitPerPixelGridFit);
graphics.DrawString(
string2,(INT)wcslen(string2),&font,PointF(10,50),&solidBrush);

graphics.SetTextRenderingHint(TextRenderingHintAntiAliasGridFit);
graphics.DrawString(
string3,(INT)wcslen(string3),&font,PointF(10,90),&solidBrush);

财 管家园 fs119.net

财软联盟 fs119.net

财软联 盟 fs119.net


财 软联盟 fs119.net

财 管家园 fs119.net

  文本格式化属性

  文本的格式属性通常包括对齐方式、字符间隔以及文本调整等。GDI提供StringFormat类来控制这些格式属性,通常我们调用以下几个函数来进行相关属性设置。

财软联,盟,fs119.net

程序代码:
StatusSetAlignment(StringAlignmentalign);
StatusSetLineAlignment(StringAlignmentalign);

  该函数用来设置文本对齐方式,align可以是StringAlignmentNear(左对齐或右对齐,取决于书写方向是从左到右还是从右到左)、StringAlignmentCenter(居中)或StringAlignmentFar(两端对齐)。

财管,家园,fs119.net

程序代码:

StatusSetFormatFlags(INTflags);

  该函数用来设置文本格式化标志,flags可以是StringFormatFlagsDirectionRightToLeft(水平阅读方向是从右向左)和StringFormatFlagsDirectionVertical(垂直文本)等值。例如下面的代码,其结果如图7.16所示。

财管,家园,fs119.net

程序代码:

Graphicsgraphics(pDC->m_hDC);
SolidBrushsolidBrush(Color::Blue);
FontFamilyfontFamily(L"楷体_GB2312");
Fontfont(&fontFamily,16,FontStyleRegular,UnitPoint);

StringFormatstringFormat;
stringFormat.SetFormatFlags(StringFormatFlagsDirectionRightToLeft|
StringFormatFlagsDirectionVertical|
StringFormatFlagsNoFitBlackBox);
stringFormat.SetAlignment(StringAlignmentCenter);
WCHARstring[]=L"这些文字是垂直居中且是从右到左的阅读次序,它们是通过\
SetFormatFlags和SetAlignment来设置的!";

graphics.DrawString(string,(INT)wcslen(string),&font,
RectF(30,30,150,200),&stringFormat,&solidBrush);
财软 联盟 fs119.net

财管,家园,fs119.net


文章摘自网络,如有侵权,请与我们联系.
数据统计中!!
上一篇:用VisualC.NET进行GDI编程
下一篇:没有了

精品课程推荐


相关文章
  • VCGDI编程的字体和文本绘制 2007-06-15 09:57:36
  • 用VisualC.NET进行GDI编程 2007-06-15 09:57:35
  • VC.NET实现应用程序XP风格 2007-06-15 09:57:34
  • 用VisualC.NET实现XML解析 2007-06-15 09:57:33
  • VC.NET中使用Windows.Forms 2007-06-15 09:57:31
  • VC.NET2003代码优化方法 2007-06-15 09:57:31

  • 用户名: 密码: 匿名? 注册