Calculate Fontsize for GDI+ Operations

It took me some time to find a Solution across different aproches.

Usage:

procedure TForm1.btnPaintClick(Sender: TObject);
var
  Info        : TFontInfoHolder;
  ContentSize : TSize;
begin
  //resizing
  if Assigned(imgMain.Picture) then
    imgMain.Picture := nil;
  //Setup Font
  //see also CreateFontindirect
  imgMain.Canvas.Font.Color := clBlack;
  imgMain.Canvas.Font.Name := 'Arial';
  imgMain.Canvas.CopyMode := cmSrcCopy;

  Info.PaintDc := imgMain.Canvas.Handle;
  Info.Content := Self.edText.Text;
  Info.Width := imgMain.width; //see also GetDeviceCaps
  Info.MaxHigh := 250;
  Info.Font := imgMain.Canvas.Font;
  ContentSize := CalcFontSize(Info);
  imgMain.Canvas.TextOut(0,0,Info.Content);
end;

Function:

unit CalculateFontSize;

interface
  uses Graphics, windows;

type
  TFontInfoHolder = record
    PaintDc: HDC;
    Content: string;
    Width: Integer;
    MaxHigh: Integer;
    Font: TFont;
  end;

function CalcFontSize(FontInfoHolder: TFontInfoHolder):TSize;

implementation

function CalcFontSize(FontInfoHolder: TFontInfoHolder):TSize;
var
  Text    : PChar;
  Canvas  : TCanvas;
  SavedDc : Integer;
begin
  with FontInfoHolder do
  begin
    SavedDc := SaveDC(PaintDc);
    Canvas := TCanvas.Create;
    Canvas.Handle := PaintDc;
    Canvas.Font := Font;
    try
      Font.Size := 0;
      Text := PChar(Content);
      repeat
        Font.Size := Font.Size + 1;
        SelectObject(PaintDc, Font.Handle);
        GetTextExtentPoint32(PaintDc, Text, Length(Text), Result);
      until (Width  < Result.cx) or ((MaxHigh > 0) and (Result.cy > MaxHigh));
    finally
      if Assigned(Canvas) then
      begin
        Canvas.Handle := 0;
        Canvas.Free;
      end;
      if SavedDC <> 0 then
        RestoreDC(PaintDc, SavedDC);
    end;
  end;
end;

end.

,

Hinterlasse einen Kommentar

Volksverdummung

Ich mag .NET nicht.
Das kommt daher das es mich aussperrt. Was nutzt der beste Motor wenn man nicht an den Tankdeckel kommt?

Als Delphi Entwickler ist mir das Suspekt, wenn ich nicht unter der Oberfläche nachsehen kann was eine Funktion macht. Wie soll man denn da die Stellen finden an denen es klemmt? In der Dokumentation, nur das die sich manchmal zu diesem aktuellen spezifischen Problem ausschweigt.

Ich mache mir immer um den Nachwuchs sorgen. Ich selbst zählte auch mal den Spagghetti Scriptern. Wie hätte ich mir eine Sprache beigebracht ohne hineinsehen zu können?

Wer soll in 15 Jahren denn noch verstehen wie die Basis der Software funktioniert? Wenn es mit den Inhalten so weiter geht werden Betriebssysteme oder systemnahe Anwendungen nur noch von ein paar  Firmen erstellt werden können. Alle anderen werden auf fertige Teillösungen zurückgreifen müssen.

Faszinierend ist für mich ist dass .Net so viel vor dem Entwickler versteckt. Das hat Vor und auch Nachteile.

2 gekürze Gespräche deren Zitate nicht ganz wörtlich zu nehmen sind:

„Ich hab 1/3 der benutzten Bandbreite in unserem Rechenzentrum einspaaren können.“ da kam im übertragenden Sinne rüber: Das lässt mich gut da stehen und sichert mir ne dicke Weihnachtszulage, „Die Serialisierung der Komponenten wurde in XML Form übertragen. Das habe ich jetzt auf  Text umgestellt.“ … Wenn mein Cheff mitbekommen würde das ich nicht weiß was wir wie übertragen würde der mich in die Wüste schicken…

„Dafür brauchen wir einen Ado.Net Provider.“ „Ok! Welche Interfaces muss man dafür implementieren?“ „Hmm Das müssen wir im Internet nachsehen.“ Zur Hölle! was soll das? Das war tatsächlich so. Die Dokumentation und Visual Studio waren nicht dazu zu bewegen her zu zeigen was unter der Motorhaube steckt.

So verdummt man die Entwickler. Zumindest meiner Meinung nach.

Hinterlasse einen Kommentar

büro+ COM-Aktiv-Developer

microtech büro+ und .Net.

Für alle .Net er die sich die Mühe sparen wollen selbst eine Zugriffsklasse zu erstellen.

lx-networking.de .Net Hilfestellung für den büro+ COM-Aktiv Zugriff

,

Hinterlasse einen Kommentar

„Gestern ging´s doch noch“ und „Ich hab nix gemacht“

„Gestern ging´s doch noch“ und „Ich hab nix gemacht“ das sind die Worte mit denen wir leben.

Herzlich willkommen verirrte Seelen auf der Suche nach Wissen … oder gefährlichem Halbwissen.

„Yesterday it was still“ and „I’ve done nothing“ are the words with which we live.

Welcome to lost souls in search of knowledge … or dangerous punditry.

Hinterlasse einen Kommentar