Seite 1 von 1

Text Länge auf vorgegebene Breite ?

Verfasst: Mi, 16. Aug 2017 19:42
von AUGE_OHR
angenommen ich hätte diesen String

Code: Alles auswählen

cText := "Microsoft MapPoint Europe 2014"
für die 31 Zeichen gibt mir

Code: Alles auswählen

@Gdi32:GetTextExtentPoint32A(pDC,cName,LEN(cName),@aLen)
nun die Länge in Pixel aus z.b. 70 für den String. wenn nun die Breite geringer ist muss ein Umbruch erfolgen (DT_WORDBREAK)

Code: Alles auswählen

nDiff := ROUND( (aLen[1] / (aRect[3] - aRect[1]) ) + 0.5,0)    // aufrunden
aRect[4] := aRect[2] + 2 + ::nIcoLargeHeight + (aLen[2]*nDiff) + 2

@user32:DrawTextA(pDC       ,;
                  cName     ,;
                  LEN(cName),;
                  aRect     ,;
                  nOr(DT_CENTER, DT_BOTTOM, DT_WORDBREAK,DT_WORD_ELLIPSIS))
damit bekomme ich nun 3 Zeilen ... aber 4 sollten es sein :roll:

jemand eine Idee wie man das Problem lösen kann ?

p.s. nicht mit Theme wo es einfach wäre mit

Code: Alles auswählen

@UxTheme:GetThemeTextExtent()

Re: Text Länge auf vorgegebene Breite ?

Verfasst: Mi, 16. Aug 2017 21:58
von DelUser01
AUGE_OHR hat geschrieben: Mi, 16. Aug 2017 19:423 Zeilen ... aber 4 sollten es sein
Wie kommst Du drauf dass es 4 Zeilen sein sollten?
Das ist doch davon abhängig wie sich die Zeichen entsprechend des gewählten Fonts usw. in Deine angegebene maximale Pixelbreite reinquetschen lassen. Zumindest bei Proportionalschrift.

(Vermutlich verstehe ich Deine Aufgabenstellung nicht)

Re: Text Länge auf vorgegebene Breite ?

Verfasst: Mi, 16. Aug 2017 22:55
von AUGE_OHR
DelUser01 hat geschrieben: Mi, 16. Aug 2017 21:58
AUGE_OHR hat geschrieben: Mi, 16. Aug 2017 19:423 Zeilen ... aber 4 sollten es sein
Wie kommst Du drauf dass es 4 Zeilen sein sollten?
der String würde so "umgebrochen"

Code: Alles auswählen

Microsoft 
MapPoint 
Europe 
2014
DelUser01 hat geschrieben: Das ist doch davon abhängig wie sich die Zeichen entsprechend des gewählten Fonts usw. in Deine angegebene maximale Pixelbreite reinquetschen lassen. Zumindest bei Proportionalschrift.
klar wird es, wie auch GraQueryTextBox(), vom eingestellten Font beeinflusst aber beide geben das Ergebnis "von einer Zeile" aus.

in pure Xbase++ würde ich mit SUBSTR() / GraQueryTextBox() in eine Schleife arbeiten bis ich fertig bin mit dem String.
ich habe die Frage hier in die API Ecke gepackt weil ich hoffe das es ein ähnliche Function wie

Code: Alles auswählen

@UxTheme:GetThemeTextExtent()
gibt war mir ein mehrzeiliges Rechteck für einen String bei vorgegebener Breite gibt.

im Grunde ist es wie MlCount() / MemoLine() nur eben mit Pixel (Breite) statt Buchstaben.

Re: Text Länge auf vorgegebene Breite ?

Verfasst: Mi, 16. Aug 2017 23:11
von DelUser01
Nochmal meie Frage:
Wie kommst Du drauf dass es 4 Zeilen sein sollten?

Code: Alles auswählen

Microsoft 
MapPoint 
Europe 
2014
? ? ?

Vermutlich bekommst Du

Code: Alles auswählen

Microsoft 
MapPoint 
Europe 2014

Re: Text Länge auf vorgegebene Breite ?

Verfasst: Do, 17. Aug 2017 1:38
von AUGE_OHR
DelUser01 hat geschrieben: Mi, 16. Aug 2017 23:11 Nochmal meie Frage:
Wie kommst Du drauf dass es 4 Zeilen sein sollten?
weil ich nur die 3 Zeilen sehe (nach meiner jetzigen Kalkulation) und die Jahreszahl fehlt.
3_Zeilen.jpg
3_Zeilen.jpg (5.09 KiB) 4119 mal betrachtet
ob 3 oder 4 hängt ja davon ab "wie" man das berechnet und genau danach frage ich.
weder GraQueryTextBox() noch @Gdi32:GetTextExtentPoint32A() berücksichtigen ein Text-Umbruch (DT_WORDBREAK)

werde mit wohl doch eine Function mit AT() und SUBSTR() schreiben müssen wenn keiner einen Tip hat.

Re: Text Länge auf vorgegebene Breite ?

Verfasst: Do, 17. Aug 2017 9:17
von DelUser01
auf Deinem Bild sieht mann doch die vierte Zeile zu vielleicht 20%. Das Programm macht doch das was Du willst.
Die verfügbare "Viewing Area" ist bei Deinen Desktop-/Font-/Symbol-Einstellungen eben nur so viel Pixel groß wie Du angezeigt bekommst.

Re: Text Länge auf vorgegebene Breite ?

Verfasst: Do, 17. Aug 2017 18:58
von AUGE_OHR
es ist wohl noch anders ...
2_Zeilen_unselect.JPG
2_Zeilen_unselect.JPG (9.72 KiB) 4083 mal betrachtet
wenn es "unselect" ist dann sind es nur 2 Zeilen (???).
wenn man es "select" dann werden 4 Zeilen daraus.

es scheint so als wenn da noch "was" ist was ich bisher nicht verwende.
ein einfach Xbase++ Function wird es wohl nicht bringen.