Schriftgröße von Buttons global ändern

  • Hallo Leute, ich stehe vor einem Problem.

    Ich möchte über 3 verschiedene Buttons global die Schriftgröße anderer Buttons ändern.

    Momentan habe ich das Problem das Guictrlsetfont immer nur einen Button ändert.

    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Form1 = GUICreate("Form1", 320, 173, 255, 247)
    ;~ $Label1 = GUICtrlCreateLabel("Label1", 105, 24, 127, 52)

    [/autoit][autoit][/autoit][autoit]

    $Button1 = GUICtrlCreateButton("16", 24, 90, 33, 25)
    $Button2 = GUICtrlCreateButton("32", 72, 90, 33, 25)
    $Button3 = GUICtrlCreateButton("48", 120, 90, 33, 25)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    GUISetState(@SW_SHOW)

    [/autoit][autoit][/autoit][autoit]

    #EndRegion ### END Koda GUI section ###
    GUISetState()

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    global $Button22= GUICtrlCreateButton("1", 16, 67, 75, 25)
    global $Button21= GUICtrlCreateButton("2", 16, 122, 75, 25)
    Global $Button5 = GUICtrlCreateButton("3", 16, 232, 75, 25)
    Global $Button6 = GUICtrlCreateButton("4 4", 16, 177, 75, 25)
    Global $Button7 = GUICtrlCreateButton("5 4", 100, 177, 80, 25)
    global $Button8 = GUICtrlCreateButton("6", 100, 67, 80, 25)
    global $Button9 = GUICtrlCreateButton("7 7", 16, 20, 100, 25)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    ;~ $Label1 = GUICtrlCreateLabel("Label1", 105, 24, 127, 52)
    GUIctrlSetFont(-1, 12, 400, 0, "MS Sans Serif")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Case $Button2
    GUIctrlSetFont(-1,14, 400, 0, "MS Sans Serif")
    ;~ $Label1 = GUICtrlCreateLabel("Label1", 105, 24, 127, 52)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Case $Button3
    GUIctrlSetFont(-1,20, 400, 0, "MS Sans Serif")
    ;~ $Label1 = GUICtrlCreateLabel("Label1", 105, 24, 127, 52)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    EndSwitch
    WEnd
    Exit

    [/autoit]

    habt ihr einen Lösungsansatz für mich?

    Danke euch.

  • [autoit]

    GUICtrlSetFont

    [/autoit]


    stellt auch nur die Schriftart von einem Element um.

    Genauer: du änderst nur die Schriftfarbe von dem Button mit der ControlID: -1

    ===========================================
    Friedrich Schiller - Einfachheit ist das Resultat der Reife.

  • Ja, musst du dann. Du kannst aber auch alle Buttons in ein array schreiben und dann einfach mit einer for schleife die Schriftart ändern:

    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Form1 = GUICreate("Form1", 320, 173, 255, 247)
    ;~ $Label1 = GUICtrlCreateLabel("Label1", 105, 24, 127, 52)

    [/autoit][autoit][/autoit][autoit]

    $Button1 = GUICtrlCreateButton("16", 24, 90, 33, 25)
    $Button2 = GUICtrlCreateButton("32", 72, 90, 33, 25)
    $Button3 = GUICtrlCreateButton("48", 120, 90, 33, 25)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    GUISetState(@SW_SHOW)

    [/autoit][autoit][/autoit][autoit]

    #EndRegion ### END Koda GUI section ###
    GUISetState()

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    global $Button22= GUICtrlCreateButton("1", 16, 67, 75, 25)
    global $Button21= GUICtrlCreateButton("2", 16, 122, 75, 25)
    Global $Button5 = GUICtrlCreateButton("3", 16, 232, 75, 25)
    Global $Button6 = GUICtrlCreateButton("4 4", 16, 177, 75, 25)
    Global $Button7 = GUICtrlCreateButton("5 4", 100, 177, 80, 25)
    global $Button8 = GUICtrlCreateButton("6", 100, 67, 80, 25)
    global $Button9 = GUICtrlCreateButton("7 7", 16, 20, 100, 25)

    [/autoit][autoit][/autoit][autoit]

    Global $array[4] = [$Button22, $Button21, $Button8, $Button9]

    [/autoit][autoit][/autoit][autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    For $i = 0 to 3
    GUIctrlSetFont($array[$i], 12, 400, 0, "MS Sans Serif")
    Next

    [/autoit][autoit][/autoit][autoit]

    Case $Button2
    For $i = 0 to 3
    GUIctrlSetFont($array[$i],14, 400, 0, "MS Sans Serif")
    Next
    ;~ $Label1 = GUICtrlCreateLabel("Label1", 105, 24, 127, 52)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Case $Button3
    For $i = 0 to 3
    GUIctrlSetFont($array[$i],20, 400, 0, "MS Sans Serif")
    ;~ $Label1 = GUICtrlCreateLabel("Label1", 105, 24, 127, 52)
    Next

    [/autoit][autoit][/autoit][autoit]

    EndSwitch
    WEnd
    Exit

    [/autoit]

    ===========================================
    Friedrich Schiller - Einfachheit ist das Resultat der Reife.

  • Zuerst: Du kannst den Thread - sofern es zutrifft - auf [gelöst] setzen. So ist sofort ersichtlich, dass dein Problem gelöst worden ist. Das kannst du durch das Editieren des Startposts verwirklichen.

    Dann etwas Grundlegendes: Wenn du dir die Mühe machst, die Buttonbeschriftungen von der Größe her variabel zu gestalten, gehe ich davon aus, dass dein Programm etwas aufwändiger und größer ist als das kleine Beispiel oben. Gerade dann wird übersichtliches Programmieren immer wichtiger. Bei den Variablennamen blickt doch keiner mehr durch. Eine ordentliche Benennung ist da schon sinnvoll.
    Außerdem kannst du immer wieder auftretende Codefragmente auch einfach in "Unterprogramme" packen. Das nennt man dann Funktion. Ein Beispiel wäre das Verändern der Größe selber. Anstatt jedes mal die For-Schleife zu schreiben, packst du das alles in eine Funktion und rufst sie dann nur noch auf:

    Spoiler anzeigen
    [autoit]


    ; ... sonstiger Code ...
    While True
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3;$GUI_EVENT_CLOSE
    Exit
    Case $Button1
    AppSetFontSize(12)
    Case $Button2
    AppSetFontSize(14)
    Case $Button3
    AppSetFontSize(20)
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func AppSetFontSize($nSize)
    For $c = $Button22 To $Button9
    GUICtrlSetFont($c, $nSize)
    Next
    EndFunc

    [/autoit]

    In diesem Codefragment sieht man auch gleich einen kleinen (dreckigen) Trick. Ich benutze nämlich kein Array, um auf die einzelnen Controls zuzugreifen. Jedes Control bekommt beim Erstellen eine eindeutige Identifikationsnummer zugeordnet, die Control ID. Ich mache mir hier zu Nutzen, dass diese Control IDs von Windows einfach aufsteigend vergeben werden. Wenn ich direkt hintereinander zwei Controls erstelle, dann hat das erste die ID x und das zweite die ID x + 1. Ganz einfach eigentlich. Daher kann ich auch einfach in der For-Schleife direkt auf die Controls zugreifen und brauche gar kein Array dafür. Wie gesagt, ein wenig unsauber, aber sehr simpel und funktionell.

    Gruß

  • Mit der Control ID würde es funktionieren, wenn man wirklich alle Buttons ändern will.
    Ich hab gedacht, dass die Umstell Buttons (die 3 Buttons, die die Schriftart verändern) nicht mit geändert werden müssen.
    Wobei, wenn man die direkt hintereinander am anfang erstellt fängt man halt erst bei Control ID 3 hochzuzählen.

    Hast vollkommen recht, nur die Reihenfolge muss richtig bleiben.

    ===========================================
    Friedrich Schiller - Einfachheit ist das Resultat der Reife.

  • Wenn man wirklich alle Controls einer Art auf einmal ansprechen will, kann man sich auch auf native WinAPI-Funktionen verlassen. So hat man auch eine weitestgehend allgemein gültige Funktion:

    Spoiler anzeigen
    [autoit]


    #include <WinAPI.au3>
    #include <WinAPISys.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; ... sonstiger Code ...

    [/autoit] [autoit][/autoit] [autoit]

    While True
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3;$GUI_EVENT_CLOSE
    Exit
    Case $Button1
    AppSetFontSize(12, $Form1, "Button")
    Case $Button2
    AppSetFontSize(14, $Form1, "Button")
    Case $Button3
    AppSetFontSize(20, $Form1, "Button")
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func AppSetFontSize($nSize, $hWnd, $sClass = "")
    Local $aChilds
    $aChilds = _WinAPI_EnumChildWindows($hWnd)
    For $i = 1 To $aChilds[0][0]
    If ($aChilds[$i][1] <> $sClass) And ($sClass <> "") Then ContinueLoop
    GUICtrlSetFont(_WinAPI_GetDlgCtrlID($aChilds[$i][0]), $nSize)
    Next
    EndFunc

    [/autoit]

    Einfach alle Controls aufzählen lassen, Klasse prüfen und dann drauf zugreifen. Wenn man keinen Wert für $sClass angibt, werden alle Controls verändert - also auch Labels und so weiter.
    Das sollte dann der eleganteste Weg sein. ^^

    Gruß