GDI+ schnell??

  • Hey Leute
    alle meinen, dass GDI+ total schnell ist, aber irgendwie flackert das bei mir trotz Buffer-.-
    Hoffentlich könnt ihr mir helfen

    Spoiler anzeigen

    #include
    #include
    #include

    $xg = 0
    $yg = 0
    $xb = 400
    $yb = 0

    OnAutoItExitRegister("_EXIT")

    _GDIPlus_Startup()

    $Gui = GUICreate("GDIPlus",500,500,100,100)

    $graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics(500,500,$graphic)
    $buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)

    $brushGruen = _GDIPlus_BrushCreateSolid(0xFF60CC3F)
    $brushWeiss = _GDIPlus_BrushCreateSolid(0xFF000000)
    $brushBlau = _GDIPlus_BrushCreateSolid(0xFF6677FF)

    GUISetState(@SW_SHOW)

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    Case _IsPressed(25 ) And $xg >= 0
    $xg -= 2
    Case _IsPressed(26 ) And $yg >= 0
    $yg -= 2
    Case _IsPressed(27 ) And $xg <= 400
    $xg += 2
    Case _IsPressed(28 ) And $yg <= 400
    $yg += 2
    EndSelect
    _GDIPlus_GraphicsFillRect($buffer,0,0,500,500,$brushWeiss)
    _GDIPlus_GraphicsFillRect($buffer,$xg,$yg,100,100,$brushGruen)
    _GDIPlus_GraphicsDrawImageRect($graphic, $bitmap,0,0,500,500)

    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    Case _IsPressed(41) And $xb >= 0
    $xb -= 2
    Case _IsPressed(57) And $yb >= 0
    $yb -= 2
    Case _IsPressed(44) And $xb <= 400
    $xb += 2
    Case _IsPressed(53) And $yb <= 400
    $yb += 2
    EndSelect
    _GDIPlus_GraphicsFillRect($buffer,0,0,500,500,$brushWeiss)
    _GDIPlus_GraphicsFillRect($buffer,$xb,$yb,100,100,$brushBlau)
    _GDIPlus_GraphicsDrawImageRect($graphic, $bitmap,0,0,500,500)
    WEnd

    Func _EXIT()
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_GraphicsDispose($buffer)
    _GDIPlus_BitmapDispose($bitmap)
    _GDIPlus_Shutdown()EndFunc ;==>_EXIT

  • Erstens würde ich das zeichnen nicht in der MessageLoop machen, sondern mit AdlibRegister nebenher laufen lassen. Zweitens malst du zweimal pro Schleifendurchgang in den Buffer und zeichnest diesen auch doppelt in die GUI, unnötigerweise...
    PS: Mir fällt gerade auf, das du in einem Schleifendurchgang 2 mal die Variable $msg Abfragst, obwohl sie sich in der Zwischenzeit unmöglich verändert haben kann. :huh: Vielleicht solltest du dir neben Ubuntus Tutorial auch die GUI Grundlagen noch einmal durchlesen.

  • Das mit dem doppelten $msg ist bei copy paste ausversehen mitgekommen

    Mit zweimal auf den buffer zeichnen meinst du

    [autoit]

    _GDIPlus_GraphicsDrawImageRect($graphic, $bitmap,0,0,500,500)

    [/autoit]

    richtig? Das hab ich auch gedacht, aber wenn ich das lösche dann wird das grüne Quadrat nicht gezeichnet ?(

    AdlibRegister hab ich auch eingefügt

    Spoiler anzeigen

    #include <GdiPlus.au3>
    #include <GuiConstants.au3>
    #include <Misc.au3>

    Global $xg = 0
    Global $yg = 0
    Global $xb = 400
    Global $yb = 0

    OnAutoItExitRegister("_EXIT")

    _GDIPlus_Startup()

    $Gui = GUICreate("GDIPlus",500,500,100,100)

    $graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics(500,500,$graphic)
    $buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)

    $brushGruen = _GDIPlus_BrushCreateSolid(0xFF60CC3F)
    $brushWeiss = _GDIPlus_BrushCreateSolid(0xFF000000)
    $brushBlau = _GDIPlus_BrushCreateSolid(0xFF6677FF)

    GUISetState(@SW_SHOW)
    AdlibRegister("_zeichnen",50)

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    Case _IsPressed(25) And $xg >= 0
    $xg -= 1
    Case _IsPressed(26) And $yg >= 0
    $yg -= 1
    Case _IsPressed(27) And $xg <= 400
    $xg += 1
    Case _IsPressed(28) And $yg <= 400
    $yg += 1
    Case _IsPressed(41) And $xb >= 0
    $xb -= 1
    Case _IsPressed(57) And $yb >= 0
    $yb -= 1
    Case _IsPressed(44) And $xb <= 400
    $xb += 1
    Case _IsPressed(53) And $yb <= 400
    $yb += 1
    EndSelect
    WEnd

    Func _EXIT()
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_GraphicsDispose($buffer)
    _GDIPlus_BitmapDispose($bitmap)
    _GDIPlus_Shutdown()
    EndFunc ;==>_EXIT

    Func _zeichnen()
    _GDIPlus_GraphicsFillRect($buffer,0,0,500,500,$brushWeiss)
    _GDIPlus_GraphicsFillRect($buffer,$xg,$yg,100,100,$brushGruen)
    _GDIPlus_GraphicsDrawImageRect($graphic, $bitmap,0,0,500,500)
    _GDIPlus_GraphicsFillRect($buffer,0,0,500,500,$brushWeiss)
    _GDIPlus_GraphicsFillRect($buffer,$xb,$yb,100,100,$brushBlau)
    _GDIPlus_GraphicsDrawImageRect($graphic, $bitmap,0,0,500,500)
    EndFunc


    Sorry aber es flackert immer noch und jetzt kann man nicht mehr beide gleichzeitig steuern, was vorher ging.

  • Spoiler anzeigen
    [autoit]

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

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

    $xg = 0
    $yg = 0
    $xb = 400
    $yb = 0

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

    OnAutoItExitRegister("_EXIT")

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

    _GDIPlus_Startup()

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

    $Gui = GUICreate("GDIPlus", 500, 500, 100, 100)

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

    $graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics(500, 500, $graphic)
    $buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)

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

    $brushGruen = _GDIPlus_BrushCreateSolid(0xFF60CC3F)
    $brushWeiss = _GDIPlus_BrushCreateSolid(0xFF000000)
    $brushBlau = _GDIPlus_BrushCreateSolid(0xFF6677FF)

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

    GUISetState(@SW_SHOW)

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    Case _IsPressed(25) And $xg >= 0
    $xg -= 2
    Case _IsPressed(26) And $yg >= 0
    $yg -= 2
    Case _IsPressed(27) And $xg <= 400
    $xg += 2
    Case _IsPressed(28) And $yg <= 400
    $yg += 2
    EndSelect
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    Case _IsPressed(41) And $xb >= 0
    $xb -= 2
    Case _IsPressed(57) And $yb >= 0
    $yb -= 2
    Case _IsPressed(44) And $xb <= 400
    $xb += 2
    Case _IsPressed(53) And $yb <= 400
    $yb += 2
    EndSelect
    _GDIPlus_GraphicsFillRect($buffer, 0, 0, 500, 500, $brushWeiss)
    _GDIPlus_GraphicsFillRect($buffer, $xg, $yg, 100, 100, $brushGruen)
    _GDIPlus_GraphicsFillRect($buffer, $xb, $yb, 100, 100, $brushBlau)
    _GDIPlus_GraphicsDrawImageRect($graphic, $bitmap, 0, 0, 500, 500)
    WEnd

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

    Func _EXIT()
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_GraphicsDispose($buffer)
    _GDIPlus_BitmapDispose($bitmap)
    _GDIPlus_Shutdown()
    EndFunc ;==>_EXIT

    [/autoit]


    Beides beim erstenmal draufmalen.

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Bei mir bewegen sich beide, du musst bedenken kann man immernur eine Richtung nehmen darf, nicht rechts und unten und gleichzeitig d und s, sondern nur rechts und gleichzeitig d bzw nur oben gleichzeitig w. Das liegt an der Switch Abfrage, wenn du alles mit If machst kannst du das ändern.

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Bei select wird immer nur eins der Case gesucht, wenn dieses zutrifft das Case ausgeführt und das Select verlassen. Bei einzelnen If fragen wird geguckt ob es zutrifft, wenn ja Then **** Wenn nicht weiter, und die nächte If Frage kommt.

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake