Frage zum Script :

  • Hallo Autit'ler

    Hab mal eine Fragen zu diesem Script :

    Spoiler anzeigen
    [autoit]


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

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

    Global $g_hGui, $g_aGuiPos, $g_hPic, $g_aPicPos

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

    Example()

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

    Func Example()
    $g_hGui = GUICreate("test transparentpic", 200, 100,-1,-1)
    $g_hPic = GUICreate("", 68, 71, 10, 20, $WS_POPUp, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $g_hGui)
    $tst = GUICtrlCreatePic("tets\char.bmp", -1, -1, 0, 0)

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

    GUISetState(@SW_SHOW, $g_hPic)
    GUISetState(@SW_SHOW, $g_hGui)

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

    HotKeySet("{ESC}", "Main")
    HotKeySet("{Left}", "Left")
    HotKeySet("{Right}", "Right")
    HotKeySet("{Down}", "Down")
    HotKeySet("{Up}", "Up")
    $g_aPicPos = WinGetPos($g_hPic)
    $g_aGuiPos = WinGetPos($g_hGui)

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

    ; Loop until the user exits.
    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop

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

    EndSwitch
    WEnd

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

    HotKeySet("{ESC}")
    HotKeySet("{Left}")
    HotKeySet("{Right}")
    HotKeySet("{Down}")
    HotKeySet("{Up}")
    EndFunc ;==>Example

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

    Func Main()
    $g_aGuiPos = WinGetPos($g_hGui)
    WinMove($g_hGui, "", $g_aGuiPos[0] + 10, $g_aGuiPos[1] + 10)
    EndFunc ;==>Main

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

    Func Left()
    $g_aPicPos = WinGetPos($g_hPic)
    WinMove($g_hPic, "", $g_aPicPos[0] - 10, $g_aPicPos[1])
    EndFunc ;==>Left

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

    Func Right()
    $g_aPicPos = WinGetPos($g_hPic)
    WinMove($g_hPic, "", $g_aPicPos[0] + 10, $g_aPicPos[1])
    EndFunc ;==>Right

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

    Func Down()
    $g_aPicPos = WinGetPos($g_hPic)
    WinMove($g_hPic, "", $g_aPicPos[0], $g_aPicPos[1] + 10)
    EndFunc ;==>Down

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

    Func Up()
    $g_aPicPos = WinGetPos($g_hPic)
    WinMove($g_hPic, "", $g_aPicPos[0], $g_aPicPos[1] - 10)
    EndFunc ;==>Up

    [/autoit]

    Kann man dies auch umschreiben?
    So das das Bild nur innerhalb vom Gui funktioniert und nicht außerhalb vom Gui?


    Würde mich Freuen, wenn jemand meine Frage beantworten kann.

    :):):):)

    Eine Antwort :D

  • Danke,

    Trz gibt es da eine kleine Frage,

    ShitDown : Ich verstehe nicht viel wenn es um Bilder verschieben geht.
    Beschäftige mich erst neu damit,

    KloMeister : Oke, aber wo brauche ich die 2 variablen?
    GuictrlsetPos, etwas wohin positionieren .
    Aber das zweite, Null Plan :)

    Würde mich um Hilfe Freuen,

    Neben versuch ich irgendwie es selber xD Only Error , Danke trz :)

    :):):):)

    Eine Antwort :D

  • Hier mal ein kleines Beispiel wie das funktionieren könnte... ;)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    Global $iSpeed = 10

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

    $hGui = GUICreate("bsp", 500, 500, -1, -1)
    $hDummy = GUICtrlCreateLabel("", 100, 100, 50, 50)
    GUICtrlSetBkColor($hDummy, 16711680)
    GUISetState(@SW_SHOW)

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

    HotKeySet("{ESC}", "keyPressed")
    HotKeySet("{Left}", "keyPressed")
    HotKeySet("{Right}", "keyPressed")
    HotKeySet("{Down}", "keyPressed")
    HotKeySet("{Up}", "keyPressed")

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

    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop

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

    EndSwitch
    WEnd

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

    Func keyPressed()
    ConsoleWrite(@HotKeyPressed & @LF)
    Switch @HotKeyPressed
    Case "{ESC}"
    GUICtrlSetPos($hDummy, 0, 0)
    Case "{UP}"
    setPosRelative($hDummy, 0, -$iSpeed)
    Case "{RIGHT}"
    setPosRelative($hDummy, $iSpeed, 0)
    Case "{DOWN}"
    setPosRelative($hDummy, 0, $iSpeed)
    Case "{LEFT}"
    setPosRelative($hDummy, -$iSpeed, 0)
    EndSwitch
    EndFunc ;==>keyPressed

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

    Func setPosRelative($hCtrl, $iLeft, $iTop)
    Local $aPos = ControlGetPos("", "", $hCtrl)
    If @error Then Return SetError(1)
    GUICtrlSetPos($hCtrl, $aPos[0] + $iLeft, $aPos[1] + $iTop)
    EndFunc ;==>setPosRelative

    [/autoit]

    LG
    Christoph :)

  • Ja es funktioniert Super.

    Kleine Frage ( Welche Variable wäre jetzt geeignet, das der Rote Block im Gui bleibt?

    Muss da nicht in einer der Zeilen, noch am ende $hGui? So das er im Gui bleibt?
    Oder kann man das mit ewas anderes Definieren (Denn rand ?) via Label od rand angabe?

    AutoIt
    $rand = Y to Z 
    
    
    $block = guictrlcreatelabel(#)
    
    
    if $rand = $block then
    endif

    sowas irgendwas?

    Push:

    Niemand eine Idee?

    :):):):)

    Eine Antwort :D

    Einmal editiert, zuletzt von bernd670 (17. Mai 2015 um 17:17)

    • Offizieller Beitrag

    Wo ist das Problem?
    Links und Oben haben als Koordinaten jeweils Null. Rechts und Unten ergibt sich aus Width und Heigth der GUI.
    Nun brauchst Du nur noch vor dem verschieben abfragen, ob die neue Position kleiner als 0 oder größer als Width/Height werden würde und Du verschiebst dann halt nicht.
    Wenn noch ein zusätzlicher Rand vorhanden sein soll, dann halt plus/minus diesem Rand.

  • Niemand eine Idee?

    Ich weis es kann frustrierend sein wenn man programmieren möchte, aber ein Problem nicht gelöst bekommt. Allerdings musst du dir überlegen, dass die Menschen die dir hier helfen auch noch eigene Probleme zu lösen haben. :D Wenn man hier schnell Hilfe bekommt wie es oft der Fall ist, dann ist das eine tolle Sache, aber eben keine Selbstverständlichkeit! Geduld... :)

    Oder kann man das mit ewas anderes Definieren (Denn rand ?) via Label od rand angabe?

    Ums kurz zu machen: Ja, das kann man definieren. Und das ist eben die Aufgabe der wir Programmierer uns stellen müssen. :D Du musst dir überlegen was du erreichen möchtest: "Das innere Ding darf nicht aus dem äußeren Ding". Im nächsten Schritt gilt es festzustellen wie der Zustand den wir vermeiden möchten denn überhaupt zustande komm und man könnte feststellen: "Nur wenn sich das innere Ding bewegt kann es 'über den Rand gehen' . Ein logischer Schluss den wir nun daraus ziehen können ist, dass wir an der Stelle im Quellcode an der wir die Position verändern - also möglicher Weise über den Rand treten - eine Abfrage benötigen, die prüft ob wir denn aus dem GUI gelaufen sind.

    [autoit]

    Func bewegDasDing()
    If (Wat kommt denn hier hin? :o) Then
    bewegen() ; wir bewegen uns nur sofern wir nicht den Rand übertreten
    EndIf
    EndFunc

    [/autoit]

    Was nun noch fehlt ist ein Stückchen Software das feststellt ob wir denn über denn Rand laufen wenn wir uns jetzt wie gewünscht bewegen. In deinem Beispiel soll grob gesagt ein Rechteck (Bild) in einem anderen Rechteck (GUI) bleiben. Von beiden Rechtecken haben wir Position und Größe. Läuft das innere Rechteck zum Beispiel links aus dem Größeren, sinkt die X-Komponente der Position des Inneren unter den Wert der X-Komponente des Größeren. In einer Abfrage ausgedrückt könnte man das wie folgt schreiben: "Wenn (PositionInneres_X > PositionÄußeres_X) Dann dürfen wir uns Bewegen." Natürlch müsste man diese Abfrage noch um die anderen "Ränder" die überschritten werden könnten erweitern, damit das Ziel das wir oben definiert haben ("Das innere Ding darf nicht aus dem äußeren Ding") auch erreicht wird. Aber das schaffst du nun denke ich selbst. :)
    Ich hoffe ich konnte dir erklären wie du dein Problem selbst lösen kannst. :saint:
    Edit: Da will man einmal nicht mit fertigem Code um sich werfen :D

    LG
    Christoph :)

  • Das Script von dir Christoph

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>

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

    Global $iSpeed = 10

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

    $hGui = GUICreate("bsp", 500, 500, -1, -1)
    $hDummy = GUICtrlCreateLabel("", 100, 100, 50, 50)
    GUICtrlSetBkColor($hDummy, 16711680)
    GUISetState(@SW_SHOW)

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

    HotKeySet("{ESC}", "keyPressed")
    HotKeySet("{Left}", "keyPressed")
    HotKeySet("{Right}", "keyPressed")
    HotKeySet("{Down}", "keyPressed")
    HotKeySet("{Up}", "keyPressed")

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

    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop

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

    EndSwitch
    WEnd

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

    Func keyPressed()
    ConsoleWrite(@HotKeyPressed & @LF)
    Switch @HotKeyPressed
    Case "{ESC}"
    GUICtrlSetPos($hDummy, 0, 0)
    Case "{UP}"
    setPosRelative($hDummy, 0, -$iSpeed)
    Case "{RIGHT}"
    setPosRelative($hDummy, $iSpeed, 0)
    Case "{DOWN}"
    setPosRelative($hDummy, 0, $iSpeed)
    Case "{LEFT}"
    setPosRelative($hDummy, -$iSpeed, 0)
    EndSwitch
    EndFunc ;==>keyPressed

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

    Func setPosRelative($hCtrl, $iLeft, $iTop)
    Local $aPos = ControlGetPos("", "", $hCtrl)
    If @error Then Return SetError(1)
    GUICtrlSetPos($hCtrl, $aPos[0] + $iLeft, $aPos[1] + $iTop)
    EndFunc ;==>setPosRelative

    [/autoit]

    Da kann man raus aus der Gui, ich wollte dich mal Fragen, ob es auch gehen würde, das der Viereck nur in der Gui bleibt.

    :):):):)

    Eine Antwort :D

  • Sag mal hast du meine Antwort denn überhaupt gelesen?
    Falls Nein, scrolle bitte wieder nach oben und lies sie. Falls du sie doch schon gelesen hast möchte ich dich nocheinmal freundlichst darauf hinweißen, dass das hier kein Mach-Mir-Mal-Forum ist. Falls du nicht gewillt bist es wenigstens einmal selbst zu versuchen (wobei wir dir hier ja helfen möchten) dann solltest du lieber in den entsprechenden Bereich dieses Forums eine Programmieranfrage einstellen.

    LG
    Christoph :)

  • Ich gebe dir selber ein Tipp.

    Eigentlich zur Selbst Lösung, hätte ich mir paar ausgeklammerte Info´s gewünscht.

    Da ich nicht alle "Funktionen" kenne und somit nicht weiß, wozu deren werte da sind.

    Kritik ist sicherlich auch von meiner Seite erlaubt oder?

    Was ich sicherlich jetzt bemerkt habe:
    Das es etwas mit setPosRelative zutun haben könnte,

    [autoit]

    If setposRelative > 0 then
    error
    endif

    [/autoit]

    Sowas eventuell?

    :):):):)

    Eine Antwort :D

    Einmal editiert, zuletzt von baerchen (4. Februar 2015 um 07:43)

  • Ich hab dir mal das Script gebastelt... siehs dir an, dann verstehst du, was wir meinen ;)

    [autoit]

    Func setPosRelative($hCtrl, $iLeft, $iTop)
    Local $aPos = ControlGetPos($hGui, "", $hCtrl)
    $aWinPos=WinGetPos($hGui)
    If @error Then Return SetError(1)
    $moveX=$aPos[0] + $iLeft
    $moveY=$aPos[1] + $iTop
    ;X richtung abfragen
    if $aWinPos[2]<($aPos[0]+$iLeft+$aPos[2]) or $aPos[0]+$iLeft<0 then
    $moveX=$aPos[0]
    endif
    ;Y richtung abfragen (eventuell wegen der Leiste oben noch ein paar pixel extra abzeiehn)
    if $aWinPos[3]<($aPos[1]+$iTop+$aPos[3]) or $aPos[1]+$iTop<0 then
    $moveY=$aPos[1]
    endif
    GUICtrlSetPos($hCtrl,$moveX,$moveY)
    EndFunc ;==>setPosRelative

    [/autoit]


    wenn mans einmal verstanden hat ist es trivial

  • Ah, Jetzt versteh ich :D

    Oke, das hätte man sicherlich auch sagen können mit der Y,X Achse.

    Danke sehr.

    Wenn du mir noch schnell verättst was du mit Pixel meinst, wäre ich ein schritt schlauer :)

    :):):):)

    Eine Antwort :D

  • Dein Bildschirm besteht aus ganz vielen kleinen Lampen (vierecken). Diese einzelnen Vierecke nennt man Pixel. Die größe von Bildern wird ebenfalls in Pixeln angegeben. Wenn du an ein Bild ganz nah dranzoomst werden daraus ebenfalls Vierecke (mit einer farbe). Wenn du irgendwo eine Position angibst bezieht sich die in AutoIt (fast immer) auf Pixel, ebenso wie die Breite/Höhe.
    Bei der Höhe des Fensters zählen auch die Pixel der Leiste oben (mit dem öffnen und schließen-button) dazu. Diese höhe musst du abziehen, damit du den kasten am unteren rand nicht ein stück weit rausschieben kannst.
    (Die meisten Bildschirme haben heute 1920x1080pixel (außer es sind laptops). 1920 ist dabei die Breite, 1080 die Höhe.)
    (der rand oben sind glaubich ~16px)