IGPGraphics 中绘制文本相关的方法和属性:
IGPGraphics.DrawString(); { 绘制文本 }
IGPGraphics.MeasureString(); { 获取指定格式的字符串需要的矩形 }
IGPGraphics.MeasureCharacterRanges(); { 获取指定字符所在的区域 }
IGPGraphics.DrawDriverString(); { 绘制可指定间距的文本 }
IGPGraphics.MeasureDriverString(); { 获取可指定间距文本所需要的矩形范围 }
IGPGraphics.TextRenderingHint; { 获取或设置文本呈现模式 }
IGPGraphics.TextContrast; { 灰度校正值(消除锯齿和 ClearType 文本的伽玛值校正: 0..12, 默认是 4) }
DrawString 的三种用法:
uses GdiPlus;
procedure TForm1.FormPaint(Sender: TObject);
var
Graphics: IGPGraphics;
str: string;
Font: IGPFont;
Pt: TGPPointF;
Brush: IGPSolidBrush;
StringFormat: IGPStringFormat;
Rect: TGPRectF;
begin
Graphics := TGPGraphics.Create(Handle);
//
str := 'Delphi 2010';
Font := TGPFont.Create('Arial Black', 16);
Pt.Initialize(0, 10);
Brush := TGPSolidBrush.Create($FF228B22);
Graphics.DrawString(str, Font, Pt, Brush);
//
Pt.X := ClientWidth;
Brush.Color := $FF0000FF;
StringFormat := TGPStringFormat.Create([StringFormatFlagsDirectionRightToLeft]);
Graphics.DrawString(str, Font, Pt, StringFormat, Brush);
//
Brush.Color := $FFFF0000;
Rect.Initialize(0, 0, ClientWidth, ClientHeight);
StringFormat.FormatFlags := [StringFormatFlagsDirectionVertical];
StringFormat.Alignment := StringAlignmentCenter;
StringFormat.LineAlignment := StringAlignmentCenter;
Graphics.DrawString(str, Font, Rect, StringFormat, Brush);
end;
MeasureString 测试:
uses GdiPlus;
procedure TForm1.FormPaint(Sender: TObject);
var
Graphics: IGPGraphics;
str: string;
Font: IGPFont;
Pt: TGPPointF;
Brush: IGPSolidBrush;
Pen: IGPPen;
StringFormat: IGPStringFormat;
Rect, MeasureRect: TGPRectF;
begin
Graphics := TGPGraphics.Create(Handle);
Graphics.Clear($FFFFFFFF);
Brush := TGPSolidBrush.Create($FF228B22);
Pen := TGPPen.Create($FF000000);
//
str := 'Delphi 2010';
Font := TGPFont.Create('Arial Black', 16);
Pt.Initialize(10, 10);
Graphics.DrawString(str, Font, Pt, Brush);
MeasureRect := Graphics.MeasureString(str, Font, Pt, nil);
Graphics.DrawRectangle(Pen, MeasureRect);
//
Brush.Color := $FFFF0000;
Rect.Initialize(0, 0, ClientWidth, ClientHeight);
StringFormat := TGPStringFormat.Create;
StringFormat.Alignment := StringAlignmentCenter;
StringFormat.LineAlignment := StringAlignmentCenter;
Graphics.DrawString(str, Font, Rect, StringFormat, Brush);
MeasureRect := Graphics.MeasureString(str, Font, Rect, StringFormat);
Graphics.DrawRectangle(Pen, MeasureRect);
end;
SetMeasurableCharacterRanges 测试:
uses GdiPlus;
procedure TForm1.FormPaint(Sender: TObject);
var
Graphics: IGPGraphics;
str: string;
Font: IGPFont;
CharRange1,CharRange2: TGPCharacterRange;
CharRanges: IGPCharacterRanges;
Rect: TGPRectF;
StringFormat: IGPStringFormat;
Brush,BrushBack: IGPBrush;
Regions: IGPRegions;
R1,R2: TGPRectF;
begin
Graphics := TGPGraphics.Create(Handle);
str := '万一的 Delphi 博客';
Font := TGPFont.Create('微软雅黑', 20);
Brush := TGPSolidBrush.Create($FFFF0000);
BrushBack := TGPSolidBrush.Create($FFC0C0C0);
CharRanges := TGPArray<TGPCharacterRange>.Create(2);
CharRange1.Initialize(0, 2);
CharRange2.Initialize(4, 6);
CharRanges[0] := CharRange1;
CharRanges[1] := CharRange2;
StringFormat := TGPStringFormat.Create;
StringFormat.SetMeasurableCharacterRanges(Charranges);
Rect.Initialize(20, 20, ClientWidth, ClientHeight);
Regions := Graphics.MeasureCharacterRanges(str, Font, Rect, StringFormat);
Regions[0].GetBounds(R1, Graphics);
Regions[1].GetBounds(R2, Graphics);
Graphics.FillRectangle(BrushBack, R1);
Graphics.FillRectangle(BrushBack, R2);
Graphics.DrawString(str, Font, Rect.Location, Brush);
end;
DrawDriverString 测试:
uses GdiPlus;
procedure TForm1.FormPaint(Sender: TObject);
var
Graphics: IGPGraphics;
Font: IGPFont;
Brush: IGPSolidBrush;
Pts: array of TGPPointF;
str: string;
i: Integer;
begin
Graphics := TGPGraphics.Create(Canvas.Handle);
Brush := TGPSolidBrush.Create($FF8A2BE2);
str := 'ABCDEFG';
SetLength(Pts, Length(str));
for i := 0 to Length(str) - 1 do
begin
Pts[i].X := i * 50 + 20;
Pts[i].Y := 60;
end;
Font := TGPFont.Create('Arial Black', 32);
Graphics.DrawDriverString(PUint16(PChar(str)),
Length(str),
Font,
Brush,
@Pts[0],
[DriverStringOptionsCmapLookup],
nil
);
end;
IGPGraphics.TextRenderingHint 测试:
{
TextRenderingHintSystemDefault // 使用字体的默认设置
TextRenderingHintSingleBitPerPixelGridFit // 符号位图 + hinting 技术(改善字符主干和弯曲部分)
TextRenderingHintSingleBitPerPixel // 符号位图(不使用 hinting 技术时字体会更宽一些)
TextRenderingHintAntiAliasGridFit // 消除锯齿 + hinting 技术
TextRenderingHintAntiAlias // 消除锯齿
TextRenderingHintClearTypeGridFit // ClearType 文本 + hinting 技术
}
uses GdiPlus;
procedure TForm1.FormPaint(Sender: TObject);
var
Graphics: IGPGraphics;
Brush: IGPSolidBrush;
Font: IGPFont;
Pt: TGPPointF;
begin
Graphics := TGPGraphics.Create(Handle);
Brush := TGPSolidBrush.Create($FFB22222);
Font := TGPFont.Create('Arial Black', 24);
Pt.Initialize(10, 10);
Graphics.TextRenderingHint := TextRenderingHintSystemDefault;
Graphics.DrawString('SystemDefault', Font, Pt, Brush);
Pt.Y := Pt.Y + Font.GetHeight(Graphics) + 10;
Graphics.TextRenderingHint := TextRenderingHintSingleBitPerPixelGridFit;
Graphics.DrawString('SingleBitPerPixelGridFit', Font, Pt, Brush);
Pt.Y := Pt.Y + Font.GetHeight(Graphics) + 10;
Graphics.TextRenderingHint := TextRenderingHintSingleBitPerPixel;
Graphics.DrawString('SingleBitPerPixel', Font, Pt, Brush);
Pt.Y := Pt.Y + Font.GetHeight(Graphics) + 10;
Graphics.TextRenderingHint := TextRenderingHintAntiAliasGridFit;
Graphics.DrawString('AntiAliasGridFit', Font, Pt, Brush);
Pt.Y := Pt.Y + Font.GetHeight(Graphics) + 10;
Graphics.TextRenderingHint := TextRenderingHintAntiAlias;
Graphics.DrawString('AntiAlias', Font, Pt, Brush);
Pt.Y := Pt.Y + Font.GetHeight(Graphics) + 10;
Graphics.TextRenderingHint := TextRenderingHintClearTypeGridFit;
Graphics.DrawString('ClearTypeGridFit', Font, Pt, Brush);
end;
//后接 "关于文本绘制续"