• Offizieller Beitrag

    Hi,
    sicher kennt ihr das auch: mal schnell noch ein Label in die GUI einfügen, und dann dauernd probieren, ob die Maße zum verwendeten Font passen.
    Hier ein kleines Tool, um die erforderlichen Abmessungen zu ermitteln. Font mit Attributen auswählen, Text einfügen/schreiben und messen. Schon wißt ihr, wieviel Platz euer Text beansprucht. ;)

    Edit: Habe jetzt die Fontauswahl mit Standardfont vorbelegt.

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Include <Misc.au3>
    Opt("GUIOnEventMode", 1)
    Opt("MustDeclareVars", 1)
    Global $btChoose, $btMeasure, $cbBold, $cbItalic, $cbStrike, $cbUnderlined, $eText, $Group1, $gui, $inFont, $inHeight, $inSize
    Global $Label1, $Label2, $Label3, $Label4, $Label5, $Label6, $Label7, $Label8, $inWidth, $1stChoose = 1
    Global $bkCol = 0x1E90FF, $LemonChiffon = 0xFFFACD, $Salmon = 0xFA8072
    Global $aFont[8] = [8,0,'Courier New',10,400,0,0,0]

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

    $gui = GUICreate("TextMeter", 452, 367)
    GUISetOnEvent($GUI_EVENT_CLOSE, "guiClose")
    GUISetBkColor($bkCol)
    $Group1 = GUICtrlCreateGroup(" Font ", 15, 16, 420, 121)
    $inSize = GUICtrlCreateInput("", 331, 56, 35, 21, BitOR($ES_CENTER,$ES_READONLY))
    GUICtrlSetBkColor(-1, $LemonChiffon)
    $inFont = GUICtrlCreateInput("", 65, 56, 204, 21, BitOR($ES_CENTER,$ES_READONLY))
    GUICtrlSetBkColor(-1, $LemonChiffon)
    $Label1 = GUICtrlCreateLabel("Name", 30, 59, 32, 17)
    $btChoose = GUICtrlCreateButton("...", 388, 57, 20, 20, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "btChooseClick")
    GUICtrlSetBkColor(-1, $Salmon)
    $Label2 = GUICtrlCreateLabel("PointSize", 280, 59, 48, 17)
    $Label4 = GUICtrlCreateLabel("FontAttribute", 30, 98, 64, 17)
    $cbItalic = GUICtrlCreateCheckbox("", 195, 96, 17, 17)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateLabel("Italic", 215, 98, 40)
    $cbUnderlined = GUICtrlCreateCheckbox("", 265, 96, 17, 17)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateLabel("Underlined", 285, 98, 60, 17)
    $cbStrike = GUICtrlCreateCheckbox("", 360, 96, 17, 17)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateLabel("Strike", 380, 98, 40, 17)
    $Label5 = GUICtrlCreateLabel("Auswahl", 379, 33, 44, 17)
    $cbBold = GUICtrlCreateCheckbox("", 120, 96, 17, 17)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateLabel("Bold", 140, 98, 40, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $eText = GUICtrlCreateEdit("", 15, 171, 420, 105)
    GUICtrlSetBkColor(-1, $LemonChiffon)
    $btMeasure = GUICtrlCreateButton("Ausmessen", 335, 288, 100, 20, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "btMeasureClick")
    GUICtrlSetBkColor(-1, $Salmon)
    $Label3 = GUICtrlCreateLabel("Dein Text", 15, 152, 50, 17)
    $Label6 = GUICtrlCreateLabel("Benötigter Platz", 40, 322, 78, 17)
    $inWidth = GUICtrlCreateInput("", 140, 320, 60, 21, BitOR($ES_CENTER,$ES_READONLY))
    GUICtrlSetBkColor(-1, $LemonChiffon)
    $Label7 = GUICtrlCreateLabel("X", 220, 324, 11, 17)
    $inHeight = GUICtrlCreateInput("", 250, 320, 60, 21, BitOR($ES_CENTER,$ES_READONLY))
    GUICtrlSetBkColor(-1, $LemonChiffon)
    $Label8 = GUICtrlCreateLabel("pt", 330, 323, 26, 17)
    GUISetState(@SW_SHOW)

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

    setFont()

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

    While 1
    Sleep(100)
    WEnd

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

    Func btChooseClick()
    Local $aTmp
    If $1stChoose Then
    $aTmp = _ChooseFont()
    Else
    Local $weight = 400
    If BitAND($aFont[1], 1) Then $weight = 600
    $aTmp = _ChooseFont($aFont[2], $aFont[3], 0, $weight, BitAND($aFont[1], 2), BitAND($aFont[1], 4), BitAND($aFont[1], 8))
    EndIf
    If $aTmp = -1 Then Return
    $aFont = $aTmp
    $1stChoose = 0
    setFont()
    EndFunc

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

    Func setFont()
    If BitAND($aFont[1], 2) Then
    GUICtrlSetState($cbItalic, $GUI_CHECKED)
    Else
    GUICtrlSetState($cbItalic, $GUI_UNCHECKED)
    EndIf
    If BitAND($aFont[1], 4) Then
    GUICtrlSetState($cbUnderlined, $GUI_CHECKED)
    Else
    GUICtrlSetState($cbUnderlined, $GUI_UNCHECKED)
    EndIf
    If BitAND($aFont[1], 8) Then
    GUICtrlSetState($cbStrike, $GUI_CHECKED)
    Else
    GUICtrlSetState($cbStrike, $GUI_UNCHECKED)
    EndIf
    If $aFont[4] > 400 Then
    GUICtrlSetState($cbBold, $GUI_CHECKED)
    $aFont[1] = BitOR($aFont[1], 1)
    Else
    GUICtrlSetState($cbBold, $GUI_UNCHECKED)
    EndIf
    GUICtrlSetData($inFont, $aFont[2])
    GUICtrlSetData($inSize, $aFont[3])
    EndFunc

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

    Func btMeasureClick()
    Local $nText = GUICtrlRead($eText)
    If $nText = '' Then Return
    _GDIPlus_Startup()
    Local $hFormat = _GDIPlus_StringFormatCreate(0)
    Local $hFamily = _GDIPlus_FontFamilyCreate($aFont[2])
    Local $hFont = _GDIPlus_FontCreate($hFamily, $aFont[3], $aFont[1], 3)
    Local $tLayout = _GDIPlus_RectFCreate(15, 171, 0, 0)
    Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($gui)
    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()
    GUICtrlSetData($inHeight, $iHeight)
    GUICtrlSetData($inWidth, $iWidth)
    EndFunc

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

    Func guiClose()
    Exit
    EndFunc

    [/autoit]
  • Tolle Idee, aber irgendwie kann ich die Atribute nicht anklicken.
    MfG

    MfG. tobi_girst

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »tobi_girst« (Morgen, 25:63)

    • Offizieller Beitrag

    Tolle Idee, aber irgendwie kann ich die Atribute nicht anklicken.


    Das sollst du ja auch nicht können. :D
    Dazu hast du den Fontauswahl-Button. Dort wählst du den Font mit den gewünschten Attributen.

    Zitat von Depreed

    die breite und die höhe muss man doch gar nicht mit angeben oder?
    Statt Höhe und Breite reicht es doch aus -1 hinzuschreiben !?!

    Un wie platzierst du dann ein Element daneben, ohne zu wissen, wo das vorige aufhört.. :rolleyes:

  • Also ich finde, wenn Kastln für Häkchen da sind, sollte man sie auch verwenden können. Meine ich.
    MfG

    MfG. tobi_girst

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »tobi_girst« (Morgen, 25:63)

    • Offizieller Beitrag

    Also ich finde, wenn Kastln für Häkchen da sind, sollte man sie auch verwenden können. Meine ich.


    Eine sehr eigenwillige Betrachtungsweise. :P
    Wenn der Programmierer ( in diesem Falle also ich ;) ), das Checkbox-Ctrl ausschließlich als Anzeigeelement für einen Status verwendet, dann ist das legitim. Wo steht denn geschrieben, dass der User alle Funktionen eines Controls anwenden darf. :rofl:
    Dann müßtest du eigentlich auch den ReadOnly-Status der Inputs monieren... :rolleyes:

  • Hallo BugFix,
    ich denke tobi_girst hat nicht ganz Unrecht.

    Zitat

    das Checkbox-Ctrl ausschließlich als Anzeigeelement für einen Status verwendet

    Eine Checkbox die nicht ausgegraut ist wird wohl grundsätzlich zum anklicken anregen. :P
    Wenn das dann nicht möglich ist, dann entsteht Verwirrung und Frustration.

    Ich kan gut verstehen, dass diese Methode leicht anzusteuern und gut umzusetzen ist.
    Aber wie gesagt entspricht es nicht dem "User-Standard".
    Selbstverständlich obliegt es Dir so zu programmieren wie du es für richtig hälst,
    ich wäre für jegliche Kritik aber immer offen. (ohne dir in den Rücken fallen zu wollen)

    Nichtsdestotrotz muß zugeben, dass ich das Tool als solches Spitze finde.
    Es sind halt manchmal die kleinen Dinge, die das Leben vereinfachen.

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    • Offizieller Beitrag

    Eine Checkbox die nicht ausgegraut ist wird wohl grundsätzlich zum anklicken anregen.


    Es ist aber ausgegraut(disabled). Ich habe zur Beschriftung nur extra Label gesetzt, damit diese lesbar sind. ;)

    Übrigens bin ich Kritik gegenüber immer offen, allerdings bin ich auch ein alter Sturkopf mit festen Meinungen. :D
    Somit braucht es schon überzeugender Argumente um mich eines 'Besseren' zu belehren. ( In meiner Schulzeit sind daran so einige Lehrer fast verzweifelt :P ).
    Ich stelle nur mal folgendes in den Raum:
    - statt der Checkboxen verwende ich Inputs gleicher Größe und setze ein X für Status
    - dann 'mißbrauche' ich nicht die Funktionalität der Checkboxen
    - für den Nutzer ist es aber dieselbe Situation
    Was ist dadurch gewonnen? :whistling:

    • Offizieller Beitrag

    Ich finde das Script super. Kann man immer brauchen . :thumbup: