Das Verhältnis verhält sich verhältnismäßig nicht so wie es soll

  • Hallo,
    ich habe mal wieder ein Trivialproblem. Ich möchte durch scrollen die Größe von Controls verändern. Funktioniert soweit. Da aber die Höhe im gleichen Maße wie die Breite verändert werden muss, errechne ich vorher das Verhältnis der Kantenlängen. In der Paxis funktioniert das leider nicht wie es soll. Beim hin und herscrollen verändert sich das Verhältnis, obwohl es ja gleich bleiben sollte...

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include "MouseOnEvent.au3"
    #Include <Misc.au3>

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

    global $zaehler

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 468, 343, 192, 114)
    $Group1 = GUICtrlCreateGroup("Ändern", 72, 120, 105, 185)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $plus = GUICtrlCreateButton("+", 336, 96, 27, 25, $WS_GROUP)
    $minus = GUICtrlCreateButton("-", 368, 96, 50, 50, $WS_GROUP)
    $label1 = GUICtrlCreateLabel("Verhältnis größer", 1, 1, 60, 40)
    $label2 = GUICtrlCreateLabel("Verhältnis kleiner", 1, 40, 60, 40)

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    ;~ $hot = HotKeySet("{a}", "msgbox1")
    $vUser32Dll = DllOpen("user32.dll")

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

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    case $GUI_EVENT_SECONDARYDOWN
    _MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "scrollunten")
    _MouseSetOnEvent($MOUSE_WHEELSCROLLup_EVENT, "scrolloben")
    Case $GUI_EVENT_SECONDARYUP
    _MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT)
    _MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT)
    EndSwitch
    WEnd

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

    Func scrollunten()
    $mausinfo = GUIGetCursorInfo($Form1)
    $controlinfo = ControlGetPos($Form1, "", $mausinfo[4])
    $verhaeltnis = $controlinfo[2] / $controlinfo[3]

    guictrlsetdata($label1, $verhaeltnis)

    $neuebreite = $controlinfo[2] * 0.95
    $neuehoehe = $neuebreite / $verhaeltnis
    GUICtrlSetPos ($mausinfo[4], $controlinfo[0], $controlinfo[1], $neuebreite, $neuehoehe)
    endFunc

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

    func scrolloben()
    $mausinfo = GUIGetCursorInfo($Form1)
    $controlinfo = ControlGetPos($Form1, "", $mausinfo[4])
    $verhaeltnis = $controlinfo[2] / $controlinfo[3]

    guictrlsetdata($label2, $verhaeltnis)

    $neuebreite = $controlinfo[2] * 1.05
    $neuehoehe = $neuebreite / $verhaeltnis
    GUICtrlSetPos ($mausinfo[4], $controlinfo[0], $controlinfo[1], $neuebreite, $neuehoehe)
    EndFunc

    [/autoit]

    Wenn ich $neuehoehe = $neuebreite / $verhaeltnis in $neuehoehe = $controlinfo[2] * 0.95 bzw. 1.05 ändere, passiert genau das gleiche mit den Controls. Sie werden beim hin- und herscrollen immer schmaler.

    Einmal editiert, zuletzt von Scritch (21. Juli 2011 um 16:22)

  • you make my day :)
    "Das Verhältnis verhält sich verhältnismäßig nicht so wie es soll »" :)

    Nun gut willst Du das alles berechen? Dafür gibt es doch Hilfsmittel, welche die Controls beim Resizen berücksichtigen.

    [autoit]

    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKTOP + $GUI_DOCKHCENTER)

    [/autoit]


    Hinter dem jeweiligen Control kann man es so im Prinzip bestimmen mit welchen Fixpunkten das Control verankert sein soll.

    Gruß Dietmar :D

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

    • Offizieller Beitrag

    Dein Ergebnis der neuen Größe hat mit Sicherheit Nachkommastellen, die dann gerundet werden. Somit verändert sich dein Control von mal zu mal mehr.
    Das kannst du nur verhindern, indem du die neue Größe nicht berechnest, sondern festlegst in einer Tabelle in der Form:

    Code
    WheelEvents  Ctrl-Größenänderung (Breite, Höhe)
        1                +1, +3
        2                +2, +4
        3                +3, +6
       ...
       -1                -1, -3
       -2                -2, -4
       -3                -3, -6
  • Hallo,

    es reicht normalerweise, das Seitenverhältnis nur genau einmal zu bestimmen und dann wiederholt anzuwenden, dann gleichen sich auch Rundungsfehler aus, z.B.:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    ; #include "MouseOnEvent.au3"
    #Include <Misc.au3>

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

    global $zaehler
    Global $aVerhaeltnisse[999]

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 468, 343, 192, 114)
    $Group1 = GUICtrlCreateGroup("Ändern", 72, 120, 105, 185)
    $aVerhaeltnisse[$Group1] = 105 / 185
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $plus = GUICtrlCreateButton("+", 336, 96, 27, 25, $WS_GROUP)
    $aVerhaeltnisse[$plus] = 27 / 25
    $minus = GUICtrlCreateButton("-", 368, 96, 50, 50, $WS_GROUP)
    $aVerhaeltnisse[$minus] = 50 / 50
    $label1 = GUICtrlCreateLabel("Verhältnis größer", 1, 1, 60, 40)
    $label2 = GUICtrlCreateLabel("Verhältnis kleiner", 1, 40, 60, 40)

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    ;~ $hot = HotKeySet("{a}", "msgbox1")

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

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    case $GUI_EVENT_SECONDARYDOWN
    GUIRegisterMsg($WM_MOUSEWHEEL, "_MouseWheel")
    Case $GUI_EVENT_SECONDARYUP
    GUIRegisterMsg($WM_MOUSEWHEEL, "")
    EndSwitch
    WEnd

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

    Func _MouseWheel($HWND, $Msg, $WParam, $LParam)
    If BitShift($WParam, 16) > 0 Then ; oder "<"
    scrollunten()
    Else
    scrolloben()
    EndIf
    Return 0
    EndFunc

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

    Func Scrollunten()
    $mausinfo = GUIGetCursorInfo($Form1)
    $ID = $mausinfo[4]
    If (Not $ID) Or (Not $aVerhaeltnisse[$ID]) Then Return
    $controlinfo = ControlGetPos($Form1, "", $ID)
    $verhaeltnis = $aVerhaeltnisse[$ID]
    guictrlsetdata($label1, $verhaeltnis)
    $neuebreite = $controlinfo[2] * 0.9
    $neuehoehe = $neuebreite / $verhaeltnis
    GUICtrlSetPos ($ID, $controlinfo[0], $controlinfo[1], $neuebreite, $neuehoehe)
    EndFunc

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

    Func Scrolloben()
    $mausinfo = GUIGetCursorInfo($Form1)
    $ID = $mausinfo[4]
    If (Not $ID) Or (Not $aVerhaeltnisse[$ID]) Then Return
    $controlinfo = ControlGetPos($Form1, "", $ID)
    $verhaeltnis = $aVerhaeltnisse[$ID]
    guictrlsetdata($label2, $verhaeltnis)
    $neuebreite = $controlinfo[2] * 1.1
    $neuehoehe = $neuebreite / $verhaeltnis
    GUICtrlSetPos ($mausinfo[4], $controlinfo[0], $controlinfo[1], $neuebreite, $neuehoehe)
    EndFunc

    [/autoit]
  • Man könnte es aber auch so realisieren:

    1. Du speicherst dir die Originalgröße also z.B. 30x40
    2. Verhältnis Höhe zu Breite 4:3, also 1.33
    3. Du richtest einen globalen Multiplier Zähler ein, Anfangs ist dieser auf 0, bei jeder Mausradbewegung wird er um 1 erhöht oder verringert.
    4. Du entscheides über die minimalen Vergrößerungsschritt. Wir nehmen hier 1 Pixel, angenehmer sind vielleicht 5 oder 10 Pixel, jenachdem wie schnell die Mausradgeschwindigkeit ist.
    5. Wird das Mausrad nun um 3 Schritte gedreht, also der multiplier steht auf 3, dann wird zur ursprünglichen Breite 30, 3x die Schrittweite addiert und die Höhe anhand des Verhältnisses berechnet. Zur Höhe werden dann 1,33x3xSchrittweite addiert, das Ergebnis rundest du dann noch auf Ganzzahlen.


    Das hat zwar zur Folge, dass das Verhältnis nicht immer eingehalten wird, jedoch beziehst du dich immer auf den Original Zustand des Controls und nicht auf die neuen aktuellen und bereits verfälschten Werte, was es von mal zu mal natürlich schlimmer machen würde. Deine Maximale Abweichung vom gewünschten Verhältnis beträgt also immer höchtens 1 Pixel.

  • Danke euch vieren. Die Möglichkeit von Großvater schien mir sich doch aber am einfachsten umsetzen zu lassen. Das Verhältnis im Array speichern und dann nicht immer neu zu berechnen. Bei dir funktioniert das acuh, Großvater. Ich habs mit meinem Lösungsweg versucht, der eigentlich nichts anderes macht als deiner, aber da klappts nun wieder nicht. Die Controls werden wieder schmaler.

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include "MouseOnEvent.au3"
    #Include <Misc.au3>
    #include <Array.au3>

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

    global $zaehler
    dim $aVerhaeltnis[100]

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 468, 343, 192, 114)
    $Group1 = GUICtrlCreateGroup("Ändern", 72, 120, 105, 185)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $plus = GUICtrlCreateButton("+", 336, 96, 27, 25, $WS_GROUP)
    $minus = GUICtrlCreateButton("-", 368, 96, 50, 50, $WS_GROUP)
    $label1 = GUICtrlCreateLabel("Verhältnis größer", 1, 1, 60, 40)
    $label2 = GUICtrlCreateLabel("Verhältnis kleiner", 1, 40, 60, 40)

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    $vUser32Dll = DllOpen("user32.dll")

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

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    _ArrayDisplay($aVerhaeltnis)
    Exit
    case $GUI_EVENT_SECONDARYDOWN
    _MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "scrollunten")
    _MouseSetOnEvent($MOUSE_WHEELSCROLLup_EVENT, "scrolloben")
    Case $GUI_EVENT_SECONDARYUP
    _MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT)
    _MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT)
    EndSwitch
    WEnd

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

    Func scrollunten()
    $mausinfo = GUIGetCursorInfo($Form1)
    $controlinfo = ControlGetPos($Form1, "", $mausinfo[4])
    $bereitsberechnet = _ArraySearch($aVerhaeltnis, $mausinfo[4])
    if not $aVerhaeltnis[$mausinfo[4]] > -1 Then
    $aVerhaeltnis[$mausinfo[4]] = $controlinfo[2] / $controlinfo[3]
    EndIf
    $neuebreite = $controlinfo[2] * 0.9
    $neuehoehe = $neuebreite / $aVerhaeltnis[$mausinfo[4]]
    GUICtrlSetPos ($mausinfo[4], $controlinfo[0], $controlinfo[1], $neuebreite, $neuehoehe)
    endFunc

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

    func scrolloben()
    $mausinfo = GUIGetCursorInfo($Form1)
    $controlinfo = ControlGetPos($Form1, "", $mausinfo[4])
    $bereitsberechnet = _ArraySearch($aVerhaeltnis, $mausinfo[4])
    if not $aVerhaeltnis[$mausinfo[4]] > -1 Then
    $aVerhaeltnis[$mausinfo[4]] = $controlinfo[2] / $controlinfo[3]
    EndIf
    $aVerhaeltnis[$mausinfo[4]] = $controlinfo[2] / $controlinfo[3]
    $neuebreite = $controlinfo[2] * 1.1
    $neuehoehe = $neuebreite / $aVerhaeltnis[$mausinfo[4]]
    GUICtrlSetPos ($mausinfo[4], $controlinfo[0], $controlinfo[1], $neuebreite, $neuehoehe)
    EndFunc

    [/autoit]
  • Naja dein Problem ist eben nachwievor, dass du mit verfälschten Werten weiterrechnest.

    Mal angenommen sowohl Breite und die resultierende Höhe müssen gerundet werden, dann verändert sich das reale Verhältnis von Beispielsweise dem gewünschten Verhältnis 2 auf 1,85.
    Im nächsten Durchgang ergeben sich wieder gerundete Werte für Höhe und Breite, hierbei wird dann vielleicht ein besseres Verhältnis von 1,95 oder gar 2 erreicht, jedoch ist das das Verhältnis der aktuellen Werte, welche ja bereits eine Verhältnisabweichung von 0.15 zum Ursprungsverhältnis hatten und nun nochmals um 0.5 abweichen. Das fällt anfangs nicht sonderlich ins Gewicht, jedoch wird dieser Effekt immer stärker je öffter du mit gerundeten und verfälschten Werten weiterrechnest. Im Idealfall bleibt das verfälschte Verhältnis bestehen, im schlechteren Fall wird es weiter verfälscht. Das kann sowohl positiv sein, als das es sich wieder an das Ursprungsverhältnis annähert oder auch negativ indem es weiter abtrifftet.

    Die einzige Lösung die ich dafür sehe ist es sich grundsätzlich auf die Ursprungsgröße zu beziehen (sowohl Breite als auch Höhe). Dadurch verwendest du niemals verfälschte Zwischenergebnisse, die Abweichung kann sich also nich multiplizieren.

  • Ich hatte in meinem alten Skript das Verhältnis ja immer neu berechnet. Ich habe also immer das Verhältnis der verfälschten Zahlen genommen und das hat das ja noch schlimmer gemacht. Ich verstehe zwar die problematik, aber ich frage mich trotzdem was Großvater in seinem Skript anders gemacht hat, als ich. Ich rechne, wie er, mit dem Verhältnis vom Anfang, da ich dieses ja in das Array geschrieben habe.
    Wenn alle Stränge reißen, dann werde ich deine Möglichkeit probieren, Misterspeed

  • Man könnte es aber auch so realisieren:

    1. Du speicherst dir die Originalgröße also z.B. 30x40
    2. Verhältnis Höhe zu Breite 4:3, also 1.33
    3. Du richtest einen globalen Multiplier Zähler ein, Anfangs ist dieser auf 0, bei jeder Mausradbewegung wird er um 1 erhöht oder verringert.
    4. Du entscheides über die minimalen Vergrößerungsschritt. Wir nehmen hier 1 Pixel, angenehmer sind vielleicht 5 oder 10 Pixel, jenachdem wie schnell die Mausradgeschwindigkeit ist.
    5. Wird das Mausrad nun um 3 Schritte gedreht, also der multiplier steht auf 3, dann wird zur ursprünglichen Breite 30, 3x die Schrittweite addiert und die Höhe anhand des Verhältnisses berechnet. Zur Höhe werden dann 1,33x3xSchrittweite addiert, das Ergebnis rundest du dann noch auf Ganzzahlen.


    Das hat zwar zur Folge, dass das Verhältnis nicht immer eingehalten wird, jedoch beziehst du dich immer auf den Original Zustand des Controls und nicht auf die neuen aktuellen und bereits verfälschten Werte, was es von mal zu mal natürlich schlimmer machen würde. Deine Maximale Abweichung vom gewünschten Verhältnis beträgt also immer höchtens 1 Pixel.


    Um nochmal zu der Idee zurück zu kommen: Ich denke die hat noch mehr Schwächen, als nur den einen Pixel Unterschied und das sich ändernde Verhältnis. Wenn man jetzt vll. Controls hat, die ein komisches Seitenverhältnis haben, Bsp. 301 Breite, 61 Höhe. Du hast jetzt sagen wir, eine Schrittweite von 3 Pixeln. Dann ist dein Control zwar 3 Pixel breiter, aber nur 0,6 Pixel höher. und du veränderst die Größe des Controls ja auch nicht nur einmal. Mache das 10, 15 Mal, dann haben wir wieder den Salat wie am Anfang!

  • Hier mal eine Methode inklusive Debug Werten im Label. Das Verhältnis bleibt konstant, die Abweichung bewegt sich innerhalb eines Pixels. Habe meinen ersten Gedanken nun anders umgesetzt, da es sonst Probleme mit negativen und positiven Zahlen gab.

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include "MouseOnEvent.au3"
    #Include <Misc.au3>
    #include <Array.au3>

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

    ;global $zaehler
    Global $aVerhaeltnis[100][4] ; id, breite, höhe, aktueller zoomfaktor
    Global $zoomStep = 10 ; Zomm Step in %
    Global $minimum = 50 ; kleinste Zoomstufe in %
    Global $maximum = 400 ; größte Zoomstufe in %

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 800, 343, 192, 114)
    $Group1 = GUICtrlCreateGroup("Ändern", 72, 120, 105, 185)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $plus = GUICtrlCreateButton("+", 336, 96, 27, 25, $WS_GROUP)
    $minus = GUICtrlCreateButton("-", 368, 96, 50, 50, $WS_GROUP)
    $test = GUICtrlCreateButton("test",250,20,100,60)

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

    $label1 = GUICtrlCreateLabel("Breite: ", 1, 1, 180, 20)
    $label2 = GUICtrlCreateLabel("Höhe: ", 1, 25, 180, 20)
    $label3 = GUICtrlCreateLabel("Verhältnis: ", 1, 50, 180, 20)
    $label4 = GUICtrlCreateLabel("Zoomfaktor: ", 1, 75, 180, 20)

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    $vUser32Dll = DllOpen("user32.dll")

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

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    _ArrayDisplay($aVerhaeltnis)
    Exit
    case $GUI_EVENT_SECONDARYDOWN
    _MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "scrollunten")
    _MouseSetOnEvent($MOUSE_WHEELSCROLLup_EVENT, "scrolloben")
    Case $GUI_EVENT_SECONDARYUP
    _MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT)
    _MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT)
    EndSwitch
    WEnd

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

    Func scrollunten()
    $mausinfo = GUIGetCursorInfo($Form1)
    $controlinfo = ControlGetPos($Form1, "", $mausinfo[4])
    $bereitsberechnet = _ArraySearch($aVerhaeltnis, $mausinfo[4],0,0,0,0,1,0)
    if $bereitsberechnet = -1 Then ; zum control liegen keine Stammdaten vor
    ConsoleWrite("minus" & @CRLF) ; darf nur einmalig zu sehn sein, danach ist die controlid im array gespeichert
    $aVerhaeltnis[$mausinfo[4]][0] = $mausinfo[4] ; id speichern
    $aVerhaeltnis[$mausinfo[4]][1] = $controlinfo[2] ; breite
    $aVerhaeltnis[$mausinfo[4]][2] = $controlinfo[3] ; höhe
    $aVerhaeltnis[$mausinfo[4]][3] = 100 ; zoomstufe Anfangswert
    EndIf
    if $aVerhaeltnis[$mausinfo[4]][3]-$zoomStep >= $minimum then $aVerhaeltnis[$mausinfo[4]][3] -= $zoomStep ; nur bis minimum größe soll die Zoomstufe geändert werden
    $neuebreite = $aVerhaeltnis[$mausinfo[4]][1] * ( $aVerhaeltnis[$mausinfo[4]][3] / 100 ) ; breite wird prozentual erniedrigt
    $neuehoehe = $aVerhaeltnis[$mausinfo[4]][2] * ( $aVerhaeltnis[$mausinfo[4]][3] / 100 ) ; breite wird prozentual erniedrigt
    GUICtrlSetPos ($mausinfo[4], $controlinfo[0], $controlinfo[1], $neuebreite, $neuehoehe)
    GUICtrlSetData($label1,"Breite: " & $neuebreite & " (" & $aVerhaeltnis[$mausinfo[4]][1] & ")")
    GUICtrlSetData($label2,"Höhe: " & $neuehoehe & " (" & $aVerhaeltnis[$mausinfo[4]][2] & ")")
    GUICtrlSetData($label3,"Verhältnis: " & Round($neuebreite/$neuehoehe,4) & " (" & Round($aVerhaeltnis[$mausinfo[4]][1]/$aVerhaeltnis[$mausinfo[4]][2],4) & ")")
    GUICtrlSetData($label4,"Zoomfaktor: " & $aVerhaeltnis[$mausinfo[4]][3] & " (100)")
    endFunc

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

    func scrolloben()
    $mausinfo = GUIGetCursorInfo($Form1)
    $controlinfo = ControlGetPos($Form1, "", $mausinfo[4])
    $bereitsberechnet = _ArraySearch($aVerhaeltnis, $mausinfo[4],0,0,0,0,1,0)
    if $bereitsberechnet = -1 Then ; zum control liegen keine Stammdaten vor
    ConsoleWrite("plus" & @CRLF) ; darf nur einmalig zu sehn sein, danach ist die controlid im array gespeichert
    $aVerhaeltnis[$mausinfo[4]][0] = $mausinfo[4];$controlinfo[2] / $controlinfo[3]
    $aVerhaeltnis[$mausinfo[4]][1] = $controlinfo[2] ; breite
    $aVerhaeltnis[$mausinfo[4]][2] = $controlinfo[3] ; höhe
    $aVerhaeltnis[$mausinfo[4]][3] = 100 ; zoomstufe Anfangswert
    EndIf
    if $aVerhaeltnis[$mausinfo[4]][3]+$zoomStep <= $maximum then $aVerhaeltnis[$mausinfo[4]][3] += $zoomStep ; nur bis maximum soll die zoomstufe geändert werden
    $neuebreite = $aVerhaeltnis[$mausinfo[4]][1] * ( $aVerhaeltnis[$mausinfo[4]][3] / 100 ) ; breite wird prozentual erhöht
    $neuehoehe = $aVerhaeltnis[$mausinfo[4]][2] * ( $aVerhaeltnis[$mausinfo[4]][3] / 100 ) ; höhe wird prozentual erhöht
    GUICtrlSetPos ($mausinfo[4], $controlinfo[0], $controlinfo[1], $neuebreite, $neuehoehe)
    GUICtrlSetData($label1,"Breite: " & $neuebreite & " (" & $aVerhaeltnis[$mausinfo[4]][1] & ")")
    GUICtrlSetData($label2,"Höhe: " & $neuehoehe & " (" & $aVerhaeltnis[$mausinfo[4]][2] & ")")
    GUICtrlSetData($label3,"Verhältnis: " & Round($neuebreite/$neuehoehe,4) & " (" & Round($aVerhaeltnis[$mausinfo[4]][1]/$aVerhaeltnis[$mausinfo[4]][2],4) & ")")
    GUICtrlSetData($label4,"Zoomfaktor: " & $aVerhaeltnis[$mausinfo[4]][3] & " (100)")
    EndFunc

    [/autoit]
  • Hallo Scritch,

    das mache ich anders:

    [autoit]

    If (Not $ID) Or (Not $aVerhaeltnisse[$ID]) Then Return

    [/autoit]

    Die ControlID wird ja als Index des Array genutzt, nicht als Wert im Array abgelegt. _ArraySearch() wird deshalb kaum einen Treffer finden.

  • Jupp das wollte ich auch noch erwähnen, musste ich nämlich ändern. Der Vorteil meiner Variante ist übrigens, dass bei mir die Breite immer prozentual zur Ursprungsgröße verändert wird, also eine lineare vergrößerung/verkleinerung, bei Großvater wird immer prozentual zum aktuellen Wert geändert, was dann nicht mehr linear ist, also das verkleinern wird langsamer bzw das vergrößern wird schneller. Durch das Setzen eines Minmum und Maximum kann man auch verhindern dass das Control zu klein zum anklicken wird.

  • Misterspeed hat mich überzeugt :)
    Werde jetzt die Methode nehmen, weil die in meine Anwendung auch einfacher zu implementieren ist. Das mit dem Mini- und Maximum ist auch eine nette Idee. Hatte ich gar nicht in Erwägung gezogen.