..hat ein Problem festgestellt - _GDIPlus_GraphicsSetSmoothingMode

  • Hey,
    ich habe gestern spaßeshalber den SmoothingMode auf weiß ich was hoch gestellt.
    Nun meldet AutoIt beim Ausführen des Skripts immer folgenden Fehler:

    Fehlermeldung

    autoit.de/wcf/attachment/9774/
    autoit3.exe hat ein Problem festgestellt und muss beendet werden (ModName: gdiplus.dll)

    Fehler
    • _GDIPlus_Startup() wurde nach dem Verwenden von GDIPlus-Funktionen gesetzt
    Fehlerskript
    [autoit]

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

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

    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("_Exit")

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

    ; Variablen ============================================================================

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

    Global $iWidth = 500, $iHeight = 600
    Global $iX = 0, $iY = 0
    Global $hBackground = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\background.png")
    Global $balloon_red = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_red.png")
    Global $balloon_green = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_green.png")
    Global $balloon_blue = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_blue.png")
    Global $balloon_yellow = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_yellow.png")
    Global $balloon_pink = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_pink.png")
    Global $balloonX = Random(0,450)
    Global $balloonY = 0

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

    ; GUI ============================================================================

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

    $hGUI = GUICreate("TrapTheBalloon",$iWidth,$iHeight)
    $hWnd = WinGetHandle("TrapTheBalloon")
    GUISetState()
    GUISetOnEvent(-3, "_Exit")
    GUIRegisterMsg(0x000F, "WM_PAINT")

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

    ; GDI+ ============================================================================

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

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    ;Erstmal das normale Grafik-Objekt erstellen.
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    ;Statt uns mit dem normalen Frontbuffer zufrieden zu geben, erstellen wir erstmal eine
    ;Bitmap, mit Bezug auf unser Grafikobjekt.
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    ;Nachdem unser Bitmap erstellt ist, holen wir uns den Graphics Context. Dieser
    ;wird von uns verwendet, um darin zu zeichnen
    _GDIPlus_GraphicsSetSmoothingMode($hBackBuffer, 2)

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

    ; While-Schleife ============================================================================

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

    While 1

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

    _GDIPlus_GraphicsClear($hBackbuffer)
    ; Superradierer benutzen um alten Backbuffer zu löschen
    _GDIPlus_GraphicsDrawRect($hBackbuffer,50,50,100,150)
    _WinAPI_RedrawWindow($hWnd, 0, 0,$RDW_INTERNALPAINT)
    ; WM_PAINT wird nur aufgerufen, wenn alle Berechnungen fertig sind!
    ; In WM_PAINT wird selbst nichts berechnet, oder gezeichnet. diese Funktion wird nur das
    ; Bitmap-Objekt in das Grafik-Objekt übertragen.
    WEnd

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

    ; Funktionen ============================================================================

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

    Func _Exit() ; Clean up resources
    _GDIPlus_GraphicsDispose($hGraphic) ; Grafikobjekt auflösen
    _GDIPlus_BitmapDispose($hBitmap); Bitmap auflösen
    _GDIPlus_ImageDispose($balloon_red); Bild auflösen
    _GDIPlus_ImageDispose($balloon_green); Bild auflösen
    _GDIPlus_ImageDispose($balloon_blue); Bild auflösen
    _GDIPlus_ImageDispose($balloon_yellow); Bild auflösen
    _GDIPlus_ImageDispose($balloon_pink); Bild auflösen
    _GDIPlus_ImageDispose($hBackground); Bild auflösen
    _GDIPlus_Shutdown() ; GDI+ Engine beenden
    Exit
    EndFunc ;==>_Exit

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hBackground, 0, 0, $iWidth, $iHeight)
    _GDIPlus_GraphicsDrawImage($hBackbuffer, $balloon_red, 50, 50)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $iX, $iY, $iWidth, $iHeight)
    ; _GDIPlus_GraphicsDrawImageRect() überträgt den Backbuffer in den Frontbuffer.
    ; Der erste Parameter ist unser Frontbuffer (Grafik Objekt).
    ; Der zweite ist unsere Bitmap, welche ja als BackBuffer fungiert.
    ; Darauf folgt der Abschnitt den man übertragen will.
    ; i.d.R. ist es 0, 0 für X und Y koordinaten, und die GUI Breite und Höhe für
    ; Width und Height. Kommt natürlich immer drauf an, wie groß euer Grafikobjekt ist,
    ; und ob ihr den vollen Teil zeichnen wollt.
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

    [/autoit]
    Lösung
    • _GDIPlus_Startup() richtig gesetzt
    Korrektes Skript
    [autoit]

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

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

    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("_Exit")
    _GDIPlus_Startup()

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

    ; Variablen ============================================================================

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

    Global $iWidth = 500, $iHeight = 600
    Global $iX = 0, $iY = 0
    Global $hBackground = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\background.png")
    Global $balloon_red = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_red.png")
    Global $balloon_green = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_green.png")
    Global $balloon_blue = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_blue.png")
    Global $balloon_yellow = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_yellow.png")
    Global $balloon_pink = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_pink.png")
    Global $balloonX = Random(0,450)
    Global $balloonY = 0

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

    ; GUI ============================================================================

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

    $hGUI = GUICreate("TrapTheBalloon",$iWidth,$iHeight)
    $hWnd = WinGetHandle("TrapTheBalloon")
    GUISetState()
    GUISetOnEvent(-3, "_Exit")
    GUIRegisterMsg(0x000F, "WM_PAINT")

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

    ; GDI+ ============================================================================

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    ;Erstmal das normale Grafik-Objekt erstellen.
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    ;Statt uns mit dem normalen Frontbuffer zufrieden zu geben, erstellen wir erstmal eine
    ;Bitmap, mit Bezug auf unser Grafikobjekt.
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    ;Nachdem unser Bitmap erstellt ist, holen wir uns den Graphics Context. Dieser
    ;wird von uns verwendet, um darin zu zeichnen
    _GDIPlus_GraphicsSetSmoothingMode($hBackBuffer, 2)

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

    ; While-Schleife ============================================================================

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

    While 1

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

    _GDIPlus_GraphicsClear($hBackbuffer)
    ; Superradierer benutzen um alten Backbuffer zu löschen
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hBackground, 0, 0, $iWidth, $iHeight)
    _GDIPlus_GraphicsDrawImage($hBackbuffer, $balloon_red, 50, 50)
    _WinAPI_RedrawWindow($hWnd, 0, 0,$RDW_INTERNALPAINT)
    ; WM_PAINT wird nur aufgerufen, wenn alle Berechnungen fertig sind!
    ; In WM_PAINT wird selbst nichts berechnet, oder gezeichnet. diese Funktion wird nur das
    ; Bitmap-Objekt in das Grafik-Objekt übertragen.
    WEnd

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

    ; Funktionen ============================================================================

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

    Func _Exit() ; Clean up resources
    _GDIPlus_GraphicsDispose($hGraphic) ; Grafikobjekt auflösen
    _GDIPlus_BitmapDispose($hBitmap); Bitmap auflösen
    _GDIPlus_ImageDispose($balloon_red); Bild auflösen
    _GDIPlus_ImageDispose($balloon_green); Bild auflösen
    _GDIPlus_ImageDispose($balloon_blue); Bild auflösen
    _GDIPlus_ImageDispose($balloon_yellow); Bild auflösen
    _GDIPlus_ImageDispose($balloon_pink); Bild auflösen
    _GDIPlus_ImageDispose($hBackground); Bild auflösen
    _GDIPlus_Shutdown() ; GDI+ Engine beenden
    Exit
    EndFunc ;==>_Exit

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $iX, $iY, $iWidth, $iHeight)
    ; _GDIPlus_GraphicsDrawImageRect() überträgt den Backbuffer in den Frontbuffer.
    ; Der erste Parameter ist unser Frontbuffer (Grafik Objekt).
    ; Der zweite ist unsere Bitmap, welche ja als BackBuffer fungiert.
    ; Darauf folgt der Abschnitt den man übertragen will.
    ; i.d.R. ist es 0, 0 für X und Y koordinaten, und die GUI Breite und Höhe für
    ; Width und Height. Kommt natürlich immer drauf an, wie groß euer Grafikobjekt ist,
    ; und ob ihr den vollen Teil zeichnen wollt.
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

    [/autoit]


    Die gdiplus.dll habe ich auch schon ersetzt, hat nichts gebracht.
    Weiß einer, wie ich das lösen kann?

    Edit: Präfix "gelöst" gesetzt, korrektes Skript oben

    • Offizieller Beitrag

    Was mir auffällt ist, das du_GDIPlus_Startup viel zu spät aufrufst. Du benutzt _GDIPlus_ImageLoadFromFile schon vorher.

    Spoiler anzeigen
    [autoit]

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

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

    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("_Exit")

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

    ; Variablen ============================================================================
    _GDIPlus_Startup()
    Global $iWidth = 500, $iHeight = 600
    Global $iX = 0, $iY = 0
    Global $hBackground = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\background.png")
    Global $balloon_red = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_red.png")
    Global $balloon_green = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_green.png")
    Global $balloon_blue = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_blue.png")
    Global $balloon_yellow = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_yellow.png")
    Global $balloon_pink = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_pink.png")
    Global $balloonX = Random(0,450)
    Global $balloonY = 0

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

    ; GUI ============================================================================

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

    $hGUI = GUICreate("TrapTheBalloon",$iWidth,$iHeight)
    $hWnd = WinGetHandle("TrapTheBalloon")
    GUISetState()
    GUISetOnEvent(-3, "_Exit")
    GUIRegisterMsg(0x000F, "WM_PAINT")

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

    ; GDI+ ============================================================================

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    ;Erstmal das normale Grafik-Objekt erstellen.
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    ;Statt uns mit dem normalen Frontbuffer zufrieden zu geben, erstellen wir erstmal eine
    ;Bitmap, mit Bezug auf unser Grafikobjekt.
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    ;Nachdem unser Bitmap erstellt ist, holen wir uns den Graphics Context. Dieser
    ;wird von uns verwendet, um darin zu zeichnen
    _GDIPlus_GraphicsSetSmoothingMode($hBackBuffer, 2)

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

    ; While-Schleife ============================================================================

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

    While 1

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

    _GDIPlus_GraphicsClear($hBackbuffer)
    ; Superradierer benutzen um alten Backbuffer zu löschen
    _GDIPlus_GraphicsDrawRect($hBackbuffer,50,50,100,150)
    _WinAPI_RedrawWindow($hWnd, 0, 0,$RDW_INTERNALPAINT)
    ; WM_PAINT wird nur aufgerufen, wenn alle Berechnungen fertig sind!
    ; In WM_PAINT wird selbst nichts berechnet, oder gezeichnet. diese Funktion wird nur das
    ; Bitmap-Objekt in das Grafik-Objekt übertragen.
    WEnd

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

    ; Funktionen ============================================================================

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

    Func _Exit() ; Clean up resources
    _GDIPlus_GraphicsDispose($hGraphic) ; Grafikobjekt auflösen
    _GDIPlus_BitmapDispose($hBitmap); Bitmap auflösen
    _GDIPlus_ImageDispose($balloon_red); Bild auflösen
    _GDIPlus_ImageDispose($balloon_green); Bild auflösen
    _GDIPlus_ImageDispose($balloon_blue); Bild auflösen
    _GDIPlus_ImageDispose($balloon_yellow); Bild auflösen
    _GDIPlus_ImageDispose($balloon_pink); Bild auflösen
    _GDIPlus_ImageDispose($hBackground); Bild auflösen
    _GDIPlus_Shutdown() ; GDI+ Engine beenden
    Exit
    EndFunc ;==>_Exit

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hBackground, 0, 0, $iWidth, $iHeight)
    _GDIPlus_GraphicsDrawImage($hBackbuffer, $balloon_red, 50, 50)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $iX, $iY, $iWidth, $iHeight)
    ; _GDIPlus_GraphicsDrawImageRect() überträgt den Backbuffer in den Frontbuffer.
    ; Der erste Parameter ist unser Frontbuffer (Grafik Objekt).
    ; Der zweite ist unsere Bitmap, welche ja als BackBuffer fungiert.
    ; Darauf folgt der Abschnitt den man übertragen will.
    ; i.d.R. ist es 0, 0 für X und Y koordinaten, und die GUI Breite und Höhe für
    ; Width und Height. Kommt natürlich immer drauf an, wie groß euer Grafikobjekt ist,
    ; und ob ihr den vollen Teil zeichnen wollt.
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

    [/autoit]
  • Wenn ich dein Script ausführe, bekome ich die gleiche Fehlermeldung wie du.
    Bei dem TCP hab ich 2 Befehle irgendwie in einer ungünstigen, aber nicht falschen Reihenfolge gehabt, worauf kam: Autitit v3 reagiert nicht mehr oder sowas in der Art.
    Da war nichts mit GDI dabei

  • Was mir auffällt ist, das du_GDIPlus_Startup viel zu spät aufrufst. Du benutzt _GDIPlus_ImageLoadFromFile schon vorher.

    Ich hab das gestern neu geordnet und nicht bemerkt.
    Danke, jetzt kommt die Fehlermeldung nicht mehr :)
    Nur jetzt sieht man die Bilder nicht mehr (Background + Roten Balloon) ;(

    Viele Grüße,
    HopFail

  • [autoit]

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hBackground, $iX, $iY, $iWidth, $iHeight)
    _GDIPlus_GraphicsDrawImage($hBackbuffer, $balloon_red, 50, 50)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $iX, $iY, $iWidth, $iHeight)
    ; _GDIPlus_GraphicsDrawImageRect() überträgt den Backbuffer in den Frontbuffer.
    ; Der erste Parameter ist unser Frontbuffer (Grafik Objekt).
    ; Der zweite ist unsere Bitmap, welche ja als BackBuffer fungiert.
    ; Darauf folgt der Abschnitt den man übertragen will.
    ; i.d.R. ist es 0, 0 für X und Y koordinaten, und die GUI Breite und Höhe für
    ; Width und Height. Kommt natürlich immer drauf an, wie groß euer Grafikobjekt ist,
    ; und ob ihr den vollen Teil zeichnen wollt.

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

    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

    [/autoit]

    ?( Kannst du mir sagen wo ich die Bilder dann zeichnen muss?

    Edit: Okay ich habs jetzt geändert:

    Spoiler anzeigen
    [autoit]

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

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

    _GDIPlus_Startup(); GDI+ Engine starten

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

    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("_Exit")

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

    ; Variablen ============================================================================

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

    Global $iWidth = 500, $iHeight = 600
    Global $iX = 0, $iY = 0
    Global $hBackground = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\background.png")
    Global $balloon_red = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_red.png")
    Global $balloon_green = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_green.png")
    Global $balloon_blue = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_blue.png")
    Global $balloon_yellow = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_yellow.png")
    Global $balloon_pink = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_pink.png")
    Global $balloonX = Random(0,450)
    Global $balloonY = 0

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

    ; GUI ============================================================================

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

    $hGUI = GUICreate("TrapTheBalloon",$iWidth,$iHeight)
    $hWnd = WinGetHandle("TrapTheBalloon")
    GUISetState()
    GUISetOnEvent(-3, "_Exit")
    GUIRegisterMsg(0x0FF, "WM_PAINT")

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

    ; GDI+ ============================================================================

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    ;Erstmal das normale Grafik-Objekt erstellen.
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    ;Statt uns mit dem normalen Frontbuffer zufrieden zu geben, erstellen wir erstmal eine
    ;Bitmap, mit Bezug auf unser Grafikobjekt.
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    ;Nachdem unser Bitmap erstellt ist, holen wir uns den Graphics Context. Dieser
    ;wird von uns verwendet, um darin zu zeichnen
    _GDIPlus_GraphicsSetSmoothingMode($hBackBuffer, 2)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hBackground, $iX, $iY, $iWidth, $iHeight)
    _GDIPlus_GraphicsDrawImage($hBackbuffer, $balloon_red, 50, 50)

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

    ; While-Schleife ============================================================================

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

    While 1
    _GDIPlus_GraphicsClear($hBackbuffer)
    ; Superradierer benutzen um alten Backbuffer zu löschen

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

    _GDIPlus_GraphicsDrawRect($hBackbuffer,50,50,100,150)
    _WinAPI_RedrawWindow($hWnd, 0, 0,$RDW_INTERNALPAINT)
    ; WM_PAINT wird nur aufgerufen, wenn alle Berechnungen fertig sind!
    ; In WM_PAINT wird selbst nichts berechnet, oder gezeichnet. diese Funktion wird nur das
    ; Bitmap-Objekt in das Grafik-Objekt übertragen.
    WEnd

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

    ; Funktionen ============================================================================

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

    Func _Exit() ; Clean up resources
    _GDIPlus_GraphicsDispose($hGraphic) ; Grafikobjekt auflösen
    _GDIPlus_BitmapDispose($hBitmap); Bitmap auflösen
    _GDIPlus_ImageDispose($balloon_red); Bild auflösen
    _GDIPlus_ImageDispose($balloon_green); Bild auflösen
    _GDIPlus_ImageDispose($balloon_blue); Bild auflösen
    _GDIPlus_ImageDispose($balloon_yellow); Bild auflösen
    _GDIPlus_ImageDispose($balloon_pink); Bild auflösen
    _GDIPlus_ImageDispose($hBackground); Bild auflösen
    _GDIPlus_Shutdown() ; GDI+ Engine beenden
    Exit
    EndFunc ;==>_Exit

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $iX, $iY, $iWidth, $iHeight)
    ; _GDIPlus_GraphicsDrawImageRect() überträgt den Backbuffer in den Frontbuffer.
    ; Der erste Parameter ist unser Frontbuffer (Grafik Objekt).
    ; Der zweite ist unsere Bitmap, welche ja als BackBuffer fungiert.
    ; Darauf folgt der Abschnitt den man übertragen will.
    ; i.d.R. ist es 0, 0 für X und Y koordinaten, und die GUI Breite und Höhe für
    ; Width und Height. Kommt natürlich immer drauf an, wie groß euer Grafikobjekt ist,
    ; und ob ihr den vollen Teil zeichnen wollt.

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

    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

    [/autoit]

    Gezeichnet wird aber immer noch nichts :(

    Viele Grüße,
    HopFail

  • Im Moment befindet sich dieser Zeichenvorgang aber in der Funktion WM_PAINT welche nie aufgerufen wird ;).
    Ich glaube du meinst es so, oder?

    Spoiler anzeigen
    [autoit]

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

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

    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("_Exit")

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

    ; Variablen ============================================================================

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

    Global $iWidth = 500, $iHeight = 600
    Global $iX = 0, $iY = 0
    Global $hBackground = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\background.png")
    Global $balloon_red = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_red.png")
    Global $balloon_green = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_green.png")
    Global $balloon_blue = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_blue.png")
    Global $balloon_yellow = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_yellow.png")
    Global $balloon_pink = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_pink.png")
    Global $balloonX = Random(0,450)
    Global $balloonY = 0

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

    ; GUI ============================================================================

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

    $hGUI = GUICreate("TrapTheBalloon",$iWidth,$iHeight)
    $hWnd = WinGetHandle("TrapTheBalloon")
    GUISetState()
    GUISetOnEvent(-3, "_Exit")
    GUIRegisterMsg(0x000F, "WM_PAINT")

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

    ; GDI+ ============================================================================

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

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    ;Erstmal das normale Grafik-Objekt erstellen.
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    ;Statt uns mit dem normalen Frontbuffer zufrieden zu geben, erstellen wir erstmal eine
    ;Bitmap, mit Bezug auf unser Grafikobjekt.
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    ;Nachdem unser Bitmap erstellt ist, holen wir uns den Graphics Context. Dieser
    ;wird von uns verwendet, um darin zu zeichnen
    _GDIPlus_GraphicsSetSmoothingMode($hBackBuffer, 2)

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

    ; While-Schleife ============================================================================

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

    While 1

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

    _GDIPlus_GraphicsClear($hBackbuffer)
    ; Superradierer benutzen um alten Backbuffer zu löschen
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hBackground, 0, 0, $iWidth, $iHeight)
    _GDIPlus_GraphicsDrawImage($hBackbuffer, $balloon_red, 50, 50)
    _GDIPlus_GraphicsDrawRect($hBackbuffer,50,50,100,150)
    _WinAPI_RedrawWindow($hWnd, 0, 0,$RDW_INTERNALPAINT)
    ; WM_PAINT wird nur aufgerufen, wenn alle Berechnungen fertig sind!
    ; In WM_PAINT wird selbst nichts berechnet, oder gezeichnet. diese Funktion wird nur das
    ; Bitmap-Objekt in das Grafik-Objekt übertragen.
    WEnd

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

    ; Funktionen ============================================================================

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

    Func _Exit() ; Clean up resources
    _GDIPlus_GraphicsDispose($hGraphic) ; Grafikobjekt auflösen
    _GDIPlus_BitmapDispose($hBitmap); Bitmap auflösen
    _GDIPlus_ImageDispose($balloon_red); Bild auflösen
    _GDIPlus_ImageDispose($balloon_green); Bild auflösen
    _GDIPlus_ImageDispose($balloon_blue); Bild auflösen
    _GDIPlus_ImageDispose($balloon_yellow); Bild auflösen
    _GDIPlus_ImageDispose($balloon_pink); Bild auflösen
    _GDIPlus_ImageDispose($hBackground); Bild auflösen
    _GDIPlus_Shutdown() ; GDI+ Engine beenden
    Exit
    EndFunc ;==>_Exit

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $iX, $iY, $iWidth, $iHeight)
    ; _GDIPlus_GraphicsDrawImageRect() überträgt den Backbuffer in den Frontbuffer.
    ; Der erste Parameter ist unser Frontbuffer (Grafik Objekt).
    ; Der zweite ist unsere Bitmap, welche ja als BackBuffer fungiert.
    ; Darauf folgt der Abschnitt den man übertragen will.
    ; i.d.R. ist es 0, 0 für X und Y koordinaten, und die GUI Breite und Höhe für
    ; Width und Height. Kommt natürlich immer drauf an, wie groß euer Grafikobjekt ist,
    ; und ob ihr den vollen Teil zeichnen wollt.
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

    [/autoit]
  • Jetzt aber... :D Hab _GDIPlus_Startup falsch platziert ^^.

    Spoiler anzeigen
    [autoit]

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

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

    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("_Exit")
    _GDIPlus_Startup()

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

    ; Variablen ============================================================================

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

    Global $iWidth = 500, $iHeight = 600
    Global $iX = 0, $iY = 0
    Global $hBackground = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\background.png")
    Global $balloon_red = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_red.png")
    Global $balloon_green = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_green.png")
    Global $balloon_blue = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_blue.png")
    Global $balloon_yellow = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_yellow.png")
    Global $balloon_pink = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_pink.png")
    Global $balloonX = Random(0,450)
    Global $balloonY = 0

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

    ; GUI ============================================================================

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

    $hGUI = GUICreate("TrapTheBalloon",$iWidth,$iHeight)
    $hWnd = WinGetHandle("TrapTheBalloon")
    GUISetState()
    GUISetOnEvent(-3, "_Exit")
    GUIRegisterMsg(0x000F, "WM_PAINT")

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

    ; GDI+ ============================================================================

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    ;Erstmal das normale Grafik-Objekt erstellen.
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    ;Statt uns mit dem normalen Frontbuffer zufrieden zu geben, erstellen wir erstmal eine
    ;Bitmap, mit Bezug auf unser Grafikobjekt.
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    ;Nachdem unser Bitmap erstellt ist, holen wir uns den Graphics Context. Dieser
    ;wird von uns verwendet, um darin zu zeichnen
    _GDIPlus_GraphicsSetSmoothingMode($hBackBuffer, 2)

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

    ; While-Schleife ============================================================================

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

    While 1

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

    _GDIPlus_GraphicsClear($hBackbuffer)
    ; Superradierer benutzen um alten Backbuffer zu löschen
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hBackground, 0, 0, $iWidth, $iHeight)
    _GDIPlus_GraphicsDrawImage($hBackbuffer, $balloon_red, 50, 50)
    _GDIPlus_GraphicsDrawRect($hBackbuffer,50,50,100,150)
    _WinAPI_RedrawWindow($hWnd, 0, 0,$RDW_INTERNALPAINT)
    ; WM_PAINT wird nur aufgerufen, wenn alle Berechnungen fertig sind!
    ; In WM_PAINT wird selbst nichts berechnet, oder gezeichnet. diese Funktion wird nur das
    ; Bitmap-Objekt in das Grafik-Objekt übertragen.
    WEnd

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

    ; Funktionen ============================================================================

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

    Func _Exit() ; Clean up resources
    _GDIPlus_GraphicsDispose($hGraphic) ; Grafikobjekt auflösen
    _GDIPlus_BitmapDispose($hBitmap); Bitmap auflösen
    _GDIPlus_ImageDispose($balloon_red); Bild auflösen
    _GDIPlus_ImageDispose($balloon_green); Bild auflösen
    _GDIPlus_ImageDispose($balloon_blue); Bild auflösen
    _GDIPlus_ImageDispose($balloon_yellow); Bild auflösen
    _GDIPlus_ImageDispose($balloon_pink); Bild auflösen
    _GDIPlus_ImageDispose($hBackground); Bild auflösen
    _GDIPlus_Shutdown() ; GDI+ Engine beenden
    Exit
    EndFunc ;==>_Exit

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $iX, $iY, $iWidth, $iHeight)
    ; _GDIPlus_GraphicsDrawImageRect() überträgt den Backbuffer in den Frontbuffer.
    ; Der erste Parameter ist unser Frontbuffer (Grafik Objekt).
    ; Der zweite ist unsere Bitmap, welche ja als BackBuffer fungiert.
    ; Darauf folgt der Abschnitt den man übertragen will.
    ; i.d.R. ist es 0, 0 für X und Y koordinaten, und die GUI Breite und Höhe für
    ; Width und Height. Kommt natürlich immer drauf an, wie groß euer Grafikobjekt ist,
    ; und ob ihr den vollen Teil zeichnen wollt.
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

    [/autoit]

  • ?( wie jetzt? Ist das im Bild auch so?

    Edit: Gut also klappt es jetzt :D .

    Ja ich meinte das Bild, und ja es klappt.

    Spoiler anzeigen


    Du bist es, der mir gezeigt hat, wie schön das Scripten sein kann, als ich die Hoffnung aufgegeben hatte.
    Du bist es, der mich so leben lässt, wie ich bin.
    Du bist es, der mir die Nähe und Geborgenheit gibt.
    Du bist es, der mir täglich immer wieder Energie gibt.

    Danke Dir von Herzen!

    Viele Grüße,
    HopFail

  • Du brauchst übrigens nicht extra die WM_Paint wegen einer Funktion, die kannst du auch mit in die While-Schleife machen.