Bild in Speicher schreiben und in GUI anzeigen

  • Hey Leute

    Hab mal wieder nen Problem, vielleicht weiß ja jemand die antwort...

    Ich versuche, nen bild von meinem Screen zu erstellen und dieses Zwischenzuspeichern, danach auf der GUI anzuzeigen und diesen Vorgang immer wieder zu wiederholen...

    Mein Program...

    [autoit]

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

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

    $Form1 = GUICreate("Form1", 700, 500, 220, 10)
    $pic = _ScreenCapture_Capture('', 0, 0)

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

    ;Der folgende Befehl Funktioniert leider nicht, da hier mit einer Datei gearbeitet werden muss, ich aber eine Variable nehmen will..
    GUICtrlCreatePic($pic, 10, 10, 690, 490)

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

    GUISetState(@SW_SHOW)

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

    While Sleep (20)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch

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

    GUICtrlDelete($pic)
    $pic = _ScreenCapture_Capture('', 0, 0)

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

    ;Genauso wenig, wie der Befehl hier funktioniert...
    GUICtrlCreatePic($pic, 10, 10, 690, 490)

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

    WEnd

    [/autoit]

    Weiß jemand die antwort...? Vielen dank für eure antworten!

    Einmal editiert, zuletzt von Mr_gitarre (12. September 2010 um 20:20)

  • Habs folgendermaßen hinbekommen:

    [autoit]

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

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

    Global $hGraphic
    Global $hBitmap
    Global $pic

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

    _GDIPlus_Startup ()

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

    $Form1 = GUICreate("Form1", 900, 700, 220, 10)
    $pic = _ScreenCapture_Capture('', 0, 0)

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

    GUISetState(@SW_SHOW)

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

    While Sleep (20)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE

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

    ; Ressourcen freigeben
    _GDIPlus_GraphicsDispose ($hGraphic)
    _GDIPlus_BitmapDispose ($hBitmap)
    _WinAPI_DeleteObject ($pic)

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

    ; Gibt die durch Microsoft Windows GDI+ verwendeten Ressourcen wieder frei
    _GDIPlus_Shutdown()

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

    Exit

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

    EndSwitch

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

    GUICtrlDelete($pic)

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

    ; Zeichnet ein Bitmap auf die GUI
    $pic = _ScreenCapture_Capture('', 0, 0)
    $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP ($pic)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($Form1)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hBitmap, 0, 0)

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

    WEnd

    [/autoit]

    Hat vielleicht jemand ne idee, wie ich das Bild verkleinert anzeigen kann, also so, dass es in mein Fenster passt??

  • Hi,

    mit

    [autoit]

    _GDIPLus_GraphicsDrawImageRect

    [/autoit]

    sollte es gehen.

    Nebenbei, du solltest in deinem Beispiel nachdem du dein Bild gezeichnet hast, _GdiPlus_BitmapDispose, bzw. _WinAPI_DeleteObject aufrufen, da du durch den Aufruf von _GDIPlus_BitmapCreateFromHBitmap/_ScreenCapture_Capture
    wieder neuen Speicher "anforderst", und dies ohne "schließen" des Speicherbereichs, ein Speicherleck verursacht.

    LG

    Einmal editiert, zuletzt von Ealendil (12. September 2010 um 20:12)

  • _GDIPlus_GraphicsDrawImageRect($hGraphics, $hImage, $iX, $iY, $iW, $iH )

    $hGraphics Handle zu einem Grafik-Objekt
    $hImage Handle zu einem Bild-Objekt


    Und wo is da der Unterschied?? Ich versteh nich wie das funktioniert,,,

  • $iW/$iH, gibt die Breite/Höhe des Bildes an, sprich willst du ein Bild mit den Massen 100x80 zeichnen, schreibst du:

    [autoit]

    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hImage, $iX, $iY, 100, 80)

    [/autoit]