AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DrawText mit 2 Schriftgrößen?

Ein Thema von MicMic · begonnen am 9. Feb 2020 · letzter Beitrag vom 12. Feb 2020
Antwort Antwort
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

DrawText mit 2 Schriftgrößen?

  Alt 9. Feb 2020, 00:43
Hallo,
die Funktion DrawText mit zwei Schriftgrößen zu versehen, geht natürlich nicht.
Ich habe mal eine Grafik angehängt, um mein Problem zu verdeutlichen.

In einem RECT Bereich (graue Fläche) möchte ich zentriert den Beispieltext (TextHB) anzeigen lassen. Die letzten beiden Zeichen (HB) etwas kleiner. Ich habe mal schnell meinen Text geteilt und nutze 2 x DrawText. Die Schrifteigenschaften für DrawText kann man ja zuvor entsprechend setzen. Nur das ganze zentriert anzeigen zu lassen, ist dann doch etwas schwieriger. Dazu müssen die RECT-Werte stimmen. Diese kann man natürlich ändern. Ich kenne auch "Canvas.TextWidth" aber das alles nun zusammen zu basteln, damit das mit DT-Enter funktioniert...

Gibt es evtl. für solche Sachen spezielle API-Funktionen, damit ich nicht rechnen muss? Heute kann ich eh nicht mehr rechnen *lach
Weiterhin hoffe ich ja auf gute Lösungen, damit die Grafikausgabe nicht abgebremst wird. Es geht hier nicht nur um ein Text.

Gruß Mike
Miniaturansicht angehängter Grafiken
text.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.048 Beiträge
 
Delphi 12 Athens
 
#2

AW: DrawText mit 2 Schriftgrößen?

  Alt 9. Feb 2020, 01:09
Du musst dir eben die Breite der beiden Texte geben lassen und schon kannst du die nötigen Positionen berechnen.


DT_CALCRECT
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: DrawText mit 2 Schriftgrößen?

  Alt 9. Feb 2020, 02:42
Hab jetzt gerechnet

t1 = Textbreite erster Teil
t2 = Textbreite zweiter Teil
tt = Speichere mir rect.left

Berechnung (für DT_LEFT, also selbst zentrieren):
rect.left = tt + (ceil(rect.width/2))-(ceil((t1+t2)/2));

Erster Teil mit DrawText ausgeben, dann Rect.Left mit t1 addieren und zweiten Teil mit neuem DrawText ausgeben.

Muss aber mit dem Canvas noch was machen. Um die Textbreiten zu speichern (mit Canvas.TextWidth), nutze ich dasselbe Canvas. Ich muss hier "Font.Size" mal kleiner und mal wieder höher stellen. Auch für DrawText das gleiche Spiel mit Font.Size hin und her.

Schönen Sonntag den Lesern

P.s.
DT_CALCRECT verstehe ich so, dass mir hier mein Rect ggf. geändert wird. Mein Rect (Rahmen) soll sich in der Breite/Höhe nicht ändern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: DrawText mit 2 Schriftgrößen?

  Alt 9. Feb 2020, 05:43
Guck doch nach, wenn du dir nicht sicher bist, was es tut.

Google: DT_CALCRECT
https://docs.microsoft.com/en-us/win...nuser-drawtext
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Alt 9. Feb 2020, 11:19     Erstellt von Frühlingsrolle
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: DrawText mit 2 Schriftgrößen?

  Alt 9. Feb 2020, 14:12
@Luckie
Hatte wohl überlesen, dass mit DT_CALCRECT der Text nicht gezeichnet, sondern nur das LPRECT geändert wird.

@Frühlingsrolle
Danke für den Code. Kurz mal eingefügt und probiert. Um es noch zu zentrieren, muss ich da wohl auch noch 1x mehr das Canvas.Font abändern. Also so in der Art wie in meinem Code da unten. Aber ich schau noch mal rüber...

Finde es nur doof, dass man Font.Size hin und her abändern muss.

