Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Zeichengröße, TrueType, Textmetric (https://www.delphipraxis.net/77357-zeichengroesse-truetype-textmetric.html)

knulli 18. Sep 2006 16:08


Zeichengröße, TrueType, Textmetric
 
Hallo,

für eine Anwendung soll die Zeichenhöhe einer Truetypeschrift auf 1/100 mm genau skaliert werden. Dazu soll der Anwender die Größe eines Großbuchstabens ohne Über- und Unterlänge eingeben.

Für einen ersten Versuch habe ich die Textmetric Struktur angewendet und einen Skalierungsfaktor über folgende Formel errechnet:

scaley=tmheight/(tmascent-tminternalleading). Vorher wurde mit Mapmode auf mm_himetric umgeschaltet sowie die API SelectObject mit einem TFontobjekt aufgerufen.

Leider verwirrt mich das Ergebnis bei unterschiedlichen Text-Größen (TFont.Size). Das Verhältnis ist nich konstant - da sich der Charakter der Schrift nicht ändert müsste dieses doch so sein oder?

Hat jemand Erfahrung mit solchen Problemen?

DAnke im voraus.

marabu 18. Sep 2006 17:42

Re: Zeichengröße, TrueType, Textmetric
 
Herzlich willkommen in der Delphi-PRAXiS, knulli.

tmHeight in deiner Formel sollte wohl eher die vom Benutzer geforderte mHeight (Höhe des M) sein. Wenn sich die Verhältniszahl ändert, dann ist das sicherlich ein Faktum und uns bleibt nur die Suche nach einer Erklärung. Hast du schon untersucht, wie sich die Verhältniszahl entwickelt, wenn du statt der Maximalwerte die typographischen Angaben für Ascent (f) und Descent (g) in deiner Formel verwendest?

Freundliche Grüße vom marabu

CTest 28. Mai 2013 12:09

AW: Zeichengröße, TrueType, Textmetric
 
Hallo,

Ich suche auch nach dem Verhältnis Höhe Großbuchstabe: Texthöhe.

Leider komme ich nicht ganz dahinter, aus den Werten der Windows-Textmetric kann ich nicht auf die tatsächliche Höhe schließen.

Beim einfachen Versuch ein Großbuchstaben auf ein Bitmap zu schreiben

Delphi-Quellcode:
  BM := TBitmap.Create;
  try
    AFontname := 'Arial'
    BM.canvas.Font.Name := AFontname;
    BM.canvas.Font.Height := 2000;
    BM.height := 2000;
    BM.width := 1100;
    TextOut(BM.Canvas.Handle, 0, 0, 'E', 1);
    BM.SaveToFile('C:\' + AFontname + '.bmp');
  finally
    BM.Free;
  end;
ist das ausgegebene Zeichen 1282pxl hoch. Oberhalb 339pxl und unten 379pxl Abstand.
Descent stimmt auch mit dem Wert aus der Textmetric überein.
Ascent: 1621
Descent: 379
InternalLeading: 210
ExternalLeading: 59

Auch bei anderen Schriftarten kommen ähnliche Ergenisse zustande. Man erkennt schon einen Zusammenhang von den Leadings und der gesuchten Höhe, aber nichts genaues.
Laut MSDN gibt Internalleading den Freiraum oberhalb an.

Zitat:

Leider verwirrt mich das Ergebnis bei unterschiedlichen Text-Größen (TFont.Size). Das Verhältnis ist nich konstant - da sich der Charakter der Schrift nicht ändert müsste dieses doch so sein oder?
Die nicht konstanten Werte könnten davon kommen, dass in den TrueTypeFonts für unterschiedliche Größen andere Zeichen definiert sind.

Grüße

Bjoerk 28. Mai 2013 12:54

AW: Zeichengröße, TrueType, Textmetric
 
Am besten ist m.E. nach, wenn der Anwender die Schriftgröße so vorgibt, wie er es gewohnt ist, z.B. mit 14.

Beispiel:

Delphi-Quellcode:
function GetFontHeight(FontSize, Zoom: integer): integer;
begin
  Result := Round(FontSize / 0.0254 * Zoom / 100);
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  // MM_HIMETRIC: Each logical unit is mapped to 0.01 millimeter.
  // Positive x is to the right; positive y is up.
  SetMapMode(Canvas.Handle, MM_HIMETRIC);
  Canvas.Font.Height := GetFontHeight(14, 50);
  Canvas.TextOut(1000, -1000, 'Tach');
end;
Gruß
Thomas

CTest 28. Mai 2013 13:08

AW: Zeichengröße, TrueType, Textmetric
 
bekomme die Texthöhe aber so vorgegeben, brauche das Verhältnis um auf die 'richtige' Fonthöhe zu rechnen und auch anders rum.

Bjoerk 28. Mai 2013 14:11

AW: Zeichengröße, TrueType, Textmetric
 
Wenn ich mich nicht irre, ist FontSIZE immer auf den Bildschirm bezogen, die printers rechnet die intern um. Du kannst aber auch selbst von MM auf Pixel umrechnen:

Delphi-Quellcode:
function GetScreenLogPixels: integer;
var
  DC: HDC;
begin
  DC := GetDC(0);
  try
    Result := GetDeviceCaps(DC, LOGPIXELSY);
  finally
    ReleaseDC(0, DC);
  end;
end;

function GetPrinterLogPixels: integer; // nach BeginDoc
begin
  Result := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
end;

CTest 28. Mai 2013 14:51

AW: Zeichengröße, TrueType, Textmetric
 
danke, aber das ist nich das, wonach ich suche, evtl. hast du in Post #3 "tatsächliche Höhe" falsch aufgefasst, oder ich habs schlecht formuliert.

Ich möchte z.Bsp. in der Schriftart Arial ein 'A' mit TextOut ausgeben, das selbst 100pxl hoch ist. Dazu brauche ich vorher das Verhältnis Großbuchstabe : Fontsize.
wie im Beispiel oben 1282:2000 = 0,641.
Mit Fontsize 156 sollte dann das Zeichen mit 100pxl Höhe gezeichnet werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz