GDI+ - Neu zeichnen

  • Hallo AutoIt'ler ;)

    Ich hätte da ein kleines Problem GDI+
    http://pastebin.com/bqpMaDPT
    *Mein Code wird irgendwie chaotisch angezeigt (-> Browser? Forum?), ich poste es mal Temporär auf Pastebin*


    Ich versuche beim minimieren und wieder maximieren mein Bild neuzuzeichnen, aber leider zeichnet er auf das alte nochmals, so dass es nicht gerade Toll aussieht. Wie kann ich das verhindern?

    PS: Man siehst den Fehler durch den Schatten (Transparent) etc.

    Ich hoffe auf eure Hilfe! ;)

    Ty, Leroox

  • [autoit]

    Func WM_PAINT() _GDIPlus_GraphicsClear($hGraphic, 0xFFFFFFFF) _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, 24, 24)EndFunc

    [/autoit]

    Ja, aber sieht immer noch irgendwie Komisch aus. :P

  • So hier mal ein Bsp: (Buffer ist so groß wie Gui! Bewegung reingebracht um übermalen deutlich zu machen!)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WIndowsConstants.au3>
    #include <GDIPlus.au3>
    #Include <Misc.au3>
    #include <Color.au3>
    #include <WinAPI.au3>
    #include <Misc.au3>

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

    Opt('MustDeclareVars', 1)

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

    Global $hGUI, $hBitmap, $hGraphic, $hBuffer, $hColorPicker
    Global $x = 0, $y = 0
    _Main()

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

    Func _Main()
    Opt("GUIOnEventMode", 1)
    $hGUI = GUICreate("GDI+ Test", 400, 400)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Events")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "_Events")
    GUISetOnEvent($GUI_EVENT_RESTORE, "_Events")

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

    GUISetOnEvent($GUI_EVENT_RESTORE, "WM_PAINT")
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    GUISetState()

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

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(400, 400, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)

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

    $hColorPicker = _GDIPlus_ImageLoadFromFile("ui-color-picker.png")

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

    _ReDraw()

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

    While 1
    Sleep(10)
    _ReDraw()
    WEnd
    EndFunc

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

    Func _ReDraw()
    _GDIPlus_GraphicsClear ($hBuffer, 0xffffff)
    _GDIPlus_GraphicsDrawImageRect($hBuffer, $hColorPicker, $x, $y, 24, 24)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, 400, 400)
    $x += 4
    If $x >= 400 Then
    $x = -24
    $y += 24
    EndIf
    EndFunc

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, 24, 24)
    EndFunc

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

    Func _Events()
    Select
    Case @GUI_CtrlId = $GUI_EVENT_CLOSE
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_ImageDispose($hColorPicker)
    _GDIPlus_Shutdown()
    Exit
    EndSelect
    EndFunc

    [/autoit]
  • Eigentlich will ich ja nur wissen, wie ich dieses "übermalen" verhindern kann, aber bei dir ist es ja das gleiche? ;P

  • Zitat

    aber leider zeichnet er auf das alte nochmals, so dass es nicht gerade Toll aussieht. Wie kann ich das verhindern?


    Man kann mit GDI+ nichts direkt "löschen", sondern nur übermalen, anders geht es nicht. Wenn du einen Hintergrund hast (z.B. weiß) zweichnest du immer das weiß wieder über das ältere Bild, aber unter das neue, ich weiß jetzt nicht wo dein Problem ist. Man merkt doch nicth das es übermalt wird, den kleinen Farbunterscheid kannst du beheben indem du die Farbe der Gui nimmst, müsste 0xf0f0f0 sein.

  • Hallo Leroox,

    ich habe dein Skript hier eingestellt:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WIndowsConstants.au3>
    #include <GDIPlus.au3>
    #Include <Misc.au3>
    #include <Color.au3>
    #include <WinAPI.au3>
    #include <Misc.au3>

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

    Opt('MustDeclareVars', 1)

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

    Global $hGUI, $hBitmap, $hGraphic, $hBuffer, $hColorPicker

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

    _Main()

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

    Func _Main()
    Opt("GUIOnEventMode", 1)

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

    $hGUI = GUICreate("GDI+ Test", 400, 400)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Events")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "_Events")
    GUISetOnEvent($GUI_EVENT_RESTORE, "_Events")

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

    GUISetOnEvent($GUI_EVENT_RESTORE, "WM_PAINT")
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    GUISetState()

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

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(24, 24, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)

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

    $hColorPicker = _GDIPlus_ImageLoadFromFile("ui-color-picker.png")

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

    _ReDraw()

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

    While 1
    Sleep(10)
    _ReDraw()
    WEnd
    EndFunc

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

    Func _ReDraw()
    _GDIPlus_GraphicsDrawImageRect($hBuffer, $hColorPicker, 0, 0, 24, 24)
    EndFunc

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, 24, 24)
    EndFunc

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

    Func _Events()
    Select
    Case @GUI_CtrlId = $GUI_EVENT_CLOSE
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_ImageDispose($hColorPicker)
    _GDIPlus_Shutdown()
    Exit
    EndSelect
    EndFunc

    [/autoit]

    da du damit evtl. mehr Helfer erreichst. Bei mir wird dein Bild erst gar nicht angezeigt. schau dir am besten das 3. Beispiel zu GuiCtrlCreatePic an,

    mfg autoBert