Gerade habe ich es so:
Delphi-Quellcode:
  // strT1,strT2 = String
  // T1,T2 = Integer

  // Textbreite vom ersten Textteil (großer Text) speichern (mit der aktuellen Schriftgröße)
  T1 := MyControl.Canvas.TextWidth(strT1);

  // Font kleiner machen
  MyControl.Canvas.Font.Size := MyControl.Canvas.Font.Size - 4;

  // Textbreite nun vom zweiten Textteil (kleinerer Text) speichern
  T2 := MyControl.Canvas.TextWidth(strT2);

  // Font wieder auf die normale Größe zurücksetzen
  MyControl.Canvas.Font.Size := MyControl.Canvas.Font.Size + 4;

  // Linke Position vom Rect für den ersten Textteil ändern (Zentrierung berechnen)
  Rect.Left := Rect.Left + trunc((Rect.Width/2)-((T1+T2)/2));

  // Erster Textteil ausgeben
  DrawText(MyControl.Canvas.Handle,PWideChar(strT1),-1,Rect,DT_SINGLELINE Or DT_TOP Or DT_Left or DT_NOCLIP);

  // Font kleiner machen
  MyControl.Canvas.Font.Size := MyControl.Canvas.Font.Size - 4;

  // Linke Position vom Rect für den zweiten Textteil ändern
  // Also Rect.Left von oben + Textbreite vom ersten Textteil
  Rect.Left := Rect.Left+T1;

  // Zweiten Textteil aussgeben (erster und zweiter Textteil zusammen ergibt dann die Zentrierung für das Rect.Width)
  DrawText(MyControl.Canvas.Handle,PWideChar(strT2),-1,Rect,DT_SINGLELINE Or DT_TOP Or DT_Left or DT_NOCLIP);

  // Font wieder auf die normale Größe zurücksetzen
  MyControl.Canvas.Font.Size := MyControl.Canvas.Font.Size + 4;
  Mit Zitat antworten Zitat
Alt 9. Feb 2020, 15:14     Erstellt von Frühlingsrolle
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.048 Beiträge
 
Delphi 12 Athens
 
#6

AW: DrawText mit 2 Schriftgrößen?

  Alt 9. Feb 2020, 16:10
Aufpassen mit dem PWideChar-Cast innerhalb der DrawText() Funktion!
Jupp, man muß es eben richtig machen und passende Typen zur jeweiligen API nutzen, aber das ist ja überall soll.

Und nicht zu vergessen der Typ der Variablen strT1 und strT2.

DrawText = PChar + String
DrawTextA = PAnsiChar + AnsiString (der String vor D2009)
DrawTextW = PWideChar + WideString bzw. UnicodeString (dar String seit D2009)

Ich weiß, PWideChar = PChar seit 11 Jahren und es wird sich so schnell nicht wieder ändern, aber kein Grund es nicht dennoch mal richtiger zu machen.
Auch in Bezug auf 32 Bit und 64 Bit, wo man immernoch auf die die passenden Typen achten sollte.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 9. Feb 2020 um 16:18 Uhr)
  Mit Zitat antworten Zitat
Alt 9. Feb 2020, 16:17     Erstellt von Frühlingsrolle
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.048 Beiträge
 
Delphi 12 Athens
 
#7

AW: DrawText mit 2 Schriftgrößen?

  Alt 9. Feb 2020, 16:20


Du kannst auch vieles mit Unicode machen.
Du wirst es nicht glauben, aber jemand kam auf die komische Idee und hat z.B. Kurziv, Fett, Hochgestellt und Tiefgestellt dort versteckt.
Oder Genderzeugs für Smilies ... Hautfarbe, Haarfarbe und Geschlecht.

https://de.wikipedia.org/wiki/Unicod...tellte_Zeichen
Nicht wundern, dass dort Einiges fehlt, aber z.B. ² und ³ gibt es schon sehr lange wo anders, siehe deine Tastatur.

Und das TM, das gibt es schon seit Ewigkeiten als eigenes Zeichen.
https://en.wikipedia.org/wiki/Trademark_symbol
Frühlingsrolle™
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 9. Feb 2020 um 16:27 Uhr)
  Mit Zitat antworten Zitat
Alt 9. Feb 2020, 16:32     Erstellt von Frühlingsrolle
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: DrawText mit 2 Schriftgrößen?

  Alt 12. Feb 2020, 01:50
Funktioniert es nun wie erwünscht?
Aufpassen mit dem PWideChar-Cast innerhalb der DrawText() Funktion!
In alten ANSI-basierten Delphiversionen wird es an der Stelle knallen, weil DrawText() in Delphi < 2009 ein Alias von DrawTextA() ist.
Wenn du hier explizit mit UNICODE-Zeichen arbeitest, dann solltest du DrawTextW() benutzen, ansonsten benutze einen PChar-Cast für jenen Parameter.
Ich hab dieses Delphi 10.3. Da wird's wohl passen.
Wenn ich anfange "DrawText(" zu schreiben, gibt's dann auch eine Info für PWideChar.
Der Code ist nur für mich. Es sei denn ich verkaufe ihn für tausende von Euros Aber Danke für die Info
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#9

AW: DrawText mit 2 Schriftgrößen?

  Alt 12. Feb 2020, 01:54
himitsu !
Ich habe mich auch mal dran versucht, und siehe da:
Delphi-Quellcode:
procedure DrawExpText(ACanvas: TCanvas; ARect: TRect; BaseText,ExpText: string;
  BaseTextSize, ExpTextSize: Integer);
var
  rBase, rExp: TRect;
  deltaX, deltaY: Integer;
begin
...(abgekürzt; Code selbst weiter oben im Beitrag vorhanden)
Bin noch nicht dazu gekommen, werde es aber noch ausprobieren. Danke für den Beitrag/Source
Mike
  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 10:45 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