Text im Label dynamisch darstellen

  • Hallole an alle,

    Mit GUICtrlSetResizing(-1, $GUI_DOCKAUTO) ist das mit -1 angesprochene Control dynamisch die Größenänderung betreffend. So weit so Gut.

    Wende ich das auf ein Label an, geht das zwar auch, jedoch der Text bleibt immer in der gleichen Größe.

    Kann man den Text eines Labels auch i-wie dynamisieren das er seine Größe auch ändert, wenn sich das Fenster in der Größe ändert?

    ein Beispiel-Label aus meinem Proggi:

    Code
    $Label7 = GUICtrlCreateLabel("Erase", 32, 399, 190, 25)
    GUICtrlSetFont(-1, 12, 800, 0, "Bosch Sans Bold")
    GUICtrlSetColor(-1, 0x000000)
    GUICtrlSetResizing(-1, $GUI_DOCKAUTO)

    :ironie: Ja, ich habe den Text "formatiert" aber auch Standardtext wird nicht angepasst....

    Bisher wird der Text eben abgeschnitten wenn das Fenster verkleinert wird anstatt angepasst... ;(

  • Bisher wird der Text eben abgeschnitten wenn das Fenster verkleinert wird anstatt angepasst..

    Das Resizing hat nur Einfluss auf die Abmessung des Labels, die Fontgröße hat damit nichts zu tun. Wenn du das zusätzlich anpassen möchtest, musst du WM_SIZING auswerten und im Verhältnis zur Größenänderung die Schriftgröße anpassen.

    Aber den Zahn kann ich dir gleich ziehen - denn das funktioniert einfach nicht!

    Ursache: Durch das Ermitteln des Verhältnisses musst du zwangsläufig runden. Die Rundungsdifferenzen führen dazu, dass bei mehrfacher Größenänderung du niemals zurück zur Anfangsgröße gelangst. Irgendwann wird die Schrift dann überproportional groß oder klein. Habe ich schon mal probiert.

  • Die Rundungsdifferenzen führen dazu, dass bei mehrfacher Größenänderung du niemals zurück zur Anfangsgröße gelangst.

    Ja, genau das ist das Problem... aber nur mal so als Idee... wir können Windows ja die Größe des Labels bestimmen lassen. Dazu wird dann ein Label in einer separaten GUI erstellt, ohne dabei die Größe anzugeben. Vor Erstellen des Labels setzen wir die Schriftgröße für die GUI entsprechend der Auswertung von WM_SIZING, also größer oder kleiner, die dann auch für das Label verwendet wird. Das Erstellen des Labels wiederholen wir dann mit größerer oder kleinerer Schriftgröße so oft, bis die passende Größe gefunden wurde.

  • Mit GDI+ und dem Befehl _GDIPlus_GraphicsMeasureString kann man die Fontgröße experimentell ermitteln.

    Das funktioniert zwar nicht ganz perfekt, weil teilweise angezeigte Zeilen auch mit gerechnet werden, aber zumindest sieht es schonmal ganz gut aus:

  • Das Resizing hat nur Einfluss auf die Abmessung des Labels, die Fontgröße hat damit nichts zu tun. Wenn du das zusätzlich anpassen möchtest, musst du WM_SIZING auswerten und im Verhältnis zur Größenänderung die Schriftgröße anpassen.

    Aber den Zahn kann ich dir gleich ziehen - denn das funktioniert einfach nicht!

    Ursache: Durch das Ermitteln des Verhältnisses musst du zwangsläufig runden. Die Rundungsdifferenzen führen dazu, dass bei mehrfacher Größenänderung du niemals zurück zur Anfangsgröße gelangst. Irgendwann wird die Schrift dann überproportional groß oder klein. Habe ich schon mal probiert.

    Jaein, wenn du die Standardfenstergröße als Default (Const) Wert nimmst wäre das doch egal.

    Sprich Standardfenstergröße (z.B. 1000px = 100%) zu neuer Fenstergröße (z.B. 768px = X%) ins Verhältnis setzen und dementsprechend die Standardschriftgröße vergrößern/verkleinern (Dreisatz). Faktor = X% / 100



    Ggf. musst du beides betrachten (Breite und Höhe) und dann den kleineren Wert wählen. Aber dadurch das du immer die Ausgangsgröße als Maßstab nimmst, müsste das Verhältnis immer passen (und auch immer wieder zum Startwert zurückkehren können).

  • Mit GDI+ und dem Befehl _GDIPlus_GraphicsMeasureString kann man die Fontgröße experimentell ermitteln.

    Das funktioniert zwar nicht ganz perfekt, weil teilweise angezeigte Zeilen auch mit gerechnet werden, aber zumindest sieht es schonmal ganz gut aus:

    Ich zitiere mich mal.

    Wenn man mein Script noch etwas abwandelt, funktioniert es perfekt.

    Man muss nur zusätzlich die Zeilenhöhe einrechnen: