Если вы используете DrawText()
вместо Canvas.TextOut()
, это работает. Причина объясняется в этом SO-ответе . Это связано с кернингом символов, применяемым различными windows API к определенным шрифтам.
вот полный рабочий пример:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FFont: TFont;
public
{ Public declarations }
end;
type TMyChar = record
BGColor : TColor;
FGColor : TColor;
Character : Char;
end;
const
FWidth : Integer = 9;
FHeight : Integer = 9;
var
Form1: TForm1;
Fchars : Array[0..9,0..9] of TMyChar;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
i,j : Integer;
begin
Canvas.Font.Size := 12;
Canvas.Font.Name := 'Courier New';
for i := 0 to FWidth do
for j := 0 to FHeight do
begin
FChars[i,j].Character:= '╬';
FChars[i,j].BGColor := clBlue;
FChars[i,j].FGColor := clYellow;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FFont.Free;
end;
procedure TForm1.FormPaint(Sender: TObject);
var w,h,i,j: Integer;
FRect : TRect;
begin
h := Canvas.TextHeight('A');
w := Canvas.TextWidth('A');
for i := 0 to FWidth do
for j := 0 to FHeight do
begin
Canvas.Brush.Color := fChars[i, j].BGColor;
Canvas.Font.Color := fChars[i, j].FGColor;
// Canvas.TextOut(i * w, j * h, fChars[i, j].Character);
FRect := Rect(i * w, j * h, i * w + w, j * h + h);
DrawText(Canvas.Handle, (fChars[i, j].Character), 2, FRect, DT_LEFT);
end;
end;
end.