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

![]() |
KnorxThieusBetreff: Label + Slider kombinieren - Größe des Labels errechnen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Ich habe schon den Durchschnitt zu verwenden versucht, aber der kann ja variieren? Danke im Vorraus ![]() |
||
Version: BlitzPlus / Blitz+ |
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die bestehnde Notify Funktion willst du ersetzen? Wieso wenn ich fragen darf? | ||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
KnorxThieus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, a) läuft im Hintergrund eine Uhr die soll nicht stehenbleiben
b) möchte ich bbeliebige Buttonbeschriftungen verwenden |
||
Version: BlitzPlus / Blitz+ |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
a) Du redest nicht von Timern oder? Die ticken ja fröhlich weiter.
b) Confirm ![]() ![]() Ü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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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? ( ![]() @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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
- Zuletzt bearbeitet von Midimaster am Mi, Aug 01, 2012 22:06, insgesamt 2-mal bearbeitet
![]() |
KnorxThieus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wird bei Labeln nicht automatisch umgebrochen? Ich blick nicht mehr durch.
Geht es nicht um die Größe des Labels? ![]() |
||
Version: BlitzPlus / Blitz+ |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
KnorxThieus |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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) Ich denke, dieser Beitrag ist noch relevant, denn ich habe bloß eine 1 Jahr lange Pause eingelegt... |
||
Version: BlitzPlus / Blitz+ |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group