Label + Slider kombinieren - Größe des Labels errechnen

Übersicht BlitzBasic BlitzPlus

Neue Antwort erstellen

KnorxThieus

Betreff: Label + Slider kombinieren - Größe des Labels errechnen

BeitragMo, Jul 30, 2012 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,


ich versuche gerade, eine Notify-Funktion zu bauen, die einen beliebigen Text anzeigt.
Aber wie macht man die Größe des Fensters bzw. des Labels vom Text abhängig? StringWidth funktioniert ja nur einzeilig in 2D. Gibt es eine Durchschnittsbreite für Zeichen?

Ich habe schon den Durchschnitt zu verwenden versucht, aber der kann ja variieren?

Danke im Vorraus Smile
Version: BlitzPlus / Blitz+

ozzi789

BeitragMo, Jul 30, 2012 23:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Die bestehnde Notify Funktion willst du ersetzen? Wieso wenn ich fragen darf?
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

KnorxThieus

BeitragDi, Jul 31, 2012 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, a) läuft im Hintergrund eine Uhr die soll nicht stehenbleiben
b) möchte ich bbeliebige Buttonbeschriftungen verwenden
Version: BlitzPlus / Blitz+

Thunder

BeitragDi, Jul 31, 2012 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
a) Du redest nicht von Timern oder? Die ticken ja fröhlich weiter.
b) Confirm und Proceed gibt es auch noch.

Überlege auch, wie wichtig es dir ist, dass dein Fenster an den Text angepasst ist und dass der Text mittig ausgegeben wird. Reicht es eventuell ein "Einheitsfenster" zu machen?
Ansonsten eventuell eine monospaced Schriftart verwenden und den Platz ausrechnen?

Mir fällt im Moment kein besserer Weg ein...
Ich dachte an die Möglichkeit, dass es vielleicht ein Gadget gibt, das sich automatisch an den Text anpasst. Dann könnte man das abmessen. Habe aber keines gefunden.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Midimaster

BeitragMi, Aug 01, 2012 0:31
Antworten mit Zitat
Benutzer-Profile anzeigen
ist es nicht so, dass sich ein bestmmter Zeichensatz immer gleich verhält, egal ob er ins 2D-Fenster oder in einem Button steht?.

Beispiel:
Du weißt doch sicherlich die Fontgröße, die Du im Button verwenden willst. Jetzt musst du nur noch ein "Referenzwort" finden, von dem Du weißt, dass es genau in einen 200pix-Button passt. Und dann stellt Du die StringWidth() dieses Wortes fest. Aus der Division beider Werte gewinnst Du eine Faktor, den Du für alle weiteren Worte heranziehen kannst.

Oder habe ich Dich hier falsch verstanden?
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

KnorxThieus

BeitragMi, Aug 01, 2012 9:28
Antworten mit Zitat
Benutzer-Profile anzeigen
@Thunder: Ich meinte eine sichtbare Uhranzeige.
Wie sieht es mit der Kombination "Erneut versuchen, abbrechen, Hilfe anfordern" als Buttons aus?

es soll ja eine herruasstechende meldung sein, aber die feste-breite-schrift ist gut... Bloß wie rechne ich das aus? ( Embarassed , siehe Midimasters Formel oben!)

@Midimaster:
aber die breite variiert ja bei normalen zeichen, die unterschielich breit sind?

Also soll ich jetzt größe des textfieldheight = StringWidth(notification$) / FontSize(GadgetFont(textfield)) rechnen?

Danke schonmal!
Version: BlitzPlus / Blitz+

Midimaster

BeitragMi, Aug 01, 2012 10:19
Antworten mit Zitat
Benutzer-Profile anzeigen
nee... ich dachte daran, dass man doch "abschätzen" kann, wie sich der Text im Gadget macht, wenn man sein Verhalten in einer gemalten Box kennt.

Also z.b. Du hast einen sehr langen Text, der über mehrere Zeilen in dem Gadget gehen wird. Dieser Text fällt doch auch bei StingWidth() als lang auf.

Angenommen, Du weißt, das in deinem Gadget immer ca. 200 pixel dieses Textes in der Breite passen. Mit dem selben Font wäre so eine Zeile aber (gemessen) 250pix mit DrawText() lang. Der Text selber ist StringWidth()=800 lang. Dann kannst Du doch vorhersagen, dass er 4 Zeilen braucht: 250+250+250+50. Also dimensionierst Du das Gadget auf x=200pix und y=4*Zeilenabstand ein.(ZeilenAbstand=TextHeight()+Luft zwischen den Zeilen.)

