Flackern beim Überzeichnen von GDI+ unterbinden?

  • Moin alle :)

    Ich hab ne Frage:
    Gibt es irgendwie eine Möglichkeit, das Flackern beim überzeichnen von GDI+ Graphiken zu unterbinden?

    In meinem Fall liegen zwei Graphiken, die teilweiße transparente PNGs enthalten direkt übereinander und diese werden immer wieder neu gezeichnet. Nur da Flackert halt das ganze ziemlich. :/

    Danke schonmal im Vorraus. :)

    Edit
    Hier das Skript:

    Skript
    [autoit]

    #include <GDIPlus.au3>
    #include <GuiConstantsEx.au3>
    #Include <WinAPI.au3>
    #include <Array.au3>
    #include <Misc.au3>

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

    _GDIPlus_Startup()

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

    Global $MoveX = 0
    Global $MoveY = 0
    Global $hImage = _GDIPlus_ImageLoadFromFile(@DesktopDir&"\DieWelt.png")
    Global $hFigurImage = _GDIPlus_ImageLoadFromFile(@DesktopDir&"\Anathema-Priestess.png")
    Global $MapWidth = 22
    Global $MapHeigth = 15
    Global $hGraphic1, $hGUI
    Global $MainFigurPoxX = 10
    Global $MainFigurPoxY = 8

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

    $hGUI = GUICreate("Map1", 324, 244, -1, -1, 0x14CA0000, 0x00050100)
    GUISetBkColor(0x000000, $hGUI)
    GUISetState()

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

    $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hGraphic2 = _GDIPlus_GraphicsCreateFromHWND($hGUI)

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

    _DrawMultiMap(1 - $MoveX, 1, 20, 15, 1, 6)
    _DrawMainFigure($MainFigurPoxX, $MainFigurPoxY)

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

    Do
    _Moveing()
    Sleep(200)
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

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

    _GDIPlus_GraphicsDispose($hGraphic1)
    _GDIPlus_GraphicsDispose($hGraphic2)
    _GDIPlus_ImageDispose($hImage)

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

    _GDIPlus_Shutdown()

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

    Func _DrawMap($Position1, $Position2, $Pic1, $Pic2)
    ;~ DllCall($ghGDIPDll, "int", "GdipDrawImageRectRectI", "hwnd", $hGraphic1, "hwnd", $hImage, "int", 2 + ($Position1 - 1) * 15 + ($Position1 - 1), "int", _
    ;~ 2 + ($Position2 - 1) * 15 + ($Position2 - 1), "int", 16, "int", 16, "int", ($Pic1 - 1) * 16, "int", ($Pic2 - 1) * 16, "int", 16, "int", _
    ;~ 16, "int", 2, "int", 0, "int", 0, "int", 0)
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic1, $hImage, ($Pic1 - 1) * 16, ($Pic2 - 1) * 16, 16, 16, 2 + ($Position1 - 1) * 15 + ($Position1 - 1), 2 + ($Position2 - 1) * 15 + ($Position2 - 1), 16, 16)
    EndFunc

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

    Func _DrawMultiMap($Position1, $Position2, $Width, $Heigth, $Pic1, $Pic2)
    For $i = 0 To $Width Step + 1
    For $j = 0 To $Heigth Step + 1
    _DrawMap($Position1 + $i - 1, $Position2 + $j - 1, $Pic1, $Pic2)
    Next
    Next
    EndFunc

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

    Func _Moveing()
    Select
    Case _IsPressed(27) = 1
    _Right()
    Case _IsPressed(25) = 1
    _Left()
    EndSelect
    EndFunc

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

    Func _Right()
    If $MainFigurPoxX < 10 Then
    $MainFigurPoxX += 1
    ElseIf $MoveX <= $MapWidth - 21 Then
    $MoveX += 1
    Else
    If $MainFigurPoxX < 20 Then
    $MainFigurPoxX += 1
    EndIf
    EndIf
    _WinAPI_RedrawWindow_($hGUI)
    _DrawMultiMap(1 - $MoveX, 1, 20, 15, 1, 6)
    _DrawMainFigure($MainFigurPoxX, $MainFigurPoxY)
    EndFunc

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

    Func _Left()
    If $MainFigurPoxX > 10 Then
    $MainFigurPoxX -= 1
    ElseIf Not $MoveX = 0 Then
    $MoveX -= 1
    Else
    If $MainFigurPoxX >1 Then $MainFigurPoxX -= 1
    EndIf
    _WinAPI_RedrawWindow_($hGUI)
    _DrawMultiMap(1 - $MoveX, 1, 20, 15, 1, 6)
    _DrawMainFigure($MainFigurPoxX, $MainFigurPoxY)
    EndFunc

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

    Func _WinAPI_RedrawWindow_($hWnd)
    DllCall("user32.dll", "int", "RedrawWindow", "hwnd", $hWnd, "ptr", 0, "int", 0, "int", 5)
    EndFunc ;==>_WinAPI_RedrawWindow

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

    Func _DrawMainFigure($Position1, $Position2)
    ;~ DllCall($ghGDIPDll, "int", "GdipDrawImageRectRectI", "hwnd", $hGraphic2, "hwnd", $hFigurImage, "int", ($Position1 -1) * 16 - 2, "int", _
    ;~ ($Position2 - 1) * 16, "int", 24, "int", 32, "int", 24, "int", 64, "int", 24, "int", _
    ;~ 32, "int", 2, "int", 0, "int", 0, "int", 0)
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic2, $hFigurImage, 24, 64, 24, 32, ($Position1 -1) * 16 - 2, ($Position2 - 1) * 16, 24, 32)
    EndFunc

    [/autoit]
    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

    2 Mal editiert, zuletzt von H2112 (14. August 2009 um 15:30)

  • Das hat mir auch nicht wirklich geholfen. :/ Das flackern ist nach wie vor noch da...

    Ich hab das Skript mal im 1. Post hinzugefügt.

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

  • Hallo,
    kommentiere mal die Zeilen 76 und 89 aus, bei denen der Hintergund bei jeder Bewegung neu gezeichnet wird. Den Sleep im Loop würde ich auf irgendetws zwischen 50 und 100 setzen (ausprobieren).
    Du musst den Hintergrund ja nur dann neu zeichnen, wenn dein Avatar den "Bildschirm" verlässt.
    ciao
    Andy