Text Länge auf vorgegebene Breite ?

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Text Länge auf vorgegebene Breite ?

Beitrag 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()
gruss by OHR
Jimmy
DelUser01

Re: Text Länge auf vorgegebene Breite ?

Beitrag 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)
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Text Länge auf vorgegebene Breite ?

Beitrag 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.
gruss by OHR
Jimmy
DelUser01

Re: Text Länge auf vorgegebene Breite ?

Beitrag 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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Text Länge auf vorgegebene Breite ?

Beitrag 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) 4109 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.
gruss by OHR
Jimmy
DelUser01

Re: Text Länge auf vorgegebene Breite ?

Beitrag 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.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Text Länge auf vorgegebene Breite ?

Beitrag von AUGE_OHR »

es ist wohl noch anders ...
2_Zeilen_unselect.JPG
2_Zeilen_unselect.JPG (9.72 KiB) 4073 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.
gruss by OHR
Jimmy
Antworten