Edit - Feld so groß wie der Text

  • Hi,
    ich würde gerne ein Edit-Feld erzeugen, welches in der Höhe so groß ist wie der eingegebene Text.
    Drücke ich Enter, soll das Edit-Feld in der Höhe größer werden.
    Lösche ich eine Zeile soll das Edit-Feld in der Höhe kleiner werden.
    Beides immer genauso groß wie der Inhalt.

    Ist dies möglich?

    Spoiler anzeigen
    [autoit]

    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    GUICreate("Meine GUI mit einem Edit-Feld") ; Erstellt ein GUI-Fenster welches mittig ausgerichtet wird

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

    $myedit = GUICtrlCreateEdit("", 176, 32, 100, 25, BitOR($ES_WANTRETURN, $WS_VSCROLL, $ES_AUTOVSCROLL))

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

    GUISetState()

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

    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    While 1
    $msg = GUIGetMsg()

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

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd

    [/autoit]
  • Hier mal zumindestens ein Grundgerüst wie man das machen könnte:

    Spoiler anzeigen
    [autoit]


    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    ;#include <array.au3>

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

    global $LineCount = 1

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

    $gui = GUICreate("Meine GUI mit einem Edit-Feld") ; Erstellt ein GUI-Fenster welches mittig ausgerichtet wird

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

    $myedit = GUICtrlCreateEdit("", 176, 32, 100, $LineCount * 25, BitOR($ES_WANTRETURN, $WS_VSCROLL, $ES_AUTOVSCROLL))
    ;$debug = GUICtrlCreateButton("debug",10,10,100,30)

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

    GUISetState()

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

    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    While 1
    $msg = GUIGetMsg()
    ;if $msg = $debug Then
    checkEditSize()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd

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

    func checkEditSize()
    $text = GUICtrlRead($myedit)
    $lines = StringSplit($text,@CRLF,1)
    ;_ArrayDisplay($lines)
    if $lines[0] <> $LineCount Then
    $LineCount = $lines[0]
    $curSize = ControlGetPos ( $gui, "", $myedit )
    ;_ArrayDisplay($curSize)
    GUICtrlSetPos ( $myedit, $curSize[0], $curSize[1] , $curSize[2], $LineCount*25 )
    EndIf
    EndFunc

    [/autoit]

    Ob Enter gedrückt wurde kannst du denke ich mit

    [autoit]

    _ispressed

    [/autoit]


    abfragen, im obigen Beispiel muss der Debug Button gedrückt werden. Das Resizen passt so wohl auch noch nicht ganz, denke aber bekommst das schon in den Griff. Auf jedenfall solltest du aber wohl ein maximales Limit für die Höhe setzen...

    EDIT: Debug Button funktionslos gemacht und arraydisplay auskommentiert... Abfrage ob Enter gedrückt wurde ist so eigtl. nicht notwendig

    4 Mal editiert, zuletzt von misterspeed (25. August 2011 um 16:08)

  • Das Resizen passt so wohl auch noch nicht ganz, denke aber bekommst das schon in den Griff.


    Genau das ist ja mein Problem.
    Ich habe nichts gefunden, wo ich die Höhe an die Zeilenanzahl genau anpassen kann :thumbdown:

  • Das hier sollte exakt sein und auch bei größeren Schriften funktionieren, sofern die Starthöhe des Edits für die Darstellung von exakt einer Zeile reicht...

    Spoiler anzeigen
    [autoit]


    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiEdit.au3>

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

    Global $LineCount = 1
    Global $hoehe = 25 ; funktioniert nur für Werte die für eine Zeile langen, danach wird coordEdit vermutlich den wert für 2 Zeilen haben und die rechnung unten stimmt nicht mehr ???

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

    $gui = GUICreate("Meine GUI mit einem Edit-Feld")

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

    $myedit = GUICtrlCreateEdit("", 176, 32, 100, $hoehe, BitOR($ES_WANTRETURN, $WS_VSCROLL, $ES_AUTOVSCROLL))
    $coordEdit = _GUICtrlEdit_GetRECT($myedit)
    $highArea = $coordEdit[3] - $coordEdit[1] ; die Höhe des Textbereichs
    $bottomspace = $hoehe - $coordEdit[3]

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

    GUISetState()

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

    While 1
    checkEditSize()
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd

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

    func checkEditSize()
    $lines = _GUICtrlEdit_GetLineCount($myedit) ;StringSplit($text,@CRLF,1)
    if $lines <> $LineCount Then
    $LineCount = $lines
    $curSize = ControlGetPos ( $gui, "", $myedit )
    GUICtrlSetPos ( $myedit, $curSize[0], $curSize[1] , $curSize[2], ($LineCount*$highArea) + $bottomspace )
    EndIf
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von misterspeed (25. August 2011 um 23:22)

  • Hi

    du kannst die Größe der Schrift auslesen und damit die Größe des Edit berechnen:

    Spoiler anzeigen
    [autoit]

    #include <Constants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiEdit.au3>
    #include <StructureConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <GuiScrollBars.au3>

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

    Opt("GUIOnEventMode", 1)

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

    Global $hGui = GUICreate("Test", 320, 240)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $cEdit = GUICtrlCreateEdit("", 10, 10, 300, 18, BitOR($ES_MULTILINE, $ES_WANTRETURN))
    Global $hEdit = GUICtrlGetHandle($cEdit)
    Global $iFontHeight = _GetFontHeight($hEdit)
    Global $iEditH = $iFontHeight * 2
    _CalcEditSize()
    GUISetState()

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

    Global $hProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
    Global $hMod = _WinAPI_GetModuleHandle(0)
    Global $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hProc), $hMod)
    OnAutoItExitRegister("_Cleanup")

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

    While 1
    Sleep(100)
    WEnd

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

    Func _GetFontHeight($hWnd)
    Local $hDC = _WinAPI_GetDC($hEdit)
    Local $tTEXTMETRIC = DllStructCreate($tagTEXTMETRIC)
    DllCall("gdi32.dll", "bool", "GetTextMetricsW", "handle", $hDC, "ptr", DllStructGetPtr($tTEXTMETRIC))
    _WinAPI_ReleaseDC($hEdit, $hDC)
    Return DllStructGetData($tTEXTMETRIC, "tmAscent")
    EndFunc ;==>_GetFontHeight

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

    Func _CalcEditSize()
    Local $iCnt = _GUICtrlEdit_GetLineCount($hEdit)
    $iEditH = $iCnt * $iFontHeight
    GUICtrlSetPos($cEdit, 10, 10, 300, $iEditH + $iFontHeight)
    EndFunc ;==>_CalcEditSize

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

    Func _KeyProc($nCode, $wParam, $lParam)
    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    Local $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
    If $wParam = $WM_KEYDOWN Then
    If DllStructGetData($tKEYHOOKS, "vkCode") = 13 Then
    _WinAPI_SetWindowPos($hEdit, 0, 10, 10, 300, $iEditH + $iFontHeight * 2, $SWP_NOZORDER)
    EndIf
    EndIf
    _CalcEditSize()
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndFunc ;==>_KeyProc

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

    Func _Cleanup()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hProc)
    EndFunc ;==>_Cleanup

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    E

    Edit: der Einfacheit halber hab ich nur "tmAscent" als Höhe verwendet und nochmals dazuaddiert - solltest du Wert auf ganz genaue Größe legen, dann solltest du auch "tmDescent" in die Berechnung eibfließen lassen...