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
Controlgröße durch scrollen verändern
-
- [ offen ]
-
Scritch -
14. Juli 2011 um 15:23 -
Geschlossen -
Erledigt
-
-
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>
[/autoit] [autoit][/autoit] [autoit]
#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>Global $objektepfad = @ScriptDir & "\Objekte\"
[/autoit] [autoit][/autoit] [autoit]
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]$hWnd = GUICreate("Drag/Drop Controls", 1400, 900)
[/autoit] [autoit][/autoit] [autoit]$geschaeftstellen = GUICtrlCreateGroup("Geschäftsstelle auswählen", 1230, 5, 150, 100)
[/autoit] [autoit][/autoit] [autoit]
$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)$Objekte = GUICtrlCreateGroup("Objekte verwalten", 1230, 115, 150, 320)
[/autoit] [autoit][/autoit] [autoit]
$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)$anderefunktionen = GUICtrlCreateGroup("Andere Funktionen", 1230, 445, 150, 180)
[/autoit] [autoit][/autoit] [autoit]
$exportieren = GUICtrlCreateButton("Grundriss exportieren", 1245, 470, 115, 25, $WS_GROUP)$grundrissgroup = GUICtrlCreateGroup("Grundriss", 5, 5, 1220, 890)
[/autoit] [autoit][/autoit] [autoit]guictrlsetstate($List1, $GUI_DISABLE)
[/autoit] [autoit][/autoit] [autoit]
guictrlsetstate($Button1, $GUI_DISABLE)
GUISetState(@SW_SHOW)GUISetState()
[/autoit]
$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
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 -
Muss man immer die Hände weg von der Maus nehmen
Naja nicht zwingend. Anstelle eines Inputs kannst du ja auch "+" und "-" Buttons/Icons oder noch bequemer ein "Slider" Control verwenden.
-
Ok, haste Recht. An die Möglichkeit hatte ich gar nicht geacht
Ich hatte norlich mal gelesen, wie man die Größe eines Controls ändert...
Habs aber vergessen :pinch: -
[autoit]
GUICtrlSetPos ( controlID, left, top [, width [, height]] )
[/autoit] -
Das habe ich gesucht, danke
Dennoch, möchte das jetzt wissen: Wie würde das denn mit dem Scrollrad der Maus funktionieren?
Und wie markiere ich ein Control?