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/)
-   -   DrawText mit 2 Schriftgrößen? (https://www.delphipraxis.net/203343-drawtext-mit-2-schriftgroessen.html)

MicMic 8. Feb 2020 23:43

DrawText mit 2 Schriftgrößen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
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

himitsu 9. Feb 2020 00:09

AW: DrawText mit 2 Schriftgrößen?
 
Du musst dir eben die Breite der beiden Texte geben lassen und schon kannst du die nötigen Positionen berechnen. :zwinker:


DT_CALCRECT

MicMic 9. Feb 2020 01:42

AW: DrawText mit 2 Schriftgrößen?
 
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.

Luckie 9. Feb 2020 04:43

AW: DrawText mit 2 Schriftgrößen?
 
Guck doch nach, wenn du dir nicht sicher bist, was es tut.

Google: DT_CALCRECT
https://docs.microsoft.com/en-us/win...nuser-drawtext

MicMic 9. Feb 2020 13:12

AW: DrawText mit 2 Schriftgrößen?
 
@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;

himitsu 9. Feb 2020 15:10

AW: DrawText mit 2 Schriftgrößen?
 
Zitat:

Zitat von Frühlingsrolle (Beitrag 1457015)
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. :zwinker:

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.

himitsu 9. Feb 2020 15:20

AW: DrawText mit 2 Schriftgrößen?
 
:thumb:

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. :stupid:
Oder Genderzeugs für Smilies ... Hautfarbe, Haarfarbe und Geschlecht. :freak:

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. :zwinker:

Und das TM, das gibt es schon seit Ewigkeiten als eigenes Zeichen.
https://en.wikipedia.org/wiki/Trademark_symbol
Frühlingsrolle™

MicMic 12. Feb 2020 00:50

AW: DrawText mit 2 Schriftgrößen?
 
Zitat:

Zitat von Frühlingsrolle (Beitrag 1457015)
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
Delphi-Quellcode:
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

MicMic 12. Feb 2020 00:54

AW: DrawText mit 2 Schriftgrößen?
 
Zitat:

Zitat von Frühlingsrolle (Beitrag 1457017)
:thumb: 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


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:16 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