Controlgröße durch scrollen verändern

  • Hallo,
    ich bin derzeit immernoch an meinem Raumplaner am schrauben und möchte nun Tische und PC's etc. durch gedrückt halen der linken Steuerungstaste und scrollen des Mausrades in der Größe verändern. Ansatz: gar keiner. Ich weiß, dass hier im Forum jmd. mal ein Skript geschrieben, was so einen Smiley über den Desktop hüpfen ließ. Dort konnte man auch die Größe des Smileys durch Drücken von strg und scrollen verändern. Hat jemand eine Idee wie ich das am einfachstesn bewerkstelligen kann? Möchte gar keine Lösung, nur einen Hinweis :)

  • Würd das eher mit einem child window inklusive Rahmen Lösen. Dadurch kannst du dann einfach den Rand packen und die child GUI(das Item) in alle Richtungen frei vergrößern. Muss natürlich dann einiges verändert werden wenn ich dein Script recht in Erinnerung habe.
    Alternativ wäre vielleicht auch denkbar am Rechten Rand die Attribute des angeklickten items anzuzeigen und per input eine Möglichkeit zugeben ene neue Breite/Höhe anzugeben. Dadurch kannst du sehr exakt und Maßstabsgetreu arbeiten.

  • Um mein Skript nochmal kurz in Erinnerung zu rufen:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <array.au3>
    #include <Misc.au3>
    #include <file.au3>
    #include <ListViewConstants.au3>
    #include <ScreenCapture.au3>

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

    Global $objektepfad = @ScriptDir & "\Objekte\"
    dim $aObjekte[9] = ["Tisch waagerecht", "Tisch senkrecht", "PC", "Telefon", "Bodendose", "LAN-Buchse", "Label", "GAA", "KAD"]
    dim $positionen[1][5]
    dim $positionenBackup[1][5] ;Hier wird beim Laden des Skriptes der Inhalt der .ini reingeschrieben und nicht verändert.
    dim $nichtverschieben[10]
    global $positionenspeicher = @scriptdir & "\positionen.ini" ;Sollen Änderungen nicht gespeichert werden, wird der Inhalt aus dem Backuparray geschrieben.
    global $erneutladen = 0
    dim $GSwechsel[1]

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

    $hWnd = GUICreate("Drag/Drop Controls", 1400, 900)

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

    $geschaeftstellen = GUICtrlCreateGroup("Geschäftsstelle auswählen", 1230, 5, 150, 100)
    $listegeschaeftsstellen = GUICtrlCreateCombo("GS auswählen", 1248, 32, 113, 25)
    GUICtrlSetData($listegeschaeftsstellen, "Burg|Büsum", "GS auswählen")
    $GSladen = GUICtrlCreateButton("Laden", 1248, 64, 115, 25, $WS_GROUP)

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

    $Objekte = GUICtrlCreateGroup("Objekte verwalten", 1230, 115, 150, 320)
    $List1 = GUICtrlCreateList("", 1240, 146, 130, 240)
    GUICtrlSetData($List1, "Tisch waagerecht|Tisch senkrecht|PC|Telefon|Bodendose|LAN-Buchse|Label|GAA|KAD")
    $Button1 = GUICtrlCreateButton("Hinzufügen", 1240, 396, 130, 25, $WS_GROUP)

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

    $anderefunktionen = GUICtrlCreateGroup("Andere Funktionen", 1230, 445, 150, 180)
    $exportieren = GUICtrlCreateButton("Grundriss exportieren", 1245, 470, 115, 25, $WS_GROUP)

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

    $grundrissgroup = GUICtrlCreateGroup("Grundriss", 5, 5, 1220, 890)

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

    guictrlsetstate($List1, $GUI_DISABLE)
    guictrlsetstate($Button1, $GUI_DISABLE)
    GUISetState(@SW_SHOW)

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

    GUISetState()
    $vUser32Dll = DllOpen("user32.dll")
    While True
    $msg = GUIGetMsg()
    Switch $msg
    $GSauswahl = GUICtrlRead($listegeschaeftsstellen)
    Case $GUI_EVENT_CLOSE
    $GSauswahl = GUICtrlRead($listegeschaeftsstellen)
    $msg = MsgBox(3, "Änderungen speichern", "Sollen die Änderungen gespeichert werden?")
    if $msg = 7 or 6 then
    speichern($msg, $GSauswahl)
    DllClose($vUser32Dll)
    Exit
    EndIf
    Case $GUI_EVENT_PRIMARYDOWN ;Wenn linke Maustaste gedrückt wird...
    $aMousePos = GUIGetCursorInfo($hWnd)
    _ArraySearch($positionen, $aMousePos[4], 0, 0, 0, 0, 1, 0) ;Wenn die ID des Controls nicht gefunden, handelt es sich um ein Control was verwschoben werden darf
    If not @error Then
    $iControl = $aMousePos[4]
    $aPos = ControlGetPos($hWnd, "", $iControl)
    $iDist_X = $aMousePos[0] - $aPos[0] ;Wenn man verschiebt, wird dort gegriffen, wo man klickt
    $iDist_Y = $aMousePos[1] - $aPos[1]
    While _IsPressed("01", $vUser32Dll)
    $aMousePos = GUIGetCursorInfo($hWnd)
    ControlMove($hWnd, "", $iControl, $aMousePos[0] - $iDist_X, $aMousePos[1] - $iDist_Y) ;Bewegt das Control zu der Position wo sich der Mauszeiger befindet
    Sleep(10)
    $controlPos = ControlGetPos($hWnd, "", $aMousePos[4])
    for $b = 0 to ubound($positionen) - 1
    $AktID = _ArraySearch($positionen, $aMousePos[4], 0, 0, 0, 0, 1, 0) ;Schaut an welcher Position die aktuelle ID (Worüber sich der Mauszeiger befindet) im Array steht
    if not @error Then
    $positionen[$AktID][2] = $controlPos[0] ;Es wird nach der aktuellen ID gesucht.(worüber sich der Mauszeiger befindet).
    $positionen[$AktID][3] = $controlPos[1] ;Dann werden die Koordinaten des Controls (nicht des Mauszeigers) gelesen und in das Array geschrieben
    EndIf
    Next
    WEnd
    EndIf
    Case $Button1
    $ausgewaehlt = GUICtrlRead($List1)
    if $ausgewaehlt = "Label" Then
    $positionen[ubound($positionen) - 1][4] = InputBox("Beschriftung des Labels", "Bitte geben Sie den Inhalt des Labels ein:")
    $positionen[ubound($positionen) - 1][0] = GUICtrlCreateLabel($positionen[ubound($positionen) - 1][4], 1110, 20, 50, 15) ;Erstellt ein Label mit der vorherig ausgewählten Beschriftung
    GUICtrlSetBkColor(-1, 0xFFFFFF) ;Setzt Hintergrundfarbe des Labels auf weiß
    Else
    $positionen[ubound($positionen) - 1][0] = GUICtrlCreatePic($objektepfad & $ausgewaehlt & ".jpg", 1100, 20, 0, 0, $GUI_ONTOP) ;Bild wird erstellt, wenn nicht "Label" ausgewählt wurde. Die ID wird ins Array geschrieben
    EndIf
    $positionen[ubound($positionen) - 1][1] = $ausgewaehlt ;Name des Controls was erstellt wurde wird in Array geschrieben
    ReDim $positionen[UBound($positionen)+1][5] ;Neue Dimensionierung des Array, weil ein Eintrag hinzugekommen ist
    Case $GUI_EVENT_SECONDARYUP ;Wenn Rechtsklick
    $aMousePos = GUIGetCursorInfo($hWnd)
    if $aMousePos[0] < 1230 then ;damit man alles was rechts ist in der groupbox nicht löschen kann
    $PosDelete = _ArraySearch($positionen, $aMousePos[4], 0, 0, 0, 0, 1, 0) ;Schaut an welcher Stelle im Array sich die ID befindet
    if not @error Then ;Wurde die ID gefunden, dann...
    GUICtrlDelete($aMousePos[4]) ;1...wird das Control mit der entsprechenden ID gelöscht
    _ArrayDelete($positionen, $PosDelete) ;2...wird der Eintrag aus Array gelöscht
    sleep(100)
    EndIf
    EndIf
    case $GSladen ;Wird der "Laden"-Button gedrück
    if $positionen[0][0] > 0 Then
    $msg = MsgBox(4, "Änderungen speichern", "Sollen die Änderungen gespeichert werden?")
    if $msg = 7 or 6 then
    speichern($msg, $GSauswahl)
    EndIf
    for $i = 0 to ubound($positionen) - 1
    GUICtrlDelete($positionen[$i][0])
    Next
    GUICtrlDelete($Grundriss)
    dim $positionen[1][5]
    dim $positionenBackup[1][5]
    $GSauswahl = GUICtrlRead($listegeschaeftsstellen)
    Else
    $GSauswahl = GUICtrlRead($listegeschaeftsstellen) ;1. Ist das Array der Positionen leer, dann wird $GSauswahl gleich der Auswahl gesetzt.
    EndIf ;Daten werden normal eingelsen

    guictrlsetstate($List1, $GUI_ENABLE)
    guictrlsetstate($Button1, $GUI_ENABLE)
    $grundriss = GUICtrlCreatePic("", 20, 25, 0, 0) ;Erstellt Bild des Grundrisses, Bild wird aber erst später sichtbar...*
    for $d = 0 to ubound($aObjekte) - 1 ;Anhand der Objekte aus dem Array $aObjects werden die Werte aus den jeweiligen Sektionen gelesen
    $section = IniReadSection (@ScriptDir & "\" & $GSauswahl & ".ini", $aObjekte[$d]) ;Hier werden die Positionen aus der .ini gelesen und in $positionen
    for $e = 1 to ubound($section) - 1 ;gespeichert, wo später vll. noch Objekte hinzukommen
    $coords = stringsplit($section[$e][1], ":") ;Der Wert aus .ini wird in 3 Teile gesplittet:
    $xcoord = $coords[1] ;1: X-Koordinate
    $ycoord = $coords[2] ;2: Y-Koordinate
    $labeltext = $coords[3] ;3: Inhalt des Labels
    if $aObjekte[$d] = "Label" Then ;Erstellt Label bzw...
    $positionen[ubound($positionen)- 1][0] = GUICtrlCreateLabel($labeltext, $xcoord, $ycoord, 50, 15)
    GUICtrlSetBkColor(-1, 0xFFFFFF)
    Else
    $positionen[ubound($positionen) - 1][0] = GUICtrlCreatePic($objektepfad & $aObjekte[$d] & ".jpg", $xcoord, $ycoord, 0, 0, $GUI_ONTOP) ;...Bilder an der Position, die aus .ini ausgelesen wurde
    EndIf ;ID's der Conrols werden in Array geschrieben
    $positionen[ubound($positionen)- 1][1] = $aObjekte[$d] ;Objektname, Koordinaten, Labeltext werden ebenfals ins Array geschrieben
    $positionen[ubound($positionen)- 1][2] = $xcoord
    $positionen[ubound($positionen)- 1][3] = $ycoord
    $positionen[ubound($positionen)- 1][4] = $labeltext
    ReDim $positionen[UBound($positionen)+1][5] ;Redimnesioniert, da es pro Eintrag größer wird, das Array
    Next
    Next
    for $f = 0 to ubound($positionen) - 1 ;Erstellt das Backuparray mit identischen Inhalten aus $positionen
    $positionenbackup[$f][0] = $positionen[$f][0] ;Hat man Änderungen vorgenommen, können diese verworfen werden, indem die Inhalte
    $positionenbackup[$f][1] = $positionen[$f][1] ;aus dem backuparray in die .ini geschrieben werden
    $positionenbackup[$f][2] = $positionen[$f][2]
    $positionenbackup[$f][3] = $positionen[$f][3]
    $positionenbackup[$f][4] = $positionen[$f][4]
    ReDim $positionenbackup[UBound($positionenbackup)+1][5]
    Next
    $grundrisscontrol = GUICtrlSetImage($grundriss, @ScriptDir & "\Grundrisse\" & $GSauswahl & ".jpg") ;*...und zwar hier. Verhindert, dass das Bild über den Objekten liegt.

    Case $exportieren
    $GSauswahl = GUICtrlRead($listegeschaeftsstellen)
    $PosGrundriss = ControlGetPos($hWnd, "", $grundriss)
    _ScreenCapture_CaptureWnd (@ScriptDir & "\Exporte\" & $GSauswahl & ".jpg", $hWnd, 22, 46, $PosGrundriss[2] + 22, $PosGrundriss[3] + 46)
    EndSwitch
    WEnd

    Func speichern($msg, $GSauswahl)
    FileDelete(@ScriptDir & "\" & $GSauswahl & ".ini") ;.ini muss nach jedem Einlesen in das Array gelöscht werden. Behält man die .ini bei,
    sleep(300)
    if $msg = 7 Then ;kann es bei Änderungen zu Geistereinträgen kommen
    for $c = 0 to ubound($positionenbackup) - 1 ;Änderungen nicht speichern: Backuparray wird in .ini geschrieben
    IniWrite(@ScriptDir & "\" & $GSauswahl & ".ini", $positionenbackup[$c][1], $positionenbackup[$c][0], $positionenbackup[$c][2] & ":" & $positionenbackup[$c][3] & ":" & $positionenbackup[$c][4])
    Next
    elseif $msg = 6 Then
    for $c = 0 to ubound($positionen) - 1 ;Änderungen speichern: Normales Array wird in .ini geschrieben
    IniWrite(@ScriptDir & "\" & $GSauswahl & ".ini", $positionen[$c][1], $positionen[$c][0], $positionen[$c][2] & ":" & $positionen[$c][3] & ":" & $positionen[$c][4])
    Next ;Der leere Eintrag in der .ini kommt daher, weil die letzte Zeile durch das letzte redim leer ist
    EndIf
    EndFunc

    [/autoit]


    Ja, das ganze Skript umkrempeln möchte ich natürlich ungern. Das mit der Breiten und Höhenangabe am rechten Rand ist mir auch schon in den Sinn gekommen. Finde es allerdings etwas unkomfortable. Objekt erstellen, in das Editfenster klciken, Größe ändern. Muss man immer die Hände weg von der Maus nehmen, was mich etwas stört. Die Maßstabstreue habe ich eigentlich erstmal außenvor gelassen, da alle Raumpläne nur eine ungefähre Übersicht geben sollten. Die Größe ändern wollte ich halt gerne, damit wenigstens ein bischen stimmtund die Tische in einer kleinen Filiale nicht so klein/groß sind wie in einer großen ;)

  • Ok, haste Recht. An die Möglichkeit hatte ich gar nicht geacht :D
    Ich hatte norlich mal gelesen, wie man die Größe eines Controls ändert...
    Habs aber vergessen :pinch: