Ok, ich hab weiter in der
Api gestöbert und GetTextMetrics gefunden. Ich denke tmAscent und tmDescent liefern das was ich brauche. tmDescent ist die Unterlänge und entspricht dabei der Lücke die mir Probleme bereitete.
Falls es später einem auch mal interessiert, hier die Prozedur mit der ich etwas experimentiert habe:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
procedure TextRect(ACanvas: TCanvas; X, Y: Integer; Txt: String);
var
Size: TSize;
bs: TBrushStyle;
tm: TTextMetric;
begin
bs := ACanvas.Brush.Style;
ACanvas.Brush.Style := bsClear;
Size := ACanvas.TextExtent(Txt);
GetTextMetrics(Canvas.Handle, tm);
ACanvas.Rectangle(Rect(X, Y + tm.tmDescent, X + Size.cx, Y - Size.cy + tm.tmDescent));
ACanvas.Brush.Style := bs;
end;
var
d: Integer;
Metrics: TTextMetric;
sl: TStringList;
begin
Canvas.Font.Name := 'Arial';
Canvas.Pen.Color := clRed;
Canvas.Brush.Color := clWhite;
Canvas.Font.Size := 28;
d := Canvas.TextHeight('X');
SetTextAlign(Canvas.Handle, TA_BASELINE);
Canvas.Font.Size := 10;
Canvas.TextOut(100, 100 + d, 'Hallo');
TextRect(Canvas, 100, 100 + d, 'Hallo');
Canvas.Font.Size := 28;
Canvas.TextOut(150, 100 + d, 'Welt');
TextRect(Canvas, 150, 100 + d, 'Welt');
Canvas.Pen.Color := clBlue;
Canvas.MoveTo(0, 100); Canvas.LineTo(300, 100);
//----------------------------------------------------------------------------
if GetTextMetrics(Canvas.Handle, Metrics) then
begin
sl := TStringList.Create;
try
sl.Add('tmHeight: ' + IntToStr(Metrics.tmHeight));
sl.Add('tmAscent: ' + IntToStr(Metrics.tmAscent));
sl.Add('tmDescent: ' + IntToStr(Metrics.tmDescent));
sl.Add('tmInternalLeading: ' + IntToStr(Metrics.tmInternalLeading));
sl.Add('tmExternalLeading: ' + IntToStr(Metrics.tmExternalLeading));
sl.Add('tmAveCharWidth: ' + IntToStr(Metrics.tmAveCharWidth));
sl.Add('tmMaxCharWidth: ' + IntToStr(Metrics.tmMaxCharWidth));
sl.Add('tmWeight: ' + IntToStr(Metrics.tmWeight));
sl.Add('tmOverhang: ' + IntToStr(Metrics.tmOverhang));
sl.Add('tmDigitizedAspectX: ' + IntToStr(Metrics.tmDigitizedAspectX));
sl.Add('tmDigitizedAspectY: ' + IntToStr(Metrics.tmDigitizedAspectY));
sl.Add('tmItalic: ' + IntToStr(Metrics.tmItalic));
sl.Add('tmUnderlined: ' + IntToStr(Metrics.tmUnderlined));
sl.Add('tmStruckOut: ' + IntToStr(Metrics.tmStruckOut));
sl.Add('tmPitchAndFamily: ' + IntToStr(Metrics.tmPitchAndFamily));
sl.Add('tmCharSet: ' + IntToStr(Metrics.tmCharSet));
sl.Add('tmFirstChar: "' + Metrics.tmFirstChar + '"');
sl.Add('tmLastChar: "' + Metrics.tmLastChar + '"');
sl.Add('tmDefaultChar: "' + Metrics.tmDefaultChar + '"');
sl.Add('tmBreakChar: "' + Metrics.tmBreakChar + '"');
ShowMessage(sl.Text);
finally
sl.Free;
end;
end
else
MessageDlg('Irgend so ein Fehler!', mtError, [mbOk], 0);
end;