GDIPlus mit mehrere Bereiche

  • Hallo,

    Da GDI+ etwas länger braucht um einen kompletten Bereich (1000x600px) neuzuzeichnen habe ich mir gedacht diesen Bereich in verschiedene Bereiche einzuteilen. Die Bereiche sind 100x100px groß. Nun wollte ich euch Fragen ob dies eine schlechte Idee ist, welche Nachteile es hat und zu welchen Problemen es führen kann. Ich habe dieses Thema bereits in einen anderen Forum gepostet ich hoffe dies ist kein Problem für euch. So sollte es in etwas aussehen:

    Spoiler anzeigen
    [autoit]

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

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

    $hParent = GUICreate("Spiel",1000,600,-1,-1,$WS_POPUP)
    GUISetState(@SW_SHOW)

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

    $pos = WinGetPos($hParent)

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

    Dim $hChild[60]

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

    For $i = 0 To 9
    For $l = 0 To 5
    $hChild[6*$i+$l] = GUICreate("", 100, 100, $pos[0]+(100*$i), $pos[0]+(100*$l)-15, $WS_POPUP, -1, $hParent)
    GUICtrlCreateLabel("Feld :" & 6*$i+$l,0,0)
    GUISetState(@SW_SHOW)
    Next
    Next

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

    _GDIPlus_Startup()
    Dim $hGraphic[60]
    For $i = 0 To 59
    $hGraphic[$i] = _GDIPlus_GraphicsCreateFromHWND($hChild[$i])
    Next

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

    _GDIPlus_GraphicsDrawEllipse($hGraphic[12],0,0,50,50)
    _GDIPlus_GraphicsDrawEllipse($hGraphic[10],0,0,50,50)

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

    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then _Exit()
    WEnd

    Func _Exit()
    For $i = 0 To 59
    _GDIPlus_GraphicsDispose($hGraphic[$i])
    Next
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit]

    MfG
    blacky94

  • das skript ist so langsam, weil du soviele guis erstellst und auch so viele labels. Du musst eine Gui erstellen und dann die Labels auch mit hilfe von GDI+ machen dann wirds schnell sein (Ich bin an einem Spiel und es läuft mit 40FPS)

  • Nachteile:
    - Unübersichtlich ( je nach dem was du machen willst )
    - Umständlich ( erstellen, verwalten, etc. )

    Vorteile:
    ..... ähhh.....

    naja...

    Verwende doch einen Buffer für dein GDI+ Bild, damit kannst auf ein Bild zeichnen und das ganze dann anzeigen lassen.

    Bsp.:

    Spoiler anzeigen
    [autoit]

    #include<GDIPlus.au3>
    #include<Misc.au3>
    $hGui = GUICreate("GDI+ Buffer Bsp", 1000, 500)
    GUISetState()
    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui) ; Grafik Handle holen
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(1000, 500, $hGraphics) ; Bild erstellen auf dessen CONTEXT ( !!! ) du malen kannst
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap); Context holen
    $hBrush_1 = _GDIPlus_BrushCreateSolid(0xFF00FF00) ; Deine GDI+ Befehle...
    $hBrush_2 = _GDIPlus_BrushCreateSolid(0xFF0000FF) ; ...
    $hBrush_3 = _GDIPlus_BrushCreateSolid(0xFFFF0000) ; ...
    $hBrush_4 = _GDIPlus_BrushCreateSolid(0xFFFFFF00) ; ...
    _GDIPlus_GraphicsFillRect($hBuffer, 0, 0, 500, 250, $hBrush_1) ; Immer auf dem BUFFER ( also den Context ) zeichnen !!!!!
    while 1
    $msg = GUIGetMsg()
    Select
    case $msg = -3
    Exit
    case _IsPressed(01)
    _load()
    EndSelect
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, 1000, 500) ; zeichnet das ganze
    WEnd
    func _load()
    _GDIPlus_GraphicsFillRect($hBuffer, 500, 0, 500, 250, $hBrush_2) ; Immer auf dem BUFFER ( also den Context ) zeichnen !!!!!
    _GDIPlus_GraphicsFillRect($hBuffer, 0, 250, 500, 250, $hBrush_3) ; Immer auf dem BUFFER ( also den Context ) zeichnen !!!!!
    _GDIPlus_GraphicsFillRect($hBuffer, 500, 250, 500, 250, $hBrush_4) ; Immer auf dem BUFFER ( also den Context ) zeichnen !!!!!
    Return
    EndFunc

    [/autoit]

    mfg
    Hauke

  • Das Problem ist ja das er den kompletten Bereich (GUI) neuzeichnen muss sobald ich den Befehl _load ausführe.

    Ein kleines Beispiel anhand von Bildern:
    Ich habe verschiedene Bereiche:

    Spoiler anzeigen

    Dort wird allerdings nur der eine Bereich geändert, sonst bleibt alles gleich:

    Spoiler anzeigen

    Da lohnt es sich doch nicht das ganze in den Backbuffer zu speichern und wieder neu zu zeichnen

    2 Mal editiert, zuletzt von blacky94 (11. Dezember 2011 um 15:40)

  • Benutz ein DC der GUI. Dann erstellt du eine Bitmap mit dem Bild drauf was du als Hintergrund malst. Dann kannst du die Bitmap immer auf das DC Blitten, schau dir mal die WinAPI Funktionen an (_WinApi_GetDC()) und noch ein paar mehr. Findest sicher ein paar GDI+ Scripte in denen das gemacht wird.