StringWidth() berechnet Dir ja bereits die Breite eines Textes unter Berücksichtigung der unterschiedlichen Breiten der Buchstaben.

Leider geht nicht aus Deiner Anfrage hervor, ob Du den Text selber in dem Gadhet umbrechen willst, oder ob das Gadget dies kann.

Selber umbrechen wäre auch nicht schwer: Du geht den Text von links nach rechts Wort für Wort durch, erstellt einen neuen Text aus den dazukommenden Worten. Dann misst Du die Textlänge mit StringWidth() nd wenn die 250 erreicht sind, setzt Du das als eine Zeile des Gadget ein. Mit dem Resttext geht es dann wieder von vorne los.

Dieses genaue Untersuchen ergibt natürlich auch eine sehr gut Schätzung der Zeilenanzahl, weil Du ja auch errechnest, wo der wahrscheinliche Zeilenumbruch in Gadget erfolgte.

Verbreitern des Fensters: Wenn Du das Fenster verbreitern musst, weil der Text noch länger ist und zu viele Zeilen hätte, dann bleibt auch in einem größeren Fenster der einmal gemessene Umrechnungfaktor erhalten. In unserem Beispiel wäre er 250/200 also 1.25. Willst Du also das Fenster auf 300 verbreitern, so passt wahrscheinlich nachher Text bis zur Breite von 300*1,25 =375 in jede Zeile.

