SplashTextOn - Fenster automatisch an Schriftgröße anpassen

  • gibt es eine Möglichkeit, das sich das Splash-Fenster automatisch an die Schriftgröße anpasst?
    Also gerade so groß ist das der Text hineinpasst?

  • Nee, damit geht es leider auch nicht :(

    Mist, wenn man einstellt, dass der Text vertial zentriert angezeigt werden soll, dann funktioniert nichtmal mehr der automatische zeilenumbruch :(

    Einmal editiert, zuletzt von Bitboy (8. Januar 2010 um 14:14)

  • hilft diese Funktion vielleicht weiter?

    [autoit]

    Func _GetTextSize($nText, $iFontSize = 8.5, $sFont = 'Microsoft Sans Serif', $iFontAttributes = 0)
    ;Author: Bugfix
    ;Modified: funkey
    If $nText = '' Then Return
    $hOld = GUISwitch($DUMMY)
    Local $hGUI = GUICreate("Textmeter by Bugfix")
    _GDIPlus_Startup()
    Local $hFormat = _GDIPlus_StringFormatCreate(0)
    Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
    Local $hFont = _GDIPlus_FontCreate($hFamily, $iFontSize, $iFontAttributes, 3)
    Local $tLayout = _GDIPlus_RectFCreate(15, 171, 0, 0)
    Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $nText, $hFont, $tLayout, $hFormat)
    Local $iWidth = Ceiling(DllStructGetData($aInfo[0], "Width"))
    Local $iHeight = Ceiling(DllStructGetData($aInfo[0], "Height"))
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    GUIDelete($hGUI)
    Local $aSize[2] = [$iWidth, $iHeight]
    GUISwitch($hOld)
    Return $aSize
    EndFunc ;==>_GetTextSize

    [/autoit]
  • Ich habe daraus mal ein Beispiel geschrieben, weil ich testen wollte, ob man die Funktion brauchen kann.

    Beispiel zu _GetTextSize
    [autoit]

    #Include <GDIPlus.au3>

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

    $sText = "Splash-Demo-Text"
    $aTextSize = _GetTextSize($sText,36,'Times New Roman')
    SplashTextOn("", $sText, $aTextSize[0] + 6, $aTextSize[1] + 20, -1, -1, -1, "Times New Roman", 36)
    Sleep(5000)
    SplashOff()

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

    Func _GetTextSize($nText, $iFontSize = 8.5, $sFont = 'Microsoft Sans Serif', $iFontAttributes = 0)
    ;Author: Bugfix
    ;Modified: funkey
    Local $DUMMY
    If $nText = '' Then Return
    $hOld = GUISwitch($DUMMY)
    Local $hGUI = GUICreate("Textmeter by Bugfix")
    _GDIPlus_Startup()
    Local $hFormat = _GDIPlus_StringFormatCreate(0)
    Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
    Local $hFont = _GDIPlus_FontCreate($hFamily, $iFontSize, $iFontAttributes, 3)
    Local $tLayout = _GDIPlus_RectFCreate(15, 171, 0, 0)
    Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $nText, $hFont, $tLayout, $hFormat)
    Local $iWidth = Ceiling(DllStructGetData($aInfo[0], "Width"))
    Local $iHeight = Ceiling(DllStructGetData($aInfo[0], "Height"))
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    GUIDelete($hGUI)
    Local $aSize[2] = [$iWidth, $iHeight]
    GUISwitch($hOld)
    Return $aSize
    EndFunc ;==>_GetTextSize

    [/autoit]

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Hab mal versucht die funktion so zu ändern dass automatisch die Zeile umgebrochen wird wenn die Länge zu groß ist
    aber irgendwie funktioniert es nicht richtig. Ich finde auch den Fehler auf anhieb nicht. Hat jemand eine idee?

    EDIT: Nochmal etwas geändert, der Code für den Zeilenumbruch ist wohl noch etwas wackelig, aber sonst gehts schon ganz gut

    Spoiler anzeigen
    [autoit]

    Func _GetTextSize($nText, $AutoCRLFWidth=0, $iFontSize = 12, $sFont = 'Microsoft Sans Serif', $iFontAttributes = 0)
    Local $DUMMY, $ainfo, $iWidth, $iHeight, $retArr[4]
    Local $WordArr[1][1], $tmpArr, $SpaceSize, $WordSize, $CRLFString, $LineSize=0, $lines=0

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

    If $sFont = "" Then $sFont = 'Microsoft Sans Serif'
    ;Author: Bugfix
    ;Modified: funkey
    If $nText = '' Then Return
    $hOld = GUISwitch($DUMMY)
    Local $hGUI = GUICreate("Textmeter by Bugfix")
    _GDIPlus_Startup()
    Local $hFormat = _GDIPlus_StringFormatCreate(0)
    Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
    Local $hFont = _GDIPlus_FontCreate($hFamily, $iFontSize, $iFontAttributes, 3)
    Local $tLayout = _GDIPlus_RectFCreate(15, 171, 0, 0)
    Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)

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

    ;Zeilenumbrüche einfügen
    If $AutoCRLFWidth > 0 Then
    $tmpArr = StringSplit($nText, " ")
    Redim $WordArr[$tmpArr[0]+1][2]
    ;_ArrayDisplay($tmpArr)

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

    ;Daten übertragen
    $WordArr[0][0] = $tmpArr[0]
    For $i = 1 To $tmpArr[0]
    $WordArr[$i][0] = $tmpArr[$i]
    Next
    ;_ArrayDisplay($WordArr)

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

    ;Breite eines Leerzeichens
    $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, " ", $hFont, $tLayout, $hFormat)
    $SpaceSize = Ceiling(DllStructGetData($aInfo[0], "Width"))

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

    For $i = 1 To $WordArr[0][0]
    ;Länge der einzelnen Wörter ausrechnen
    $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $WordArr[$i][0], $hFont, $tLayout, $hFormat)
    $WordArr[$i][1] = Ceiling(DllStructGetData($aInfo[0], "Width"))

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

    ;Falls erforderlich Zeilenumbruch einfügen
    If $Linesize + $WordArr[$i][1] + $SpaceSize > $AutoCRLFWidth Then
    $CRLFString = $CRLFString & @CRLF & $WordArr[$i][0]
    $LineSize = $WordArr[$i][1]
    $lines = $lines + 1
    Else
    $CRLFString = $CRLFString & " " & $WordArr[$i][0]
    $LineSize = $LineSize + $WordArr[$i][1] + $SpaceSize
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $LineSize = ' & $LineSize & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    EndIf

    Next
    ;unnötige Leerzeichen entfernen
    $CRLFString = StringStripWS($CRLFString, 3)
    $nText=$CRLFString
    EndIf

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

    $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $nText, $hFont, $tLayout, $hFormat)
    $iWidth = Ceiling(DllStructGetData($aInfo[0], "Width"))
    $iHeight = Ceiling(DllStructGetData($aInfo[0], "Height"))
    Msgbox(0,"debug", $nText)

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

    ;Ressourcen freigeben
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    GUIDelete($hGUI)
    $retArr[0] = $iWidth
    $retArr[1] = $iHeight
    $retArr[2] = $lines + 1
    $retArr[3] = $nText
    GUISwitch($hOld)
    Return $retArr
    EndFunc ;==>_GetTextSize

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

    Func AutoSizeSplash($Title, $Content, $Width=500, $xpos=-1, $ypos=-1, $opt=32, $fontname="", $fontsize=12)
    Local $SizeArr = _GetTextSize($Content, $Width, $fontsize, $fontname)
    If $SizeArr[3] = "" Then $SizeArr[3] = $Content
    If $SizeArr[0] > $Width Then $Width = $SizeArr[0]
    _ArrayDisplay($SizeArr)
    SplashTextOn($Title, $SizeArr[3], $Width, $SizeArr[1] + 30, $xpos, $ypos, $opt, $fontname, $fontsize)
    EndFunc

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

    #include <gdiplus.au3>
    #include <array.au3>

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

    AutoSizeSplash("Hallo Welt", "Das ist ein ganz ganz langer text mit vielen" & @CRLF & @CRLF & "vielen Wörtern zum Gucken ob es funktioniert." & _
    " Deswegen kommen jetzt noch ein paar mehr Zeichen und hier ist schließlich Ende.", 600 ,-1,-1, 33, "", 14)
    Sleep(5000)
    SplashOff()

    [/autoit]

    Einmal editiert, zuletzt von Bitboy (9. Januar 2010 um 20:32)

  • Hatte das Problem daß der Text bei unterschiedlichen Anzeigeeinstellungen plötzlich nicht mehr ins SplashText Fenster passen wollte!
    Folgendes Script brachte die Lösung:
    Bleibt das Textfeld immer gleich groß, so kann mit der einfachen Funktion: _WinAPI_TwipsPerPixel() die Fenstergrösse an die Anzeigeeinstellungen (z.B.: in Windows 7: Systemsteuerung\Darstellung und Anpassung\Anzeige: Kleiner, Mittel oder Größer) angepasst werden!

    [autoit]


    #include <WinAPI.au3>
    $TwipsX = _WinAPI_TwipsPerPixelX()
    $FontHight = 14
    ;Korrekturfaktor damit der Text ins Fenster passt (experimentell ermitteln...)
    $CF = 25
    ; Fenster z.B.: im 16:9 Kinoformat ;)
    $SpW= 16 * $CF / $TwipsX * $FontHight
    $SpH= 9 * $CF / $TwipsX * $FontHight
    SplashTextOn("Bitte warten", "Überschrift" & @CRLF & @CRLF & "Bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten, bitte warten Ende ",$SpW,$SpH, -1, -1, 21, "", $FontHight)
    sleep(5000)

    [/autoit]

    7 Mal editiert, zuletzt von Schindi (29. November 2010 um 14:11)

  • Warum Leichenschänder???
    Der Thread ist noch offen - und wenn es jemanden hilft - warum nicht mal was neues!
    Ausserdem macht mein Script auch genau was verlangt wird - man kann auch die Schriftgrösse ($FontHight) ändern und das Fenster passt sich ebenfalls an!
    Sonst müsste es ja heissen:
    SplashTextOn - Fenster automatisch an Textlänge anpassen
    Übrigens wäre das einen Verbesserungsvorschlag für Autoit Wert, daß dies ein zusätzlicher SplashTextOn Parameter wird (autoscalierung oder so...)

    5 Mal editiert, zuletzt von Schindi (29. November 2010 um 17:13)