Einzelnen Beitrag anzeigen

Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#1

Schriftgröße für optimale Platzausnutzung ermitteln

  Alt 9. Jan 2010, 13:45
Matze stellt hier eine Funktion vor, mit der es möglich ist, für gegebenen Text eine Schriftgröße zu ermitteln, sodass die gegebene Breite und Höhe (in Pixel) optimal ausgenutzt werden kann.

Delphi-Quellcode:
//Hilfsfunktion
function GetTextSizeInPixels(Text: string; Font: TFont): TPoint;
var
  PxHeight, PxWidth: Integer;
  TmpBmp: TBitmap;
begin
  TmpBmp := TBitmap.Create;
  try
    TmpBmp.Canvas.Font := Font;
    PxWidth := TmpBmp.Canvas.TextWidth(Text);
    PxHeight := TmpBmp.Canvas.TextHeight(Text);
  finally
    FreeAndNil(TmpBmp);
  end;

  Result.X := PxWidth;
  Result.Y := PxHeight;
end;
Delphi-Quellcode:
function GetFontSizeFromPixels(Text: string; WidthPixels: Integer; HeightPixels: Integer; FontName: string; MinSize: Integer = 1): Integer;
var
  Font: TFont;
  TmpSizePx: TPoint;
  TmpWidthPx, TmpHeightPx: Integer;
begin
  Font := TFont.Create;
  try
    Font.Name := FontName;
    Font.Size := MinSize;
    TmpSizePx := GetTextSizeInPixels(Text, Font);
    TmpWidthPx := TmpSizePx.x;
    TmpHeightPx := TmpSizePx.y;

    // check if MinSize is ok
    if (TmpWidthPx > WidthPixels) or (TmpHeightPx > HeightPixels) then
      Result := -1
    else begin // width at MinSize is smaller than WidthPixels
      repeat
        inc(MinSize);
        Font.Size := MinSize;
        TmpSizePx := GetTextSizeInPixels(Text, Font);
        TmpWidthPx := TmpSizePx.x;
        TmpHeightPx := TmpSizePx.y;
      until (TmpWidthPx > WidthPixels) or (TmpHeightPx > HeightPixels);

      Result := MinSize - 1;
    end;
  finally
    FreeAndNil(Font);
  end;
end;
Anbei noch 2 Beispielaufrufe:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  calculatedFontsize: Integer;
begin
  calculatedFontsize := GetFontSizeFromPixels('Dies ist ein Test-Text', 150, 150, 'Verdana',11);
  if calculatedFontsize<>-1 then
    showmessage('Schriftgröße sollte '+inttostr(calculatedFontsize) + ' sein!')
  else
    showmessage('Gewählter Text passt nicht in den zur Verfügung stehenden Bereich (bei gewählter Mindestgröße).')
end;



procedure TForm1.Button2Click(Sender: TObject);
var
  calculatedFontsize: Integer;
begin
  calculatedFontsize := GetFontSizeFromPixels('Dies ist ein Test-Text', 150, 150, 'Verdana');
  if calculatedFontsize<>-1 then
    showmessage('Schriftgröße sollte '+inttostr(calculatedFontsize) + ' sein!')
  else
    showmessage('Gewählter Text passt nicht in den zur Verfügung stehenden Bereich.')
end;
Frederic Kerber
  Mit Zitat antworten Zitat