`

VC++ GDI+编程的字体和文本绘制

    博客分类:
  • VC
阅读更多

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

字体属性和字体创建

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

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

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

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

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

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

Font font(&fontFamily, 12, FontStyleRegular, UnitPoint);

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

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

Font( HDC hdc, const LOGFONTW* logfont)

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

文本输出

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

DrawString( const WCHAR* string, INT length, const Font* font,
const RectF& layoutRect, const StringFormat* stringFormat,
const Brush* brush );

DrawString( const WCHAR* string, INT length, const Font* font,
const PointF& origin, const Brush* brush );

DrawString( const WCHAR* string, INT length, const Font* font,
const PointF& origin, const StringFormat* stringFormat,
const Brush* brush);

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



Graphics graphics( pDC->m_hDC );

FontFamily fontFamily(L"幼圆");
Font font(&fontFamily, 20, FontStyleRegular, UnitPoint);
PointF pointF(30, 10);
Image image(L"image.jpg");
TextureBrush tBrush(&image);

LinearGradientBrush linGrBrush(
Point(30, 50),
Point(100, 50),
Color(255, 255, 0, 0), 
Color(255, 0, 0, 255)); 

WCHAR string[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所示。

Graphics graphics( pDC->m_hDC );

FontFamily fontFamily(L"楷体_GB2312");
Font font(&fontFamily, 30, FontStyleRegular, UnitPixel);
SolidBrush solidBrush(Color(255, 0, 0, 255));
WCHAR string1[] = L"没有任何优化处理";
WCHAR string2[] = L"字体优化,但边不作平滑处理";
WCHAR string3[] = 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);



文本格式化属性

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

Status SetAlignment( StringAlignment align);
Status SetLineAlignment( StringAlignment align);

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

Status SetFormatFlags( INT flags );

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

Graphics graphics( pDC->m_hDC );
SolidBrush solidBrush(Color::Blue); 
FontFamily fontFamily(L"楷体_GB2312");
Font font(&fontFamily, 16, FontStyleRegular, UnitPoint);

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

graphics.DrawString( string, (INT)wcslen(string), &font, 
RectF(30, 30, 150, 200), &stringFormat, &solidBrush);

分享到:
评论
1 楼 gfdice 2010-08-26  
想知道字体大小和字体实际画出来之后的高度的关系。
现在的情况是用UnitPixel为12的字体往一个高度为12像素的Rect中DrawString时,明显字体过大。
使用MeasureString倒是可以算出字体大小为12像素的字体的实际高度,但是反向的计算却不知道在哪里。

相关推荐

    Visual C++.NET进行GDI+编程

    用Visual C++.NET进行GDI+编程 Visual C++.NET GDI+编程基础 VC++ GDI+编程的字体和文本绘制 基于VC.NET的GDI+图像处理

    VC++.NET案例开发集锦源代码.part1

    第二章 图形图像处理—GDI+编程 案例1 绘制风格迥异的直线 案例2 绘制贝济埃曲线 案例3 不规则窗体的实现 案例4 如何在上传的图片上加上版权文字 案例5 在图片中绘制水印效果图 案例6 动态多边形 案例7 ...

    《VC++.NET精彩百例》配套代码

    第8章 OLE和GDI+编程 实例 87 OLE容器 实例 88 保存OLE信息 实例 89 设置跟踪矩形 实例 90 显示多个OLE项 实例 91 ActiveX服务器 实例 92 插值模式 实例 93 图像区域平铺 实例 94 文字填充 实例 95 图形容器 ...

    Visual C++ 6.0编程实例详解.part2

    6.6 字体和文本 6.6.1 字体类型和字体属性 6.6.2 TEXTMETETRIC结构 6,6.3 LOGFONT结构 6.6.4 创建CFont对象 6.6.5 绘制文本 6.6.6 实例 第7章 数据库编程 7.1 ODBC类 7.1.1 CDatabase类 ...

    Visual C++ 6.0编程实例详解.part1

    6.6 字体和文本 6.6.1 字体类型和字体属性 6.6.2 TEXTMETETRIC结构 6,6.3 LOGFONT结构 6.6.4 创建CFont对象 6.6.5 绘制文本 6.6.6 实例 第7章 数据库编程 7.1 ODBC类 7.1.1 CDatabase类 ...

Global site tag (gtag.js) - Google Analytics