Bildvorschau funktioniert nicht

  • Hi,
    ich habe folgendes Skript

    Spoiler anzeigen
    [autoit]

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

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

    HotKeySet("{F1}", "_shoot")

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

    Opt('GUIOnEventMode', 1)
    GUIRegisterMsg($WM_PAINT, 'WM_PAINT')

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

    _GDIPlus_Startup() ;Vorschau
    Global $iPreviewMaxDim = 200, $hPreviewBitmap, $iPreviewWidth, $iPreviewHeight

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

    Global $hPreviewGui = GUICreate('Vorschau-Fenster', $iPreviewMaxDim, $iPreviewMaxDim + 24, -1, -1)
    Global $hPreviewGraphic = _GDIPlus_GraphicsCreateFromHWND($hPreviewGui)
    GUISetState(@SW_SHOW, $hPreviewGui)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    $datei = @TempDir & "\" & "test.jpg"
    _ScreenCapture_Capture($datei, 0, 0, 100, 100)
    _PreviewLoadImage($datei)

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

    While 1
    Sleep(10)
    WEnd

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

    Func _end()
    _GDIPlus_BitmapDispose($hPreviewBitmap)
    _GDIPlus_GraphicsDispose($hPreviewGraphic)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_end

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

    Func _PreviewLoadImage($sImgFile)
    $hPreviewBitmap = _GDIPlus_BitmapCreateFromFile($sImgFile)
    If $hPreviewBitmap = 0 Then
    _GDIPlus_GraphicsFillRect($hPreviewGraphic, 0, 0, $iPreviewMaxDim, $iPreviewMaxDim)
    Return
    EndIf
    $iPreviewWidth = _GDIPlus_ImageGetWidth($hPreviewBitmap)
    $iPreviewHeight = _GDIPlus_ImageGetHeight($hPreviewBitmap)

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

    $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixTranslate($hMatrix, 200, 0)
    _GDIPlus_MatrixRotate($hMatrix, 90, "False")
    _GDIPlus_GraphicsSetTransform($hPreviewGraphic, $hMatrix)
    _GDIPlus_GraphicsClear($hPreviewGraphic)
    _GDIPlus_GraphicsDrawImage($hPreviewGraphic, $sImgFile, -$iPreviewWidth / 2, -$iPreviewHeight / 2)

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

    $iVector = $iPreviewWidth / $iPreviewHeight
    If $iVector > 1 Then
    $iPreviewWidth = $iPreviewMaxDim
    $iPreviewHeight = Int($iPreviewWidth / $iVector)
    Else
    $iPreviewHeight = $iPreviewMaxDim
    $iPreviewWidth = Int($iPreviewHeight * $iVector)
    EndIf

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

    $hBrush = _GDIPlus_BrushCreateSolid(0xFFEBCD)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFF8EB8FD) ;Hintergrundfarbe

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

    _GDIPlus_GraphicsFillRect($hPreviewGraphic, 0, 0, $iPreviewMaxDim, $iPreviewMaxDim, $hBrush)
    _GDIPlus_GraphicsDrawImageRect($hPreviewGraphic, $hPreviewBitmap, ($iPreviewMaxDim - $iPreviewWidth) / 2, ($iPreviewMaxDim - $iPreviewHeight) / 2, $iPreviewWidth, $iPreviewHeight)
    EndFunc ;==>_PreviewLoadImage

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

    Func WM_PAINT($hWnd, $Msg, $wParam, $lParam)
    If $hWnd = $hPreviewGui Then
    _GDIPlus_GraphicsDrawImageRect($hPreviewGraphic, $hPreviewBitmap, ($iPreviewMaxDim - $iPreviewWidth) / 2, ($iPreviewMaxDim - $iPreviewHeight) / 2, $iPreviewWidth, $iPreviewHeight)
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func _shoot()
    $datei2 = @TempDir & "\" & "test2.jpg"
    _ScreenCapture_Capture($datei2, 400, 400, 500, 500)
    _PreviewLoadImage($datei2)
    EndFunc ;==>_shoot

    [/autoit]

    Wenn ich die GUI minimiere und dann wieder hervorhole, ist das Bild nicht mehr sichtbar.
    Wie kann man dies beheben?

    Außerdem will ich während die GUI minimiert ist mit "F1" das Bild ändern. Jedoch ist auch dann nach dem hervorholen der GUI kein Bild da.
    Wie kann man dies beheben?

    Danke :)

    • Offizieller Beitrag

    Das geht auch einfacher. Es gibt dafür ein Event ($GUI_EVENT_RESTORE). Einfach eine Redraw-Funktion damit aufrufen:

    Spoiler anzeigen
    [autoit]


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

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

    HotKeySet("{F1}", "_shoot")

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

    Opt('GUIOnEventMode', 1)
    GUIRegisterMsg($WM_PAINT, 'WM_PAINT')

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

    _GDIPlus_Startup() ;Vorschau
    Global $iPreviewMaxDim = 200, $hPreviewBitmap, $iPreviewWidth, $iPreviewHeight

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

    Global $hPreviewGui = GUICreate('Vorschau-Fenster', $iPreviewMaxDim, $iPreviewMaxDim + 24, -1, -1)
    Global $hPreviewGraphic = _GDIPlus_GraphicsCreateFromHWND($hPreviewGui)
    GUISetState(@SW_SHOW, $hPreviewGui)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    GUISetOnEvent($GUI_EVENT_RESTORE, '_Redraw')
    $datei = @TempDir & "\" & "test.jpg"
    _ScreenCapture_Capture($datei, 0, 0, 100, 100)
    _PreviewLoadImage($datei)

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

    While 1
    Sleep(10)
    WEnd

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

    Func _end()
    _GDIPlus_BitmapDispose($hPreviewBitmap)
    _GDIPlus_GraphicsDispose($hPreviewGraphic)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_end

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

    Func _PreviewLoadImage($sImgFile)
    $hPreviewBitmap = _GDIPlus_BitmapCreateFromFile($sImgFile)
    If $hPreviewBitmap = 0 Then
    _GDIPlus_GraphicsFillRect($hPreviewGraphic, 0, 0, $iPreviewMaxDim, $iPreviewMaxDim)
    Return
    EndIf
    $iPreviewWidth = _GDIPlus_ImageGetWidth($hPreviewBitmap)
    $iPreviewHeight = _GDIPlus_ImageGetHeight($hPreviewBitmap)

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

    $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixTranslate($hMatrix, 200, 0)
    _GDIPlus_MatrixRotate($hMatrix, 90, "False")
    _GDIPlus_GraphicsSetTransform($hPreviewGraphic, $hMatrix)
    _GDIPlus_GraphicsClear($hPreviewGraphic)
    _GDIPlus_GraphicsDrawImage($hPreviewGraphic, $sImgFile, -$iPreviewWidth / 2, -$iPreviewHeight / 2)

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

    $iVector = $iPreviewWidth / $iPreviewHeight
    If $iVector > 1 Then
    $iPreviewWidth = $iPreviewMaxDim
    $iPreviewHeight = Int($iPreviewWidth / $iVector)
    Else
    $iPreviewHeight = $iPreviewMaxDim
    $iPreviewWidth = Int($iPreviewHeight * $iVector)
    EndIf

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

    $hBrush = _GDIPlus_BrushCreateSolid(0xFFEBCD)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFF8EB8FD) ;Hintergrundfarbe

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

    _GDIPlus_GraphicsFillRect($hPreviewGraphic, 0, 0, $iPreviewMaxDim, $iPreviewMaxDim, $hBrush)
    _GDIPlus_GraphicsDrawImageRect($hPreviewGraphic, $hPreviewBitmap, ($iPreviewMaxDim - $iPreviewWidth) / 2, ($iPreviewMaxDim - $iPreviewHeight) / 2, $iPreviewWidth, $iPreviewHeight)
    EndFunc ;==>_PreviewLoadImage

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

    Func _Redraw()
    _GDIPlus_GraphicsDrawImageRect($hPreviewGraphic, $hPreviewBitmap, ($iPreviewMaxDim - $iPreviewWidth) / 2, ($iPreviewMaxDim - $iPreviewHeight) / 2, $iPreviewWidth, $iPreviewHeight)
    EndFunc

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

    Func WM_PAINT($hWnd, $Msg, $wParam, $lParam)
    If $hWnd = $hPreviewGui Then
    _GDIPlus_GraphicsDrawImageRect($hPreviewGraphic, $hPreviewBitmap, ($iPreviewMaxDim - $iPreviewWidth) / 2, ($iPreviewMaxDim - $iPreviewHeight) / 2, $iPreviewWidth, $iPreviewHeight)
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func _shoot()
    $datei2 = @TempDir & "\" & "test2.jpg"
    _ScreenCapture_Capture($datei2, 400, 400, 500, 500)
    _PreviewLoadImage($datei2)
    EndFunc ;==>_shoot

    [/autoit]