AGB  ·  Datenschutz  ·  Impressum  







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

DrawText mit 2 Schriftgrößen?

Ein Thema von MicMic · begonnen am 8. 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 8. Feb 2020, 23: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
Angehängte Grafiken
Dateityp: jpg text.jpg (6,5 KB, 33x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: DrawText mit 2 Schriftgrößen?

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


DT_CALCRECT
Ein Therapeut entspricht 1024 Gigapeut.
  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, 01: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, 04: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, 10: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
 
#6

AW: DrawText mit 2 Schriftgrößen?

  Alt 9. Feb 2020, 13: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
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 04:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz