GDI+ Backbuffer will nicht :D

  • Hay wieso funktioniert der backbuffer in dem script nicht?

    [autoit]

    #include
    #include
    Opt("GUIOnEventMode",2)
    OnAutoItExitRegister("_Exit")
    Global $GuiWidth = 400, $GuiHeight = 400
    Global $Charcoords[4] = [-200,100,200,200]
    Global $Speed = 1

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

    _GDIPlus_Startup()
    Global $Red = _GDIPlus_BrushCreateSolid(0xFFFF0000)
    Global $White = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)

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

    $Gui1 = GUICreate("GDI+ Erste Schritte",$GuiWidth,$GuiHeight)
    $Grapic1 = _GDIPlus_GraphicsCreateFromHWND($Gui1)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($GuiWidth, $GuiHeight, $Grapic1) ; Bitmap-Objekt mit bezug auf unsere Grafik erstellen
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap) ; Grafik-Kontext holen.
    GUISetOnEvent(-3,"_Exit")
    GUIRegisterMsg(0x000F,"WM_PAINT")
    GUiSetState()

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

    While 1 * Sleep(10)
    _Erneuern()
    WEnd

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

    Func _Exit()
    _GDIPlus_BrushDispose($Red)
    _GDIPlus_BrushDispose($White)
    _GDIPlus_GraphicsDispose($Grapic1)
    _GDIPlus_Shutdown()
    Exit
    EndFunc
    Func _Erneuern()
    $Charcoords[0] = $Speed + $Charcoords[0]
    If $Charcoords[0] > $GuiWidth Then $Charcoords[0] = -200
    _WinAPI_RedrawWindow($hBackbuffer,0,0, $RDW_INTERNALPAINT)
    EndFunc
    Func WM_PAINT()
    _GDIPlus_GraphicsClear($hBackbuffer,0xFFF0F0F0)
    _GDIPlus_GraphicsFillRect($hBackbuffer,$Charcoords[0],$Charcoords[1],$Charcoords[2],$Charcoords[3])
    EndFunc

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

    [MSIE_newline_end ]

    Einmal editiert, zuletzt von masteraki (1. April 2010 um 21:22)

  • Hier mal ein Backbuffer Beispiel:

    Spoiler anzeigen
    [autoit]

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

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

    Opt("MouseCoordMode", 2)

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

    $iGUIWidth = 400
    $iGUIHeight = 400
    $GUIColorBG = 0xFFFFFFFF
    $iX = 200
    $iY = 200
    $iSpeedMax = 20

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

    $hWnd = GUICreate("Test", $iGUIWidth, $iGUIHeight)
    GUISetState()

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

    _GDIPlus_Startup()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iGUIWidth, $iGUIHeight, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)
    _GDIPlus_GraphicsClear($hGraphic, $GUIColorBG)

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

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    AdlibRegister("_ReDraw", 20)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    AdlibUnRegister()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    Exit
    Case $GUI_EVENT_RESTORE
    WM_PAINT()
    EndSwitch
    WEnd

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

    Func _ReDraw()
    $aPosMouse = MouseGetPos()

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

    $iDiffX = $iX - $aPosMouse[0]
    If $iDiffX < 0 Then $iDiffX *= -1
    $iDiffY = $iY - $aPosMouse[1]
    If $iDiffY < 0 Then $iDiffY *= -1

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

    $iSpeedX = $iDiffX / 10
    If $iSpeedX > $iSpeedMax Then $iSpeedX = $iSpeedMax
    $iSpeedY = $iDiffY / 10
    If $iSpeedY > $iSpeedMax Then $iSpeedY = $iSpeedMax

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

    If $iX < $aPosMouse[0] Then
    $iX += $iSpeedX
    ElseIf $iX > $aPosMouse[0] Then
    $iX -= $iSpeedX
    EndIf
    If $iY < $aPosMouse[1] Then
    $iY += $iSpeedY
    ElseIf $iY > $aPosMouse[1] Then
    $iY -= $iSpeedY
    EndIf

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

    _GDIPlus_GraphicsClear($hBuffer, $GUIColorBG)
    _GDIPlus_GraphicsFillRect($hBuffer, $iX - 25, $iY - 25, 50, 50)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iGUIWidth, $iGUIHeight)
    EndFunc ;==>_ReDraw

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iGUIWidth, $iGUIHeight)
    EndFunc

    [/autoit]


    Man braucht eigentlich kein WM_PAINT zu registrieren wenn das sowieso alle paar Millisekunden neu gezeichnet wird. ;)

  • Was hast du nicht verstanden?^^
    Das mit dem Backbuffer?

    Spoiler anzeigen

    Du erstellst aus deiner Grafik eine Bitmap mit BitmapCreateFromGraphics.
    Danach erstellst du aus dieser Bitmap im Prinzip eine 2te Grafik die alles was hineingezeichnet wird auf die Bitmap überträgt (ImageGetGraphicsContext).
    Alles was du nachher auf deiner Grafik haben möchtest zeichnest du in diese 2te (Bitmap)Grafik.
    Zum Schluss zeichnest du einfach die Bitmap in die Originalgrafik mit GraphicsDrawImageRect.


    Das mit WM_PAINT?

    Spoiler anzeigen

    Mit GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    ordnest du dem WM_PAINT Event die Funktion "WM_PAINT" zu.
    Ein WM_PAINT Event wird gesendet wenn das Fenster neu gezeichnet werden muss (z.B. Wenn ein anderes Fenster dein Fenster überdeckt).
    Im Endeffekt heißt das: Die Bitmap wird jedesmal neu auf das Fenster gezeichnet, wenn es verdeckt wurde und somit ein Teil des gezeichneten nicht mehr sichtbar ist.

  • Im Prinzip hast du das Kopieren vom Backbuffer in das sichtbare Fenster vergessen!

    Spoiler anzeigen
    [autoit]


    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    Opt("GUIOnEventMode",2)
    OnAutoItExitRegister("_Exit")
    Global $GuiWidth = 400, $GuiHeight = 400
    Global $Charcoords[4] = [-200,100,200,200]
    Global $Speed = 1
    _GDIPlus_Startup()
    Global $Red = _GDIPlus_BrushCreateSolid(0xFFFF0000)
    Global $White = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    $Gui1 = GUICreate("GDI+ Erste Schritte",$GuiWidth,$GuiHeight)
    $Grapic1 = _GDIPlus_GraphicsCreateFromHWND($Gui1)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($GuiWidth, $GuiHeight, $Grapic1) ; Bitmap-Objekt mit bezug auf unsere Grafik erstellen
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap) ; Grafik-Kontext holen.
    GUISetOnEvent(-3,"_Exit")
    GUiSetState()
    While 1 * Sleep(10)
    _Erneuern()
    WEnd

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

    Func _Exit()
    _GDIPlus_BrushDispose($Red)
    _GDIPlus_BrushDispose($White)
    _GDIPlus_GraphicsDispose($hBackbuffer)
    _GDIPlus_GraphicsDispose($Grapic1)
    _GDIPlus_Shutdown()
    Exit
    EndFunc
    Func _Erneuern()
    $Charcoords[0] = $Speed + $Charcoords[0]
    If $Charcoords[0] > $GuiWidth Then $Charcoords[0] = -200
    _GDIPlus_GraphicsClear($hBackbuffer,0xFFF0F0F0)
    _GDIPlus_GraphicsFillRect($hBackbuffer,$Charcoords[0],$Charcoords[1],$Charcoords[2],$Charcoords[3])
    _GDIPlus_GraphicsDrawImageRect($Grapic1, $hBitmap, 0, 0, $GuiWidth, $GuiHeight) ;backbuffer in das sichtbare Fenster kopieren!
    EndFunc

    [/autoit]


    Gruß,

    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    3 Mal editiert, zuletzt von UEZ (1. April 2010 um 21:34)