Softes scrollen von bildern in der GUI. - nicht möglich ?

  • moin leute,
    ich hab eigentlich vor ein 500 x 2000 pixel grosses bild in einer 500x500 GUI scrollen zu lassen.
    jetzt hab ich etwas rumprobiert und stoße schon bei sehr kleinen bildern auf probleme.
    d.h. beim scrollen flackert es ordentlich, was mir gar nicht gefällt. - ich suche nach einer lösung, bin jedoch planlos.

    [autoit]

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

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

    Global $gui, $guiPos, $pic, $picPos

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

    Example1()

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

    Func Example1()
    Local $n, $msg

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

    GUICreate("My GUI picture", 350, 300, -1, -1, $WS_SIZEBOX + $WS_SYSMENU)

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

    GUISetBkColor(0x000000)
    $n = GUICtrlCreatePic("c:\Programme\AutoIt3\AutoIT-eigenerkrams\formular.jpg", 50, 50, 200, 50)
    GUISetState()

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

    While 1
    $msg = GUIGetMsg()

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

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    for $x = 0 To 200
    Sleep(10)
    GUICtrlSetPos($n, 50, 59+$x, 200, 100)

    Next
    WEnd

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

    GUIDelete()
    EndFunc

    [/autoit]
  • Probiere es mal mit GDI+.

    Idee: kopiere nur den Bereich des großen Bildes, welches du in der "kleinen" GUI anzeigen möchtest -> _GDIPlus_GraphicsDrawImageRectRect()

    Ob's ruckelt oder nicht, habe ich nicht getestet.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • ich hab das scrolling mal mit kleinen grafiken versucht 200x200 pixel, was in etwa deinem vorschlag entspricht.... das flimmert zwar nicht, aber der bildaufbau dürfte so bei 3-5 frames pro sekunde liegen. das ist natürlich alles andere als ausreichend.

    [autoit]

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

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

    Global $gui, $guiPos, $pic, $picPos

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

    ; Initialisiert (startet) Microsoft Windows GDI+ und lädt das Bild
    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile("c:\Programme\AutoIt3\AutoIT-eigenerkrams\2.jpg")
    $hGraphic2 = _GDIPlus_GraphicsCreateFromHWND($Gui)
    Example1()

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

    Func Example1()
    Local $n, $msg

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

    $Gui = GUICreate("My GUI picture", 350, 300, -1, -1, $WS_SIZEBOX + $WS_SYSMENU)

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

    GUISetBkColor(0x000000)
    ;$n = GUICtrlCreatePic("c:\Programme\AutoIt3\AutoIT-eigenerkrams\formular.jpg", 50, 50, 200, 50)
    GUISetState()

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

    While 1
    $msg = GUIGetMsg()

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

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    for $x = 0 To 200 step 5

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

    ;_GDIPlus_GraphicsDrawImage($hGraphic2, $hImage, 200, 100+$x)

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

    _GDIPlus_GraphicsDrawImageRectRect($hGraphic2, $hImage, 50, 50, 200, 200, 300, 100+$x, 400, 300)

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

    Next
    WEnd

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

    GUIDelete()
    EndFunc

    [/autoit]
  • Hi, ich weiss ja nicht, wie du 3-5 FPS hinbekommst, teste mal pls, läuft bei mir >150 FPS

    Spoiler anzeigen
    [autoit]

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

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

    Global $gui, $guiPos, $pic, $picPos

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

    ; Initialisiert (startet) Microsoft Windows GDI+ und lädt das Bild
    _GDIPlus_Startup()

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

    $Gui = GUICreate("My GUI picture", 650, 650, -1, -1, $WS_SIZEBOX + $WS_SYSMENU)
    $hBMP = _ScreenCapture_Capture("")
    $himage = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)

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

    $hGraphic2 = _GDIPlus_GraphicsCreateFromHWND($Gui)

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

    $fps = 0
    AdlibRegister("_fps", 1000) ;FramesPerSecond

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

    Local $n, $msg

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

    GUISetBkColor(0x000000)
    ;$n = GUICtrlCreatePic("c:\Programme\AutoIt3\AutoIT-eigenerkrams\formular.jpg", 50, 50, 200, 50)
    GUISetState()

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

    While 1
    $msg = GUIGetMsg()

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

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    For $x = 0 To 200
    $fps += 1
    ;_GDIPlus_GraphicsDrawImage($hGraphic2, $hImage, 200, 100+$x)
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic2, $himage, 100, 100, 400, 400, 100, 100 + $x, 400, 400)

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

    Next
    WEnd

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

    GUIDelete()

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

    Func _fps()
    WinSetTitle($Gui, "", "Test Scrollen " & $fps & " FPS")
    $fps = 0
    EndFunc ;==>_fps

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

    Das was richtig Performance frisst, ist das Vergrössern/Verkleinern per _GDIPlus_GraphicsDrawImageRectRect()
    Wenn du nur Ausschnitte oder nur "komplette" Bilder in Orginalgröße scrollen möchtest, reicht da auch _GDIPlus_GraphicsDrawImageRect()

  • Ich meinte sowas

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <GDIPlus.au3>
    AutoItSetOption("GUIOnEventMode", 1)

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

    _GDIPlus_Startup()
    Global Const $iW = 512, $iH = 384, $fPi = ACos(-1)
    Global Const $hGUI = GUICreate("", $iW, $iH)
    GUISetState()
    Global Const $hGfx = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    Global Const $hBmp = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
    Global Const $hCtxt = _GDIPlus_ImageGetGraphicsContext($hBmp)
    Global Const $hImage = _GDIPlus_ImageLoadFromFile("c:\Program Files (x86)\AutoIt3\Examples\GUI\msoobe.jpg")

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $fX, $fY, $fR = 128, $i, $j, $iFPS

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

    AdlibRegister("FPS", 1000)
    Do
    $fX = Cos($i / 4 + $j) * $fR
    $fY = Sin($i / 8) * $fR
    _GDIPlus_GraphicsDrawImageRectRect($hCtxt, $hImage, 256 + $fX, 192 + $fY, $iW, $iH, 0, 0, $iW, $iH)
    _GDIPlus_GraphicsDrawString($hCtxt, "Scrolling", 25, 100, "Arial", 80)
    _GDIPlus_GraphicsDrawImageRect($hGfx, $hBmp, 0, 0, $iW, $iH)
    $i += 0.25
    $j += 0.001
    $iFPS += 1
    Until Not Sleep(10)

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

    Func FPS()
    WinSetTitle($hGUI, "", $iFPS & " FPS")
    $iFPS = 0
    EndFunc

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

    Func _Exit()
    AdlibUnRegister("FPS")
    _GDIPlus_GraphicsDispose($hCtxt)
    _GDIPlus_GraphicsDispose($hGfx)
    _GDIPlus_BitmapDispose($hBmp)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    GUIDelete()
    Exit
    EndFunc

    [/autoit]

    Oder die schneller Variante:

    Spoiler anzeigen
    [autoit]


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

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

    AutoItSetOption("GUIOnEventMode", 1)

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

    _GDIPlus_Startup()
    Global Const $iW = 512, $iH = 384, $fPi = ACos(-1)
    Global Const $hGUI = GUICreate("", $iW, $iH)
    GUISetState()

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

    Global Const $hBmp = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
    Global Const $hHBITMAP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)
    _GDIPlus_BitmapDispose($hBmp)
    Global Const $hDC = _WinAPI_GetDC($hGUI)
    Global Const $hDC_Backbuffer = _WinAPI_CreateCompatibleDC($hDC)
    Global Const $DC_Obj = _WinAPI_SelectObject($hDC_Backbuffer, $hHBITMAP)
    Global Const $hCtxt = _GDIPlus_GraphicsCreateFromHDC($hDC_Backbuffer)
    Global Const $hImage = _GDIPlus_ImageLoadFromFile("c:\Program Files (x86)\AutoIt3\Examples\GUI\msoobe.jpg")

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $fX, $fY, $fR = 128, $i, $j, $iFPS

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

    AdlibRegister("FPS", 1000)

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

    Do
    $fX = Cos($i / 4 + $j) * $fR
    $fY = Sin($i / 8) * $fR
    _GDIPlus_GraphicsDrawImageRectRect($hCtxt, $hImage, 256 + $fX, 192 + $fY, $iW, $iH, 0, 0, $iW, $iH)
    _GDIPlus_GraphicsDrawString($hCtxt, "Scrolling", 25, 100, "Arial", 80)
    _WinAPI_BitBlt($hDC, 0, 0, $iW, $iH, $hDC_Backbuffer, 0, 0, $SRCCOPY)
    $i += 0.15
    $j += 0.005
    $iFPS += 1
    Until Not Sleep(10)

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

    Func FPS()
    WinSetTitle($hGUI, "", $iFPS & " FPS")
    $iFPS = 0
    EndFunc

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

    Func _Exit()
    AdlibUnRegister("FPS")
    _WinAPI_SelectObject($hDC_Backbuffer, $DC_Obj)
    _WinAPI_ReleaseDC($hGUI, $hDC)
    _WinAPI_DeleteObject($hHBITMAP)
    _GDIPlus_GraphicsDispose($hCtxt)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    GUIDelete()
    Exit
    EndFunc

    [/autoit]

    Benötigt 3.3.10.x Version!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    2 Mal editiert, zuletzt von UEZ (9. Januar 2014 um 22:02)

  • Ich habe noch eine Variante ohne UDF Funktionen geschrieben:

    Spoiler anzeigen
    [autoit]

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

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

    Global $gui, $guiPos, $pic, $picPos

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

    GUICreate("My GUI picture", 350, 300, -1, -1, Default, $WS_EX_COMPOSITED)
    $gui = GUISetBkColor(0x000000)
    $pic = GUICtrlCreatePic("test.jpg", 50, 50, 200, 125)
    GUISetState()

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

    AdlibRegister("_MovePic", 10)

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

    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _MovePic()
    Local Static $picPos = 0
    $picPos += 1
    If $picPos > 199 Then $picPos = 0
    GUICtrlSetPos($pic, 50, 59 + $picPos, 200, 125)
    EndFunc

    [/autoit]


    Edit: Ich habe erst jetzt bemerkt, dass WhiteLion Ausschnitte von riesigen Bildern anzeigen lassen will. Dafür ist das hier natürlich nicht geeignet, also würde ich dir auch GDI+ empfehlen. ^^