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

来源:互联网 发布:python 守护进程 编辑:程序博客网 时间:2024/05/09 18:51

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

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

  字样是字符书写和显示时表现出的特定模式,例如,对于汉字,通常有宋体、楷体、仿宋、黑体、隶书以及幼圆等多种字样。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(纹理画刷),甚至是渐变画刷。例如下面的代码


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来控制文本输出的质量。例如下面的代码

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);

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/warsour/archive/2009/06/30/4308866.aspx

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 轿车加了假汽油怎么办? 电信4g变成3g怎么办 电信流量超过40g怎么办 联通卡网络信号很差怎么办 电马桶马达坏了怎么办 我这么好看别人看不到怎么办 户口打回原籍不接受怎么办 小电充电宝丢失怎么办 qq连续聊天断了怎么办 胚胎怀疑在切口处怎么办 3D渲染没有材质怎么办 员工拒绝签收员工手册怎么办 二级密码错了三次怎么办 棉签掉到耳朵里怎么办 发财树叶子有黄斑怎么办 翠兰的颈枯萎了怎么办 翠兰主干软了怎么办 花叶子长白色粘粉末怎么办 水培转土培栀子花叶子蔫了怎么办 水冷空调水不循环怎么办 哺乳期乳房一个大一个小怎么办 我喝酒后喂奶了怎么办 磁盘目录不具有读写权限怎么办 玻纤网格布扎手怎么办 模拟城市5细菌太多怎么办 空气风犁叶子卷怎么办 晚上腿比早上粗怎么办 新疆公安边防改革新兵怎么办 专升本没有考上怎么办 摩托车漏检了2年怎么办 19年北京外地车怎么办 汽车遥控钥匙按键坏了怎么办 长安逸动噪音大怎么办 微信设置密码参数错误怎么办 太阳能电加热不加热怎么办 没报到换了工作怎么办 大学最后一年入伍入伍毕业证怎么办 当官不为民做主怎么办 去青海高反了怎么办 地暖地板低于客厅地面怎么办 9万月3分利息怎么办