GUICtrlSetFont in For-Schleife // GUI-Refresh... Bitte helft mir >.>

  • Edit: Neues "problem", dafür bitte in den 2ten Post schauen.

    Hallo alle miteinander,

    Also irgendwie komm ich nicht weiter - ich habe mir gestern abend überlegt einen eigenen Musikexplorer zu erstellen - Mich hat es total genervt dass ich die Schriftgröße meiner Musikordner (da windows explorer) nicht mit STRG+Mausrad vergrößern kann, so wie ich es zb. vom Firefox gewohnt bin. Also hab ich mich da mal rangesetzt und wollte natürlich das "zoomen", bzw das ändern der schriftgröße hinbekommen. Soweit auch kein Problem - das ganze schaut dann so aus:
    (benötigt wird die MouseSetOnEvent_UDF.au3)

    Spoiler anzeigen
    [autoit]


    #include <MouseSetOnEvent_UDF.au3>
    #include <Misc.au3>
    HotKeySet("{ESC}", "_stirb")

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

    $Font = 12
    $mGUI = GUICreate("Teste",800,600)
    $mxPlore = GUICtrlCreateLabel("Hier kommt der Explorer", 50, 200, 600, 50)

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

    GUICtrlSetFont(-1,$Font)
    GUISetState()

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

    _MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT, "_zoom", 1,"",$mGUI)
    _MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "_zoom", 2,"",$mGUI)

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

    Func _stirb()
    Exit
    EndFunc ;==>_stirb

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

    Func _zoom($iDir)
    If _IsPressed(11) AND WinActive($mGUI) Then
    Switch $iDir
    Case 1
    $Font += 1
    GUICtrlSetFont($mxPlore,$Font)
    Case 2
    $Font -= 1
    GUICtrlSetFont($mxPlore,$Font)
    EndSwitch
    EndIf
    EndFunc ;==>_zoom

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

    While 1
    Sleep(20)
    WEnd

    [/autoit]

    Jetzt habe ich mir allerdings gedacht, dass ich mit sicherheit später nicht nur eine Control in meinem GUI haben werde, die ich vergrößern möchte, sonder mehrere _einzeln_
    Also habe ich das ganze ein bisschen erweitert.
    Das Ziel des ganzen ist es, die Schriftgröße des aktuell unter der Maus befindlichen Controls zu ändern - Da ich aber nicht wusste wie ich den Handle eine Controls unter der Maus herausbekomme, habe ich übergangsweise mit ControlGetFocus gearbeitet - also das zuletzt angeklickte Control soll vergrößert / verkleinert werden.

    Die Handles sowie die aktuelle schriftgröße werden in einem Array gespeichert, eigentlich sollte innerhalb der Funktion im Array nach dem Handle gesucht werden, und die dazugehörige Schriftgröße bei einem WheelUp um 0.5 vergrößert und bei einem WheelDown um 0.5 verkleinert werden. Klappt auch bei den Werten im Array - nur leider übernimmt er diese nicht ins GUI...

    Zum anschauen:
    (Hier wird zusätzlich zur MouseSetOnEvent_UDF.au3 auch die ArrayMore.au3 benötigt.)

    Spoiler anzeigen
    [autoit]


    #include <MouseSetOnEvent_UDF.au3>
    #include <Misc.au3>
    #include <GUIListBox.au3>
    #include <GUIListView.au3>
    #include <Array.au3>
    #include <ArrayMore.au3>
    HotKeySet("{ESC}", "_stirb")
    HotKeySet("{-}","_ZeigFont")
    Dim $Font[1][2]
    $mGUI = GUICreate("Teste",1000,600)
    $mLabel = GUICtrlCreateLabel("Das ist nur eine Test-GUI",20,20,800,100)
    $mListBox = GUICtrlCreateList("Test",20,250,460,300)
    $mListView = GUICtrlCreateListView("Test",500,250,480,300)
    $mEdit = GUICtrlCreateEdit("Blabalabalbalba",20,150,300,100)

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

    _Array2DAdd($Font,ControlGetHandle($mGUI,"",$mLabel)&'|'&8.5)
    _Array2DAdd($Font,ControlGetHandle($mGUI,"",$mListBox)&'|'&8.5)
    _Array2DAdd($Font,ControlGetHandle($mGUI,"",$mListView)&'|'&8.5)
    _Array2DAdd($Font,ControlGetHandle($mGUI,"",$mEdit)&'|'&8.5)
    _Array2DEmptyDel($Font)

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

    _MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT, "_zoom", 1,"",$mGUI)
    _MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "_zoom", 2,"",$mGUI)

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

    GUISetState()
    While 1
    $mhWnd = ControlGetHandle($mGUI,"",ControlGetFocus($mGUI))
    $n = _ArraySearch($Font,$mhWnd)
    ToolTip($mhWnd,MouseGetPos(0),MouseGetPos(1),"")
    ;~ TrayTip("Handle",$mhWnd&@CRLF&@CRLF&$n&@CRLF&@CRLF&$Font[$n][1],3)
    Sleep(20)
    WEnd

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

    Func _zeigfont()
    _ArrayDisplay($Font)
    EndFunc

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

    Func _stirb()
    Exit
    EndFunc ;==>_stirb

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

    Func _zoom($iDir)

    $mhWnd = ControlGetHandle($mGUI,"",ControlGetFocus($mGUI))
    $n = _ArraySearch($Font,$mhWnd,0,0,1)
    TrayTip("Handle",$mhWnd&@CRLF&@CRLF&$n&@CRLF&@CRLF&$Font[$n][1],3)
    If _IsPressed(11) Then
    Switch $iDir
    Case 1
    $Font[$n][1] = $Font[$n][1] + 0.5
    GUICtrlSetFont($mhWnd,$Font[$n][1])
    Case 2
    $Font[$n][1] = $Font[$n][1] - 0.5
    GUICtrlSetFont($mhWnd,$Font[$n][1])
    EndSwitch
    EndIf
    ;
    EndFunc ;==>_zoom

    [/autoit]

    Wenn ihr mir helfen könnt den Fehler zu finden / mir eine alternative zu meiner vorgehensweise sagen könntet, wär ich schonmal ein gutes stück weiter ;)

    Danke & Gruß

    SEuBo

    EDIT: Habe grad nochmal einen genauen blick in die Hilfe geworfen und auch dort steht ja, dass man dafür die ControlID braucht. Nicht den ControlHandle. jetzt brauch ich entweder eine lösung die schriftgröße über den handle zu verändern, ODER die ControlID des zuletzt aktiven Controls auszulesen.. sowas wie

    [autoit]

    ControlGetID(ControlGetFocus(""))

    [/autoit]

    ;/

    EDIT: Titel nochmal angepasst - vielleciht schauen dann mehr hier in den thread

  • Ich habe diese Nacht ein bisschen gebastelt und bin soweit dass eigentlich alles klappt. Ich habe zuerst die GUICtrlSetOnHover_UDF.au3 verwendet um die ControlID des aktuell gehoverten Controls in eine Variable zu speichern und die dann weiterzuverarbeiten ( wie im Post 1, version 2; nur mit ControlID statt handle ).

    Das ganze war Super-Instabil und ist oft abgestürzt, also musste ich mich nach alternativen umsehen. Ich wollte erst die "Hoverabfrage" der GUICtrlSetOnHover_UDF verwenden (Irgendwas mit GUIRegisterMsg und WM_MOUSEHOVER - da hab ich aber absolut nich durchgeblickt.) Also weitersuchen ! Und siehe da: Es gibt ja GUIGetCursorInfo.

    Man braucht auch hier die im letzten Post verlinkte MouseSetOnEvent.
    Hier also die neue Version mit GUIGetCursorInfo():

    Spoiler anzeigen
    [autoit]


    #include <MouseSetOnEvent_UDF.au3>
    #include <Misc.au3>
    #include <GUIListBox.au3>
    #include <GUIListView.au3>
    #include <Array.au3>
    #include <ArrayMore.au3>
    HotKeySet("{ESC}", "_stirb")
    HotKeySet("{-}","_ZeigFont")
    Dim $Font[1][2]
    $mGUI = GUICreate("Teste",1000,600)
    $mLabel = GUICtrlCreateLabel("Das ist nur eine Test-GUI",20,20,400,100)
    GUICtrlSetFont(-1,16)
    $mListBox = GUICtrlCreateList("Test",20,250,460,300)
    $mListView = GUICtrlCreateListView("Test",500,250,480,300)
    $mEdit = GUICtrlCreateEdit("Blabalabalbalba",20,150,300,100)

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

    $arraydisplay = _GUICtrlListView_Create($mGUI,"Index|Col0|Col1",500,20,460,200)

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

    _Array2DAdd($Font,0&'|'&"NA")
    _Array2DAdd($Font,$mLabel&'|'&16)
    _Array2DAdd($Font,$mListBox&'|'&8.5)
    _Array2DAdd($Font,$mListView&'|'&8.5)
    _Array2DAdd($Font,$mEdit&'|'&8.5)
    $Font[0][0] = "Current"
    $Font[0][1] = 0

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

    _MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT, "_zoom", 1,"",$mGUI)
    _MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "_zoom", 2,"",$mGUI)

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

    GUISetState()
    While 1
    ToolTip($Font[0][1],MouseGetPos(0)+20,MouseGetPos(1)+20)
    Sleep(50)

    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch

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

    $mouse = GUIGetCursorInfo()
    Switch $mouse[4]
    Case $mEdit
    $Font[0][1] = $mEdit
    Case $mListBox
    $Font[0][1] = $mListBox
    Case $mListView
    $Font[0][1] = $mListView
    Case $mLabel
    $Font[0][1] = $mLabel
    Case ""
    $Font[0][1] = 0
    EndSwitch
    WEnd

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

    Func _zeigfont()
    _ArrayDisplay($Font)
    EndFunc

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

    Func _stirb()
    Exit
    EndFunc ;==>_stirb

    Func _zoom($iDir)
    $n = _ArraySearch($Font,$Font[0][1])
    TrayTip("Handle",$Font[0][1]&@CRLF&@CRLF&$n&@CRLF&@CRLF&$Font[$n][1],3)
    If Not $Font[0][1] = 0 Then
    If _IsPressed(11) Then
    Switch $iDir
    Case 1
    $Font[$n][1] += 0.5
    GUICtrlSetFont($Font[0][1],$Font[$n][1])
    Case 2
    $Font[$n][1] -= 0.5
    GUICtrlSetFont($Font[0][1],$Font[$n][1])
    EndSwitch
    EndIf
    Else
    If _IsPressed(11) Then
    Switch $iDir
    Case 1
    For $i = 2 to Ubound($Font)-1
    $Font[$i][1] += 0.5
    GUICtrlSetFont($Font[0][1],$Font[$i][1])
    Next
    Case 2
    For $i = 1 to Ubound($Font)-1
    $Font[$i][1] -= 0.5
    GUICtrlSetFont($Font[0][1],$Font[$i][1])
    Next
    EndSwitch
    EndIf
    EndIf

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

    EndFunc ;==>_zoom

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

    Jetzt komme ich zu meinem neuen "Problem": Der gedanke hinter dem ganzen ist ja, dass beim Hovern, sowie STRG+Mausrad die Schriftgröße verändert wird. Wird kein element gehovert, soll die Schriftgröße aller Controls verändert werden
    Das klappt auch (fast). Das einzige Problem ist, dass die neuen Schriftgrößen für jede Control erst übernommen werden, sobald man die Font dieses Controls wieder einzelnd ändert.

    Bitte testet das ganze mal.
    Wenn mir jemand einen vorschlag machen könnte, zb. einen GUICtrlRefreshAll oder GUICtrlRedraw()
    oder sonst irgendwas, wär ich sehr dankbar ;)

    Edit: Habe auch schon

    [autoit]

    DLLCall("user32.dll","int","InvalidateRect","hwnd",$hwnd,"int",0,"int",0)

    [/autoit]


    probiert. Und zwar
    - Innerhalb der For-Schleifen, mit dem $hwnd als Control handle (Mit GUICtrlGetHandle($Font[0][1])
    - Innerhalb der For-Schleifen, mit dem $hwnd als GUI handle ($mGUI)
    - Außerhalb der regulären For-Schleifen (vor EndFunc), in einer eigenen Schleife zum Refreshen
    - Außerhalb der For-Schleifen, mit dem $hwnd als GUI Handle ($mGUI)

    Das einzige was sich hier ändert ist, dass es nochmal um das dreifache mehr flackert. :S

    Kommt schon - ich brauch Hilfe :(

    • Offizieller Beitrag

    Hallo

    Du hast ein kleinen Fehler in der For schleife gemacht.

    [autoit]

    GUICtrlSetFont($Font[0][1], $Font[$i][1])

    [/autoit]


    Müsste eigentlich das sein:

    [autoit]

    GUICtrlSetFont($Font[$i][0], $Font[$i][1])

    [/autoit]

    So Funktioniert es:

    Spoiler anzeigen
    [autoit]

    #include <MouseSetOnEvent_UDF.au3>
    #include <Misc.au3>
    #include <GUIListBox.au3>
    #include <GUIListView.au3>
    #include <Array.au3>
    #include <ArrayMore.au3>
    HotKeySet("{ESC}", "_stirb")
    HotKeySet("{-}", "_ZeigFont")
    Dim $Font[1][2]
    $mGUI = GUICreate("Teste", 1000, 600)
    $mLabel = GUICtrlCreateLabel("Das ist nur eine Test-GUI", 20, 20, 400, 100)
    GUICtrlSetFont(-1, 16)
    $mListBox = GUICtrlCreateList("Test", 20, 250, 460, 300)
    $mListView = GUICtrlCreateListView("Test", 500, 250, 480, 300)
    $mEdit = GUICtrlCreateEdit("Blabalabalbalba", 20, 150, 300, 100)

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

    $arraydisplay = _GUICtrlListView_Create($mGUI, "Index|Col0|Col1", 500, 20, 460, 200)

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

    _Array2DAdd($Font, 0 & '|' & "NA")
    _Array2DAdd($Font, $mLabel & '|' & 16)
    _Array2DAdd($Font, $mListBox & '|' & 8.5)
    _Array2DAdd($Font, $mListView & '|' & 8.5)
    _Array2DAdd($Font, $mEdit & '|' & 8.5)
    $Font[0][0] = "Current"
    $Font[0][1] = 0

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

    _MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT, "_zoom", 1, "", $mGUI)
    _MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "_zoom", 2, "", $mGUI)

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

    GUISetState()
    While 1
    ToolTip($Font[0][1], MouseGetPos(0) + 20, MouseGetPos(1) + 20)
    Sleep(50)

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

    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch

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

    $mouse = GUIGetCursorInfo()
    Switch $mouse[4]
    Case $mEdit
    $Font[0][1] = $mEdit
    Case $mListBox
    $Font[0][1] = $mListBox
    Case $mListView
    $Font[0][1] = $mListView
    Case $mLabel
    $Font[0][1] = $mLabel
    Case ""
    $Font[0][1] = 0
    EndSwitch
    WEnd

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

    Func _zeigfont()
    _ArrayDisplay($Font)
    EndFunc ;==>_zeigfont

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

    Func _stirb()
    Exit
    EndFunc ;==>_stirb

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

    Func _zoom($iDir)
    $n = _ArraySearch($Font, $Font[0][1])
    TrayTip("Handle", $Font[0][1] & @CRLF & @CRLF & $n & @CRLF & @CRLF & $Font[$n][1], 3)
    If $Font[0][1] Then ;$Font[0][1] = 0 is das gleiche wie Not $Font[0][1]. Not $Font[0][1] = 0 ist das gleiche wie Not Not $Font[0][1] ;)
    If _IsPressed(11) Then
    Switch $iDir
    Case 1
    $Font[$n][1] += 0.5
    GUICtrlSetFont($Font[0][1], $Font[$n][1])
    Case 2
    $Font[$n][1] -= 0.5
    GUICtrlSetFont($Font[0][1], $Font[$n][1])
    EndSwitch
    EndIf
    Else
    ConsoleWrite(":)!" & @CRLF)
    If _IsPressed(11) Then
    Switch $iDir
    Case 1
    For $i = 2 To UBound($Font) - 1
    $Font[$i][1] += 0.5
    GUICtrlSetFont($Font[$i][0], $Font[$i][1])
    Next
    Case 2
    For $i = 1 To UBound($Font) - 1
    $Font[$i][1] -= 0.5
    GUICtrlSetFont($Font[$i][0], $Font[$i][1])
    Next
    EndSwitch
    EndIf
    EndIf

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

    EndFunc ;==>_zoom

    [/autoit]

    Gruß
    Spider

  • Du bist der Hammer!
    Also lag das problem doch wieder zwischen den Ohren >.>
    Danke auf jeden Fall, ich glaub nicht, dass ich das ohne dich hinbekommen hätte..

    Jetzt im wo ichs weiß geht mir ein Licht auf... klar dass ich nicht die Font der Control "0" ändern kann -.-
    Danke danke danke danke <3