Hier mal eine Vedeutlichung, was ich meine: [#EDIT# Kommentrare eingefügt]
BlitzBasic: [AUSKLAPPEN]
Graphics 800,600
;irgend ein schwachsinniger Text:
Global Inhalt$="Verbreitern des Fensters: Wenn Du das Fenster verbreitern musst, weil der Text noch länger ist und zu viele Zeilen hätte, dann bleibt auch in einem größeren Fenster der einmal gemessene Umrechnungfaktor erhalten. In unserem Beispiel wäre er 250/200 also 1.25. Willst Du also das Fenster auf 300 verbreitern, so passt wahrscheinlich nachher Text bis zur Breite von 300*1,25 =375 in jede Zeile. "

Rect 50,50,300,300,0
Text 0,20,Inhalt
Print StringWidth(Inhalt)
Umbruch
Flip 1

WaitKey()


Function Umbruch()

Local i%,Zeile$, LastI%
Repeat
LastI=0 ; diese Variable enthält immer die letzte Textstelle, die noch unter der Breite von 300 war
Suche nach max Länge der Zeile beginnt:
For i=1 To 999 ; durch alle Zeichen des Strings gehen
If Mid(Inhalt,i,1)=" " ; aber nur Stellen mit Leerzeichen (Wort-Ende) sind interessant
Zeile$=Left(Inhalt,i+1); linke Texthälfte bis zu dieser Stelle abtrennen
If StringWidth(Zeile)<300 Then ; und untersuchen
LastI=I-1 ; wenn kleiner aus das Fenster: merken, aber weitermachen
Else
Exit ; String ist jetzt zu lang, also Abbruch der Stellensuche
EndIf
ElseIf I>Len(Inhalt)
LastI=I ; Sonderfall: Textrest in die letzte Zeile
Exit
EndIf
Next
Zeile$=Left(Inhalt,LastI) ; hier wird nur der letzte, gerade noch zu kurze, Text abgetrennt
Text 60,60+j*20,Zeile ; dies nur für Verdeitlichung später nicht nötig
Text 360,60+j*20,StringWidth(Zeile)
J=J+1; dies zählt die Zeilen
Inhalt=Mid(Inhalt,LastI+2,-1); und weiter geht es mit dem Rest des Textes
Until Len(Inhalt)=0
End Function
  • Zuletzt bearbeitet von Midimaster am Mi, Aug 01, 2012 22:06, insgesamt 2-mal bearbeitet

KnorxThieus

BeitragMi, Aug 01, 2012 10:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Wird bei Labeln nicht automatisch umgebrochen? Ich blick nicht mehr durch.
Geht es nicht um die Größe des Labels?

Embarassed
Version: BlitzPlus / Blitz+

Midimaster

BeitragMi, Aug 01, 2012 12:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Du willst doch die Höhe des Labels passend einstellen, dazu musst du doch wissen, wieviele Zeilen es wahrscheinlich im Gadget werden.

Ja, und um zu wissen, wieviele Zeilen es sind wirst Du das ganze wohl auch "schätzen" müssen. Also machst Du den Umbruch "von Hand" und erfährst dadurch wieviele Zeilen es sind und daraus wie hoch dein Gadget sein muss.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

KnorxThieus

BeitragMi, Aug 01, 2012 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
also alles auf einem ungezeichnetem Image?

aber ich blick deinen code nicht durch... wieso wird, als ich text angezeigt hab, dieser nicht mehr umgebrochen? und wie kann ich zeilenumbrüche miteinplanen?
Version: BlitzPlus / Blitz+

Midimaster

BeitragMi, Aug 01, 2012 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Vorteil von StringWidth() ist ja eben, dass man es gar nicht zeichnen muss. Die Funktion sagt Dir schon vorher, wie breit ein Text sein würde.

du musst also als "gedachte Breite" für den Pseudo-Umbruch nur die Breite des Labels festlegen. Dann brichst Du den Text "von Hand" an hand dieser Werte um und so erhältst Du die anzahl der Zeilen. Das kann man eigentlich alles in dem Beispiel sehen. Aber wenn Du willst, kommentiere ich es auch gerne ausführlich. Allerdings erst heute Nacht.

Jetzt ess ich was.... (wir grillen!!!!)

EDIT so, nun habe ich den Code oben ausführlicher kommentiert.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

ozzi789

BeitragDo, Aug 02, 2012 11:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie wärs wenn du den Text in einen 2D Buffer renderst (selber Zeilenumbrüche machst) und dieses Bild dann einfach auf einen Canvas zeichnest.
Ein Bild mittig positionieren sollt ja möglich sein Wink
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

KnorxThieus

BeitragSo, Aug 05, 2012 13:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, aber wie krieg ich die eigentliche "Formel"? Welche Abmessungen das Label haben muss?
Version: BlitzPlus / Blitz+
  • Zuletzt bearbeitet von KnorxThieus am So, Nov 30, 2014 21:37, insgesamt einmal bearbeitet

Midimaster

BeitragSo, Aug 05, 2012 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
das hängt von der Textgröße ab, die Du benutzt.

Programmier doch mal eine Recheckbox, die die gleichen Ausmaße und den gleichen Zeichensatz wie das Label verwendet. Dann testest Du, wie sich der Zeichensatz in der Box in der Breite verhält. Durch meinen Simulationscode erfährst Du dann die Anzahl der Zeilen, die man braucht um den Text in der box darzustellen. Die multiplizierst du mit der FontHeight des Labels und stellt so die Höhe des Labels ein.

Dein Problem ist, dass Du hier auf einen fertigen Code wartest und keine Lust zum Experimentieren hast. Ich glaube ich habe jetzt schon 5x erklärt wie es geht, aber noch nie ist von Dir eine Weiterentwicklung gekommen.


Geh doch mal so schrittweise vor und versuch nicht gleich immer ein total-wahnsinns-sofort alles-eregbnis zu bekommen:

Schritt 1:

schreibe einen zu langen Text in Dein Label und in eine DrawRect()-Box gleichen Ausmaßes und vergleiche was passiert. Teile uns das hier mit.


Schritt 2:
passe deine Textbox in der Breite so an, dass genau die gleiche Anzahl Buchstaben reinpassen wie in das Label. Teile uns die Breite mit


Schritt 3:
zähle die Zeilen in dem Umbruchsimulator, und vergrößere entsprechend die Textbox und das Label.


Schritt 4:
mache Test mit sehr vielen unterschiedlichen Texten und teile uns deine Erfahrungen mit.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

KnorxThieus

BeitragSo, Sep 15, 2013 15:38
Antworten mit Zitat
Benutzer-Profile anzeigen
So, jetzt hab ich mich endlich mal aufgerafft und das durchgeführt.
Tschuldigung, dass ich einfach nicht mehr geantwortet habe...

Das hier ist dabei herausgekommen: BlitzBasic: [AUSKLAPPEN]
Function BreakText(txt$, x, y, width)
txt$ = Replace$(txt$, "-", "- ") + " BreakText"
txt_$ = txt$
Repeat
t$ = ""
t_$ = ""
txt$ = txt_$
break = False
break_ = False
Repeat
s = 0
s1 = 0
s2 = 0
s3 = 0
s1 = Instr(txt$, " ")
s2 = Instr(txt$, Chr$(10))
s3 = Instr(txt$, Chr$(13))
If s2 < s1
If s2 > 0
s = s2
Else
s = s1
EndIf
Else
s = s1
EndIf
If s3 < s
If s3 > 0
s = s3
EndIf
EndIf
If Not s
s = Len(txt$)
EndIf
break_ = break
If s = s2 Or s = s3 Then break = True
t_$ = t$
txt_$ = txt$
t$ = t$ + Left$(txt$, s)
txt$ = Mid$(txt$, s + 1)
Until StringWidth(t$) => width Or txt$ = "" Or break_ = True
Text x, y, t_$
y = y + FontHeight()
c = c + 1
Until txt$ = ""
Return c
End Function


win = CreateWindow("test", 200, 200, 400, 400, Desktop(), 0)
l = CreateLabel("Google Nutzungsbedingungen Zuletzt geändert am: 1. März 2012" + Chr$(13) + Chr$(13) + "Willkommen bei Google! Vielen Dank, dass Sie unsere Produkte und Dienste ('Dienste') nutzen. Die Dienste werden Ihnen von Google Inc. ('Google'), Amphitheatre Parkway, Mountain View, CA 94043, USA, zur Verfügung gestellt. Die Nutzung der Dienste setzt voraus, dass Sie diesen Nutzungsbedingungen zustimmen. Bitte lesen Sie diese sorgfältig durch. Wir bieten eine Vielzahl von verschiedenen Diensten an. Aus diesem Grund gelten unter Umständen zusätzliche Bedingungen oder Produktvoraussetzungen (z.B. ein Mindestalter). Solche zusätzlichen Bedingungen werden im Zusammenhang mit den entsprechenden Diensten zur Verfügung gestellt und werden Teil Ihres Nutzungsverhältnisses mit uns, sobald Sie diese Dienste nutzen. Nutzung unserer Dienste Sie sind zur Einhaltung der Richtlinien verpflichtet, die für unsere Dienste gelten. Verwenden Sie unsere Dienste nicht in missbräuchlicher Art und Weise. Sie sind beispielsweise nicht berechtigt, in die Dienste einzugreifen oder in anderer Weise als über die von Google bereitgestellte Benutzeroberfläche und gemäß unseren Vorgaben auf die Dienste zuzugreifen. Sie dürfen unsere Dienste nur in dem gesetzlich zulässigen Rahmen nutzen.", 5, 5, 390, 15, win, 1)

i = CreateImage(800, 600)
SetBuffer ImageBuffer(i)
SetFont GadgetFont(l)

c = BreakText("Google Nutzungsbedingungen Zuletzt geändert am: 1. März 2012" + Chr$(13) + Chr$(13) + "Willkommen bei Google! Vielen Dank, dass Sie unsere Produkte und Dienste ('Dienste') nutzen. Die Dienste werden Ihnen von Google Inc. ('Google'), Amphitheatre Parkway, Mountain View, CA 94043, USA, zur Verfügung gestellt. Die Nutzung der Dienste setzt voraus, dass Sie diesen Nutzungsbedingungen zustimmen. Bitte lesen Sie diese sorgfältig durch. Wir bieten eine Vielzahl von verschiedenen Diensten an. Aus diesem Grund gelten unter Umständen zusätzliche Bedingungen oder Produktvoraussetzungen (z.B. ein Mindestalter). Solche zusätzlichen Bedingungen werden im Zusammenhang mit den entsprechenden Diensten zur Verfügung gestellt und werden Teil Ihres Nutzungsverhältnisses mit uns, sobald Sie diese Dienste nutzen. Nutzung unserer Dienste Sie sind zur Einhaltung der Richtlinien verpflichtet, die für unsere Dienste gelten. Verwenden Sie unsere Dienste nicht in missbräuchlicher Art und Weise. Sie sind beispielsweise nicht berechtigt, in die Dienste einzugreifen oder in anderer Weise als über die von Google bereitgestellte Benutzeroberfläche und gemäß unseren Vorgaben auf die Dienste zuzugreifen. Sie dürfen unsere Dienste nur in dem gesetzlich zulässigen Rahmen nutzen.", 55, 55, 390)
SetGadgetShape l, 5, 5, 390, FontHeight() * c
Repeat
Forever
FreeImage i



Ich denke, dieser Beitrag ist noch relevant, denn ich habe bloß eine 1 Jahr lange Pause eingelegt...
Version: BlitzPlus / Blitz+

Neue Antwort erstellen


Übersicht BlitzBasic BlitzPlus

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group