在线答疑VC++GDI+编程的字体和⽂本绘制
字体是⽂字显⽰和打印的外观形式,它包括了⽂字的字样、风格和尺⼨等多⽅⾯的属性。适当地选⽤不同的字体,可以⼤⼤地丰富⽂字的外在表现⼒。例如,把⽂字中某些重要的字句⽤较粗的字体显⽰,能够体现出突出、强调的意图。当然,⽂本输出时还可使⽤其格式化属性和显⽰质量来优化⽂本显⽰的效果。
字体属性和字体创建
字体属性和字体创建
字体的属性有很多,这⾥主要介绍字样、风格和尺⼨三个主要属性。
字样是字符书写和显⽰时表现出的特定模式,例如,对于汉字,通常有宋体、楷体、仿宋、⿊体、⾪书以及幼圆等多种字样。GDI+是通过FontFamily类来定义字样的,例如下⾯的代码:
FontFamily fontFamily(L"幼圆"); // 定义"幼圆"字样
字体风格主要表现为字体的粗细和是否倾斜等特点。GDI+为⽤户提供了⼀些预定义的字体风格:FontStyleRegular(正常)、FontStyleBold(加粗)、FontStyleItalic(斜体)、FontStyleBoldItalic (粗斜体)、FontStyleUnderline(下划线)和FontStyleStrikeout(删除线)。
willandgrace字体尺⼨是⽤来指定字符所占区域的⼤⼩,通常⽤字符⾼度来描述。字体尺⼨可以取毫⽶或英⼨作为单位,但为了直观起见,也常常采⽤⼀种称为点的单位,⼀点约折合为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所⽰。
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"字体优化,但边不作平滑处理";profile什么意思
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);
space是什么
graphics.DrawString(
string3, (INT)wcslen(string3), &font, PointF(10, 90), &solidBrush);
⽂本格式化属性
gol⽂本的格式属性通常包括对齐⽅式、字符间隔以及⽂本调整等。GDI+提供StringFormat类来控制这些格式属性,通常我们调⽤以下⼏个函数来进⾏相关属性设置。
Status SetAlignment( StringAlignment align);
Status SetLineAlignment( StringAlignment align);
该函数⽤来设置⽂本对齐⽅式,align可以是StringAlignmentNear(左对齐或右对齐,取决于书写⽅向是从左到右还是从右到左)、StringAlignmentCenter(居中)或StringAlignmentFar(两端对齐)。
Status SetFormatFlags( INT flags );
该函数⽤来设置⽂本格式化标志,flags可以是StringFormatFlagsDirectionRightToLeft(⽔平阅读⽅向是从右向左)和StringFormatFlagsDirectionVertical(垂直⽂本)等值。例如下⾯的代码,其结果如图7.16所⽰。
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);
⽂本对齐⽅式:
Delphi
微软
说明
StringAlignmentCenter
Center
指定⽂本在布局矩形中居中对齐。
StringAlignmentFar
Far
指定⽂本远离布局矩形的原点位置对齐。在左到右布局中,远端位置是右。在右到左布局中,远端位置是左。
StringAlignmentNear
Near
指定⽂本靠近布局对齐。在左到右布局中,近端位置是左。在右到左布局中,近端位置是右。
killing time at home
⽂本格式化标志:
Delphi
微软
说明
StringFormatFlagsDirectionRightToLeft
DirectionRightToLeft
按从右向左的顺序显⽰⽂本。
StringFormatFlagsDirectionVertical
DirectionVertical
⽂本垂直对齐。
StringFormatFlagsDisplayFormatControl
DisplayFormatControl
控制字符(如从左到右标记)随具有代表性的标志符号⼀起显⽰在输出中。
StringFormatFlagsFitBlackBox
FitBlackBox
允许部分字符延伸该字符串的布局矩形。默认情况下,将重新定位字符以避免任何延伸。
StringFormatFlagsLineLimit
LineLimit
在格式化的矩形中只布置整⾏。默认情况下,这种布置要继续到⽂本的结尾为⽌,或者到由于剪辑⽽
西藏景点不再有可见的⾏为⽌,看哪⼀种情况先发⽣。注意,此默认设置允许不是⾏⾼整数倍的格式化矩形将最后⼀⾏部分地遮住。若要确保看到的都是整⾏,请指定此值,并仔细地提供格式化矩形,使其⾼度⾄少为⼀个⾏⾼。美食从天而降2
StringFormatFlagsMeasureTrailingSpaces
MeasureTrailingSpaces
包括每⼀⾏结尾处的尾随空格。在默认情况下,MeasureString ⽅法返回的边框都将排除每⼀⾏结尾处的空格。设置此标记以便在测定时将空格包括进去。
StringFormatFlagsNoClip
NoClip
允许显⽰标志符号的伸出部分和延伸到边框外的未换⾏⽂本。在默认情况下,延伸到边框外侧的所有⽂本和标志符号部分都被剪裁。
StringFormatFlagsNoFontFallback
NoFontFallback
对于请求的字体中不⽀持的字符,禁⽤回退到可选字体。缺失的任何字符都⽤缺失标志符号的字体显⽰,通常是⼀个空的⽅块。
StringFormatFlagsNoWrap
NoWrap
在矩形内设置格式时,禁⽤⽂本换⾏功能。当传递的是点⽽不是矩形时,或者指定的矩形⾏长为零时,已隐含此标记。