AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Gr32 - Unterstrichener Text bei TextToPath geht nicht
Thema durchsuchen
Ansicht
Themen-Optionen

Gr32 - Unterstrichener Text bei TextToPath geht nicht

Offene Frage von "Michael II"
Ein Thema von berens · begonnen am 14. Dez 2021 · letzter Beitrag vom 14. Dez 2021
Antwort Antwort
berens

Registriert seit: 3. Sep 2004
431 Beiträge
 
Delphi 2010 Professional
 
#1

Gr32 - Unterstrichener Text bei TextToPath geht nicht

  Alt 14. Dez 2021, 14:54
Hallo zusammen,
ich verwende folgende Prozedur, die wunderhübschen Text mit Kantenglättung darstellt.

Leider gibt es hier das Problem, dass die verwendete Prozedur das Unterstreichen von Texten nicht beherrscht. Ich nehme dann, das Problem/der Fehler liegt in TextToPath von GR32.

Hat jemand eine Idee, woran das liegen kann?

Delphi-Quellcode:
procedure AntiAlias_DrawText(_Bitmap: TBitmap32; _Text: string; _Font: TFont; _Rect: TRect);
var
  Intf: ITextToPathSupport;
  DestRect: TFloatRect;
  Flag: Integer;
  FPath: TFlattenedPath;
begin
  _Font.Quality := fqAntialiased;
  _Bitmap.Font.Assign(_Font);
  _Bitmap.Canvas.Font.Assign(_Font);

  // Zum Testen: Unterstreichen geht nicht!
  _Bitmap.Font.Style := [fsUnderline];

  if Supports(_Bitmap.Backend, ITextToPathSupport, Intf) then
  begin
    DestRect := FloatRect(_Rect);
    InflateRect(DestRect, -10, -10);

    Flag := DT_TOP or DT_NOPREFIX;
    FPath := TFlattenedPath.Create;
    try
      Intf.TextToPath(FPath, DestRect, _Text, Flag);

      PolyPolygonFS_LCD2(_Bitmap, FPath.Path, clWhite32, pfWinding);
    finally
      FreeAndNil(fpath);
    end;
  end else begin
    raise Exception.Create(RCStrInpropriateBackend);
  end;
end;
Ich habe schon mit dem Gedanken gespielt, den kompletten String durch "_" ersetzen zu lassen, und dann einfach nochmal drüber zu zeichnen. Das Problem ist dann leider, dass ein anderer Zeilenumbruch verwendet wird, und die "Texte" nicht deckungsgleich sind, da z.B. mein vorher gezeichnetes "i" schmaler ist als der Tiefstrich "_" in der selben Schriftgröße...

Dankbar für alle Ideen,
lg
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit

Geändert von berens (14. Dez 2021 um 18:35 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#2

AW: Gr32

  Alt 14. Dez 2021, 15:04
Keine Ahnung.

Mein erster Ansatz wäre als Krücke für den Fall: "Es gibt keine Lösung":

Länge des Textes ermitteln und dann einen String "basteln", der soviele _ enthält, dass seinen Länge (annähernd) deckungsgleich mit der Länge des Strings ist. Dadurch werden Längenunterschiede zwar nicht gänzlich eliminiert, aber auf ein (hoffentlich) erträgliches Maß reduziert.
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
431 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Gr32

  Alt 14. Dez 2021, 15:22
Das wäre sehr unglücklich... :/

Ich dachte bei der TextToPath Funktion werden quasi die Glyphen als S/W Bitmap gezeichnet, über Rahmenlinien in einen "Path" verwandelt und dann mit ner richtigen "Vektorgrafik"-Funktion (PolyPolygonFS_LCD2) nochmal später tatsächlich gezeichnet. Da müsste ja dann die Unterstrichlinie dabei sein. Scheinbar ist dem aber nicht so.

Beim selbstzeichnen weiß ich halt auch wegen Zeilenumbrüchen etc, wo -pro Zeile- der Text aufhören würde - zusätzlich erschwert durch die mögliche Ausrichtung von Links-Mitte-Rechts, Oben-Mitte-Unten. Im Prinzip müsste ich mir die "Textrect" funktion komplett neu selbst programmieren, incl. Parsing von Zeilenumbrüchen etc. Ich brech ab...

Zitat:
Text1 bla bla Foo
mit Zeilenumbruch
darf dann nicht in ______________________________ ohne Zeilenumbruch enden, aber auch nicht in
Zitat:
Text1 bla bla Foo
_______________________
mit Zeilenumbruch
_____________
Evtl. könnte ich die normale TextRect Funktion von Windows (bzw. Bitmap.Canvas o.ä.) drüberwerfen, das sollte eigentlich -bis auf's Antialiasing- deckungsgleich sein. Gibt es Möglichkeit, unterstrichenen Text auszugeben, und dabei nur den "Unterstrich" zu zeichnen, also die Buchstaben wegzulassen? Ich meine da was im Kopf zu haben...?
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
618 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Gr32

  Alt 14. Dez 2021, 16:06
Hallo, wenn du eh mit GR32 arbeitest zeichnest du doch eh selber? Warum dann nicht auch die Linie einfach selber unter den Text zeichnen? Also nicht aus Zeichen, sondern als Grafik, unterstreichen, durchstreichen, überstreichen, durchkreuzen, alles geht
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
431 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Gr32 - Unterstrichener Text bei TextToPath geht nicht

  Alt 14. Dez 2021, 19:09
> Warum dann nicht auch die Linie einfach selber unter den Text zeichnen?
Gerade bei mehrzeiligem Text weiß ich nicht, wo sich gerade die einzelnen Worte befinden. Abhängig von Schriftart, Zeichenhöhe, Kerning, Wordwrap, Ausrichtung (Oben Unten Mitte, Links Rechts Mitte) etc. ist es ab einer gewissen Zeilenzahl sehr unwahrscheinlich, dass ich noch halbs richtig unterstreiche. Bei einzeiligem Text ohne Umbruch - sicher: kein Problem. Bei mehrzeiligem Text müsste ich die komplette TextRect-Prozedur selbst nachprogrammieren um zu wissen, wo Buchstaben stehen und wo nicht - dafür habe ich nicht das Know-How, und auch nicht die Zeit wenn die TextToPath Prozedur das ja im Prinzip schon fertig kann.

Bei Ö und Ä sind die Punkte auch extra und nicht durchgehend als Pfad verbunden. Warum kommt die Unterstreichen-Linie nicht?

Im Anhang kann man sehen, wie sich die Länge der Worte und deren "Unterstreichungen" nicht decken. Woher sollte man also diese Abmessungen nehmen, ohne sie mit exorbitnatem Aufwand selbst zu kalkulieren?
Miniaturansicht angehängter Grafiken
2021-12-14-20_14_36-window.png  
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit

Geändert von berens (14. Dez 2021 um 19:16 Uhr)
  Mit Zitat antworten Zitat
Michael II
Online

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
721 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Gr32 - Unterstrichener Text bei TextToPath geht nicht

  Alt 14. Dez 2021, 20:41
Wenn du nur waagrecht Text ausgeben willst, dann könntest du _BitMap.RenderText() verwenden. Damit klappt es mit dem Unterstreichen - und gerendert wird auch schön.
Michael Gasser
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:02 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