Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Anmeldungen zum Forentreffen 2018 sind auf der Anmeldeseite möglich
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

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: 10723
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Text Länge auf vorgegebene Breite ?

Beitrag von AUGE_OHR » Mi, 16. Aug 2017 19:42

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

Benutzeravatar
Roland Gentner
1000 working lines a day
1000 working lines a day
Beiträge: 946
Registriert: Fr, 24. Nov 2006 8:30
Wohnort: Neresheim
Kontaktdaten:

Re: Text Länge auf vorgegebene Breite ?

Beitrag von Roland Gentner » Mi, 16. Aug 2017 21:58

AUGE_OHR hat geschrieben:
Mi, 16. Aug 2017 19:42
3 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)
Gruß
Roland

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10723
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Text Länge auf vorgegebene Breite ?

Beitrag von AUGE_OHR » Mi, 16. Aug 2017 22:55

Roland Gentner hat geschrieben:
Mi, 16. Aug 2017 21:58
AUGE_OHR hat geschrieben:
Mi, 16. Aug 2017 19:42
3 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
Roland Gentner 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

Benutzeravatar
Roland Gentner
1000 working lines a day
1000 working lines a day
Beiträge: 946
Registriert: Fr, 24. Nov 2006 8:30
Wohnort: Neresheim
Kontaktdaten:

Re: Text Länge auf vorgegebene Breite ?

Beitrag von Roland Gentner » Mi, 16. Aug 2017 23:11

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
Gruß
Roland

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10723
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Text Länge auf vorgegebene Breite ?

Beitrag von AUGE_OHR » Do, 17. Aug 2017 1:38

Roland Gentner 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) 235 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

Benutzeravatar
Roland Gentner
1000 working lines a day
1000 working lines a day
Beiträge: 946
Registriert: Fr, 24. Nov 2006 8:30
Wohnort: Neresheim
Kontaktdaten:

Re: Text Länge auf vorgegebene Breite ?

Beitrag von Roland Gentner » Do, 17. Aug 2017 9:17

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.
Gruß
Roland

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10723
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Text Länge auf vorgegebene Breite ?

Beitrag von AUGE_OHR » Do, 17. Aug 2017 18:58

es ist wohl noch anders ...
2_Zeilen_unselect.JPG
2_Zeilen_unselect.JPG (9.72 KiB) 199 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