_StringWidth, Breite eines Labels herausfinden (vor dem Erstellen)

  • Hier mal eine kleine Funktion:

    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _StringWidth
    ; Description ...: Return the Width of a Label containing the given string
    ; Syntax ........: _StringWidth($sString)
    ; Parameters ....: $sString - A string value.
    ; Return values .: Width in px
    ; Author ........: minx
    ; ===============================================================================================================================
    Func _StringWidth($sString)
    $hGUI = GUICreate($sString,0,0)
    GUISetState(@SW_HIDE, $hGUI)
    $Ref = GUICtrlCreateLabel($sString,0,0)
    $aPos = ControlGetPos($sString, "", $Ref)
    GUIDelete($hGUI)
    Return $aPos[2]
    EndFunc

    [/autoit]


    Und hier ein Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <Math.au3>
    #include <String.au3>
    #include <StaticConstants.au3>

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

    $Formel = "\frac {1 - 20|(90 + 2x) · 30}"
    $Left = 50
    $Top = 100

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

    $GUI = GUICreate("Math Test", 500, 500)
    GUISetState()

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

    $aString = StringSplit(_SSB($Formel, "\frac {", "}"), "|", 1); Zähler und Nenner herausfinden
    $Length = _Max(_StringWidth($aString[1]), _StringWidth($aString[2])) ; Größen des Zählers und Nenners herausfinden, und die größte wiedergeben
    GUICtrlCreateLabel($aString[1], $Left, $Top, $Length, 13, $SS_CENTER) ; Zähler
    GUICtrlCreateLabel("", $Left, $Top+13, $Length, 1); Bruchstrich
    GUICtrlSetBkColor(-1,0)
    GUICtrlCreateLabel($aString[2], $Left, $Top+14, $Length, 20, $SS_CENTER); Nenner

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

    Do
    Until GUIGetMsg() = -3

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _StringWidth
    ; Description ...: Return the Width of a Label containing the given string
    ; Syntax ........: _StringWidth($sString)
    ; Parameters ....: $sString - A string value.
    ; Return values .: Width in px
    ; Author ........: minx
    ; ===============================================================================================================================
    Func _StringWidth($sString)
    $hGUI = GUICreate($sString,0,0)
    GUISetState(@SW_HIDE, $hGUI)
    $Ref = GUICtrlCreateLabel($sString,0,0)
    $aPos = ControlGetPos($sString, "", $Ref)
    GUIDelete($hGUI)
    Return $aPos[2]
    EndFunc

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

    Func _SSB($String, $S, $E)
    $aString = _StringBetween($String, $S, $E)
    Return $aString[0]
    EndFunc

    [/autoit]
  • Die gleiche Variante hab ich auch schon einige Male gesehen.
    Das ganze funktioniert so nur, wenn du die Schriftart nicht verändern willst, denn sonnst brauchst du noch GuiSetFont().
    Im englischen Forum und auch hier gibt es sicher über 10 Threads, die sich mit den Längen von Strings befassen.

  • Dann gibts jetzt halt noch einen ;)

    Das mit der Font kann ich noch einbauen. Das ganze war sowieso für so einen Art Formeleditor gedacht, bei dem es nur eine Font gibt ;)