Bild vergrößern und bewegen

  • Hallo, ich hab noch eine Frage, auch dazu finde ich nichts in der Hilfe und bei Google auch nicht das richtige.
    Die Frage:
    Ich hab dieses Script:

    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <SliderConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    $Form1 = GUICreate("Form1", 653, 426, 192, 124)
    $Pic1 = GUICtrlCreatePic("PFADZUMBILD", -8, 0, 657, 401, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    $Slider1 = GUICtrlCreateSlider(0, 400, 305, 25)
    $Button1 = GUICtrlCreateButton("Oben", 304, 400, 97, 25, $WS_GROUP)
    $Button2 = GUICtrlCreateButton("Unten", 400, 400, 91, 25, $WS_GROUP)
    $Button3 = GUICtrlCreateButton("Links", 488, 400, 83, 25, $WS_GROUP)
    $Button4 = GUICtrlCreateButton("Rechts", 568, 400, 83, 25, $WS_GROUP)
    GUISetState(@SW_SHOW)

    [/autoit]


    Nun möchte Ich wissen, wenn ich auf einen Button klicke, das er weiter nach "Links/Rechts/etc" geht.
    Weiß jetzt nicht genau wie ich das erklären soll, ich hoffe ihr versteht was ich meine.

    Edit: Ungefähr so wie auf http://maps.google.de/

  • so z.B.:

    Spoiler anzeigen
    [autoit]

    ; *** Start added by AutoIt3Wrapper ***
    #include <WindowsConstants.au3>
    ; *** End added by AutoIt3Wrapper ***
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Add_Constants=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <SliderConstants.au3>
    #include <StaticConstants.au3>
    $iLeft = 0
    $iTop = 0
    $iWidth = 150
    $iHeight = 150
    $Form1 = GUICreate("Form1", 653, 426, 192, 124)
    $Pic1 = GUICtrlCreatePic("PfadZumBild",$iLeft,$iTop, $iWidth, $iHeight, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    $Slider1 = GUICtrlCreateSlider(0, 400, 305, 25)
    $Button1 = GUICtrlCreateButton("Oben", 304, 400, 97, 25)
    $Button2 = GUICtrlCreateButton("Unten", 400, 400, 91, 25)
    $Button3 = GUICtrlCreateButton("Links", 488, 400, 83, 25)
    $Button4 = GUICtrlCreateButton("Rechts", 568, 400, 83, 25)
    GUISetState(@SW_SHOW)

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    case -3
    exit
    Case $Button1
    $iTop -= 1
    GUICtrlSetPos($Pic1,$iLeft,$iTop)
    Case $Button2
    $iTop += 1
    GUICtrlSetPos($Pic1,$iLeft,$iTop)
    Case $Button3
    $iLeft -= 1
    GUICtrlSetPos($Pic1,$iLeft,$iTop)
    Case $Button4
    $iLeft += 1
    GUICtrlSetPos($Pic1,$iLeft,$iTop)
    EndSwitch
    WEnd

    [/autoit]

    mfg (Auto)Bert

  • Ich denke das folgende kann in Grundzügen (Bild bewegt sich nach links) das was es soll...
    Der Ablauf des Programms sollte klar werden, dennoch kannst du gerne bei Problemen nachfragen.
    (Es ist schon recht spät -> Die Kommentierung ist auf der Strecke geblieben :rolleyes: )
    Hier meine Lösung:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <ScreenCapture.au3>
    #include <gdiplus.au3>
    #Region ### START Koda GUI section ### Form=
    _GDIPlus_Startup()
    $Form1 = GUICreate("Form1", 389, 445)
    $Graphics = _GDIPlus_GraphicsCreateFromHWND($Form1)
    $Bitmap = _GDIPlus_BitmapCreateFromGraphics(337, 337, $Graphics)
    $GDI_Buffer = _GDIPlus_ImageGetGraphicsContext($Bitmap)
    $Button1 = GUICtrlCreateButton("MOVE", 32, 384, 105, 49, $WS_GROUP)
    $Button2 = GUICtrlCreateButton("Exit", 256, 384, 105, 49, $WS_GROUP)
    $Pic = _ScreenCapture_Capture("")
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($Pic)
    _GDIPlus_GraphicsClear($GDI_Buffer)
    $x = 0
    GUISetState(@SW_SHOW)
    _GDIPlus_GraphicsClear($GDI_Buffer)
    _GDIPlus_GraphicsDrawImageRect($GDI_Buffer, $hImage, 0, 0, @DesktopWidth, @DesktopHeight)
    _GDIPlus_GraphicsDrawImageRect($Graphics, $Bitmap, 24, 16, 337, 337)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _GDIPlus_GraphicsDispose($Graphics)
    Exit
    Case $Button1
    $x += 20
    If @DesktopWidth - $x - 337 < 0 Then Beenden()
    _GDIPlus_GraphicsClear($GDI_Buffer)
    _GDIPlus_GraphicsDrawImageRect($GDI_Buffer, $hImage, 0 - $x, 0, @DesktopWidth, @DesktopHeight)
    _GDIPlus_GraphicsDrawImageRect($Graphics, $Bitmap, 24, 16, 337, 337)
    Case $Button2
    Beenden()

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

    EndSwitch
    WEnd

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

    Func Beenden()
    _GDIPlus_GraphicsClear($GDI_Buffer)
    _GDIPlus_GraphicsClear($Graphics)
    _GDIPlus_GraphicsDispose($Graphics)
    Exit
    EndFunc ;==>Beenden

    [/autoit]


    PS: Wenn du eine vergrößerte Darstellung haben willst, dann ist der aus nach "Case $Button1" Teil zu folgendem zu editieren:

    [autoit]

    $x += 20
    If @DesktopWidth*2- $x - 337 < 0 Then Beenden(); Vergrößerung mit Faktor 2
    _GDIPlus_GraphicsClear($GDI_Buffer)
    _GDIPlus_GraphicsDrawImageRect($GDI_Buffer, $hImage, 0 - $x, 0, @DesktopWidth*2, @DesktopHeight*2); Vergrößerung mit Faktor 2
    _GDIPlus_GraphicsDrawImageRect($Graphics, $Bitmap, 24, 16, 337, 337)

    [/autoit]


    ggf. musst du das Startbild auch mit dem Faktor 2 vergrößern,da es sonst beim Buttonklick etwas komisch wirkt :P

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

    Einmal editiert, zuletzt von XovoxKingdom (26. April 2010 um 23:47)

  • Hallo,
    ich habe das ganze noch mal verwendet, um das Bild mit der Maus bewegen und dem Mausrad zoomen zu können.
    Für das Mausrad wird MouseOnEvent.au3 benötigt. Link zur UDF. Dazu auch verwendete Vorlage hier im Forum .
    Vielen Dank für die Vorlagen.

    Für Verbesserungen bin ich jederzeit offen.

    Spoiler anzeigen
    [autoit]

    #include #include #include #include #include #include #include "MouseOnEvent.au3"
    #Region ### START Koda GUI section ### Form=
    OnAutoItExitRegister("Beenden") ; Ressourcen nach Beendigung wieder freigeben
    _GDIPlus_Startup()$Form1 = GUICreate("Form1", 389, 445)$Graphics = _GDIPlus_GraphicsCreateFromHWND($Form1)$Bitmap = _GDIPlus_BitmapCreateFromGraphics(337, 337, $Graphics)$GDI_Buffer = _GDIPlus_ImageGetGraphicsContext($Bitmap)$Button2 = GUICtrlCreateButton("Exit", 256, 384, 55, 20, $WS_GROUP)$Pic = _ScreenCapture_Capture("")$hImage = _GDIPlus_BitmapCreateFromHBITMAP($Pic)_GDIPlus_GraphicsClear($GDI_Buffer)Global $lx=0 ; Bild Koordinate XGlobal $ly=0; Bild Koordinate YGlobal $lb=@DesktopWidth ; BildbreiteGlobal $lh=@DesktopHeight ; BildhöheGlobal $px=24 ; Ausschnitt Koordinate XGlobal $py=16 ; Ausschnitt Koordinate YGlobal $pb=337 ; Ausschnitt BreiteGlobal $ph=337 ; Ausschnitt Höhe$mLosgelassen=TrueGlobal $zoom=1 ; ZoomfaktorGlobal $zooms=1 ; Alter Zoomfaktor$mxs=0 ;Alte Mauskoordinate x$mys=0 ;Alte Mauskoordinate y_MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "Scroll", +0.1,"",$Form1)_MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT, "Scroll", -0.1,"",$Form1)GUISetState(@SW_SHOW)NeuMalen() ; Zeichnet Ausschnitt#EndRegion ### END Koda GUI section ###
    While 1 sleep(20) $aInfo = GUIGetCursorInfo() if not @error Then if $aInfo[2]=0 Then ; Maus losgelassen $mLosgelassen=True EndIf If $aInfo[2] = 1 and $aInfo[4]=0 Then ; Maustaste 1 gedrückt und sonst kein Control angeklickt if $mLosgelassen=true Then $mLosgelassen=False $mxs=$aInfo[0] $mys=$aInfo[1] $lxs=$lx $lys=$ly endif $lx=$lxs+$aInfo[0] - $mxs $ly=$lys+$aInfo[1] - $mys NeuMalen() EndIf
    EndIf$nMsg = GUIGetMsg()Switch $nMsg Case $GUI_EVENT_CLOSE Beenden() Case $Button2 Beenden()EndSwitchWEnd
    Func Scroll($Para) $zooms=$zoom $zoom=$zoom+$Para if $zoom<0.1 then $zoom=0.1 Return Elseif $zoom>3 Then $zoom=3 Return EndIf $aInfo = GUIGetCursorInfo() if not @error Then $zoomn=$zoom/$zooms $lx=-((($aInfo[0]-$px)-$lx) * $zoomn-($aInfo[0]-$px)) $ly=-((($aInfo[1]-$py)-$ly) * $zoomn-($aInfo[1]-$py)) NeuMalen() EndIfEndFunc
    Func Koordinatenpruefen() if $lx>0 then $lx=0 if $ly>0 then $ly=0 if $lb*$zoom<$pb then $zoom=$pb/$lb if $lh*$zoom<$ph then $zoom=$ph/$lh if $lx<-$lb*$zoom+$pb then $lx=-$lb*$zoom+$pb if $ly<-$lh*$zoom+$ph then $ly=-$lh*$zoom+$phEndFunc
    Func NeuMalen() Koordinatenpruefen() _GDIPlus_GraphicsClear($GDI_Buffer) _GDIPlus_GraphicsDrawImageRect($GDI_Buffer, $hImage, $lx, $ly, $lb*$zoom, $lh*$zoom) _GDIPlus_GraphicsDrawImageRect($Graphics, $Bitmap, $px, $py, $pb, $ph)EndFunc
    Func Beenden() _GDIPlus_GraphicsClear($GDI_Buffer) _GDIPlus_GraphicsClear($Graphics) _GDIPlus_GraphicsDispose($Graphics) _MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "") _MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT, "") ExitEndFunc ;==>Beenden

    [/autoit]

    Gruß
    Andreas

  • Hallo,
    ich nochmal. Ich wußte jetzt nicht, ob ich einen neuen Fred aufmachen sollte?!
    Ich habe mein Skript noch einmal erweitert, um das GUI in der Größe verändern zu können. Dabei soll sich natürlich das Bild mit an die neue Fenstergröße anpassen.

    Irgendwie habe ich das mit dem GDIPlus-Zeugs noch nicht verstanden. Darum bin ich so vorgegangen, dass ich nach der Fensterveränderung alle GDI-Ressourcen wieder freigebe und das alles neu aufsetze mit den neuen Breiten und Höhenwerten.

    Leider hinterlässt er mir nach dem Freigeben ein schwarzen Kasten, der auch meinen Button überschreiben kann.

    Meine Fragen:
    1. Kann man das eleganter lösen, als alles wegzuschmeissen und neuaufzubauen?
    2. Wenn nicht, wie kriege ich das schwarze Loch weg, dass durch _GDIPlus_GraphicsClear hervorgerufen wird? Sollte dafür nicht der Parameter mit der Alpha-Komponente verwendet werden können? Wenn ich die GraphicsClear Dinger weglasse, sieht es gut aus.
    3. ( Schönheitsbonus: Der Button wird beim Verbreitern nicht richtig skaliert, so dass sich der Abstand zum Rand immer mehr vergrößert. Daher übermalt mein Bild ab einer gewissen Breite, den Button. Kann ich die Position eines Buttons ermitteln oder muß ich die Skalierung selber machen?)

    Ich habe im Script, die Zoom-Funktion mit dem Mausrad auskommentiert, so dass man die MouseOnEvent.au3 UDF nicht haben muß.

    Spoiler anzeigen
    [autoit]

    #include #include #include #include #include #include ;#include "MouseOnEvent.au3"
    #Region ### START Koda GUI section ### Form=OnAutoItExitRegister("Beenden") ; Ressourcen nach Beendigung wieder freigebenGlobal $lx=0 ; Bild Koordinate XGlobal $ly=0; Bild Koordinate YGlobal $lb=@DesktopWidth ; BildbreiteGlobal $lh=@DesktopHeight ; BildhöheGlobal $wb=390 ; GUI-BreiteGlobal $wh=445 ; GUI-HöheGlobal $px=5 ; Ausschnitt Koordinate XGlobal $py=5 ; Ausschnitt Koordinate YGlobal $pb=$wb-70 ; Ausschnitt BreiteGlobal $ph=$wh-17 ; Ausschnitt Höhe$mLosgelassen=TrueGlobal $zoom=1 ; ZoomfaktorGlobal $zooms=1 ; Alter ZoomfaktorGlobal $Pic$mxs=0 ;Alte Mauskoordinate x$mys=0 ;Alte Mauskoordinate y

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

    _GDIPlus_Startup()$Form1 = GUICreate("Form1", $wb, $wh,-1,-1,BitOR($GUI_SS_DEFAULT_GUI,$WS_SIZEBOX,$WS_THICKFRAME))$Button2 = GUICtrlCreateButton("Exit", $wb-60, $wh-25, 55, 20, $WS_GROUP)GUICtrlSetResizing(-1, $GUI_DOCKAUTO+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)$Graphics = _GDIPlus_GraphicsCreateFromHWND($Form1)$Bitmap = _GDIPlus_BitmapCreateFromGraphics($pb, $ph, $Graphics)$GDI_Buffer = _GDIPlus_ImageGetGraphicsContext($Bitmap)$Pic = _ScreenCapture_Capture("")$hImage = _GDIPlus_BitmapCreateFromHBITMAP($Pic);_MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, "Scroll", +0.1,"",$Form1);_MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT, "Scroll", -0.1,"",$Form1)GUISetState(@SW_SHOW)NeuMalen() ; Zeichnet Ausschnitt#EndRegion ### END Koda GUI section ###
    While 1 sleep(20) $aInfo = GUIGetCursorInfo() if not @error Then if $aInfo[2]=0 Then ; Maus losgelassen $mLosgelassen=True EndIf If $aInfo[2] = 1 and $aInfo[4]=0 Then ; Maustaste 1 gedrückt und sonst kein Control angeklickt if $mLosgelassen=true Then $mLosgelassen=False $mxs=$aInfo[0] $mys=$aInfo[1] $lxs=$lx $lys=$ly endif $lx=$lxs+$aInfo[0] - $mxs $ly=$lys+$aInfo[1] - $mys NeuMalen() EndIf
    EndIf $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Beenden() Case $GUI_EVENT_RESIZED $size=WinGetPos($Form1) $wb=$size[2] $wh=$size[3] $pb=$wb-85 $ph=$wh-17 _GDIPlus_GraphicsClear($GDI_Buffer) _GDIPlus_GraphicsClear($Graphics) _GDIPlus_GraphicsDispose($Graphics) $Graphics = _GDIPlus_GraphicsCreateFromHWND($Form1) $Bitmap = _GDIPlus_BitmapCreateFromGraphics($pb, $ph, $Graphics) $GDI_Buffer = _GDIPlus_ImageGetGraphicsContext($Bitmap) $hImage = _GDIPlus_BitmapCreateFromHBITMAP($Pic) NeuMalen() Case $Button2 Beenden() EndSwitchWEnd
    Func Scroll($Para) $zooms=$zoom $zoom=$zoom+$Para if $zoom<0.1 then $zoom=0.1 Return Elseif $zoom>3 Then $zoom=3 Return EndIf $aInfo = GUIGetCursorInfo() if not @error Then $zoomn=$zoom/$zooms $lx=-((($aInfo[0]-$px)-$lx) * $zoomn-($aInfo[0]-$px)) $ly=-((($aInfo[1]-$py)-$ly) * $zoomn-($aInfo[1]-$py)) NeuMalen() EndIfEndFunc
    Func Koordinatenpruefen() if $lx>0 then $lx=0 if $ly>0 then $ly=0 if $lb*$zoom<$pb then $zoom=$pb/$lb if $lh*$zoom<$ph then $zoom=$ph/$lh if $lx<-$lb*$zoom+$pb then $lx=-$lb*$zoom+$pb if $ly<-$lh*$zoom+$ph then $ly=-$lh*$zoom+$phEndFunc
    Func NeuMalen() Koordinatenpruefen() _GDIPlus_GraphicsClear($GDI_Buffer) _GDIPlus_GraphicsDrawImageRect($GDI_Buffer, $hImage, $lx, $ly, $lb*$zoom, $lh*$zoom) _GDIPlus_GraphicsDrawImageRect($Graphics, $Bitmap, $px, $py, $pb, $ph)EndFunc
    Func Beenden() _GDIPlus_GraphicsClear($GDI_Buffer) _GDIPlus_GraphicsClear($Graphics) _GDIPlus_GraphicsDispose($Graphics); _MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, ""); _MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT, "") ExitEndFunc ;==>Beenden

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

    2 Mal editiert, zuletzt von AutoItJunkie (2. März 2012 um 12:57)