[GDI+] Hintergrund bzw Buffer clearen

  • Hallo Leutz,

    ich hab schonwieder ein problem mit GDI+;

    In den Vordergund werden Ellipsen gerendert (schnell).
    Jetzt möchte ich im Hintergund ein Bild anzeigen.
    Also schreibe ich das Bild in den Backbuffer.
    Dann laufen 2 For-To Schleifen die Ellipsen zeichnen, die direkt danach wieder verschwinden sollen.

    Um dies zu erreichen benutzte ich

    [autoit]

    _GDIPlus_GraphicsClear

    [/autoit]

    allerdings muss ich dann eine Farbe angeben.
    Wenn ich 0xFFFFFFFF nehme fliegen die Ellipsen zwar ganz schnell allerdings ist der Hintergrund nicht sichtbar.
    Wenn ich 0xFFFFFF nehme, verschwinden die Ellipsen nicht wieder.
    Wenn ich den Hintergrund immer zusammen mit den Ellipsen in einen Buffer schreibe sind die Ellipsen zu langsam.
    ich suche jetzt einen Weg den einzelnen Buffer zu leeren ohne die unteliegenden zu überschreiben;

    Spoiler anzeigen
    [autoit]


    #include <GDIPlus.au3>
    #include <GuiConstants.au3>

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

    Opt("GuionEventmode",1)

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

    _GDIPlus_Startup()

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

    $BackgroundBMP = _GDIPlus_BitmapCreateFromFile("background.jpg")

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

    $Width = 800
    $Height = 600

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

    $hWnd = GUICreate("test",$Width,$Height)

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

    GUISetOnEvent($GUI_EVENT_CLOSE,"_Exit")

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

    GUISetState(@SW_SHOW)

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

    Global $hPen = _GDIPlus_PenCreate(0xFFFF0000,10)

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

    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)

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

    Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $hGraphics)
    Global $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    Global $hFGBitmap = _GDIPlus_BitmapCreateFromGraphics($Width,$Height, $hBackbuffer)
    Global $hFGBackbuffer = _GDIPlus_ImageGetGraphicsContext($hFGBitmap)

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

    ;~ _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$BackgroundBMP,0,0,$Width,$Height)

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

    $x1=0;
    $y1=$Height
    $x2=$width
    $y2=$Height
    $step=30
    $clearcolor = 0xFFFFFF

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

    While 1
    $Mouse = GUIGetCursorInfo($hWnd)

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

    If $Mouse[2] = 1 Then
    $m1=($mouse[1]-$y1)/($mouse[0]-$x1)
    $b1=$mouse[1]-$m1*$mouse[0]
    $m2=($mouse[1]-$y2)/($mouse[0]-$x2)
    $b2=$mouse[1]-$m2*$mouse[0]

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

    ;~ _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$BackgroundBMP,0,0,$Width,$Height)

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

    for $x=$x1 to $mouse[0] step $step
    $y=$m1*$x+$b1
    _GDIPlus_GraphicsClear($hFGBackbuffer,$clearcolor)
    _GDIPlus_GraphicsDrawEllipse($hFGBackbuffer, $x, $y, 5, 5,$hPen)
    ;~ _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$BackgroundBMP,0,0,$Width,$Height)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$hFGBitmap,0,0,$Width,$Height)
    _GDIPlus_GraphicsDrawImageRect($hGraphics,$hBitmap,0,0,$Width,$Height)
    next

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

    for $x=$x2 to $mouse[0] step -$step
    $y=$m2*$x+$b2
    _GDIPlus_GraphicsClear($hFGBackbuffer,$clearcolor)
    _GDIPlus_GraphicsDrawEllipse($hFGBackbuffer, $x, $y, 5, 5,$hPen)
    ;~ _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$BackgroundBMP,0,0,$Width,$Height)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$hFGBitmap,0,0,$Width,$Height)
    _GDIPlus_GraphicsDrawImageRect($hGraphics,$hBitmap,0,0,$Width,$Height)
    next

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

    Else
    _GDIPlus_GraphicsClear($hFGBackbuffer,$clearcolo)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$BackgroundBMP,0,0,$Width,$Height)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$hFGBitmap,0,0,$Width,$Height)
    _GDIPlus_GraphicsDrawImageRect($hGraphics,$hBitmap,0,0,$Width,$Height)

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

    EndIf
    WEnd

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

    Func _Exit()
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit]
  • hi,
    wie du schon bemerkt hast, überschreibt _GDIPlus_GraphicsClear nur den bestehenden Graphic-context mit einer Farbe.
    Du musst dein Bild benutzen, um darauf die Ellipsen zu zeichnen.
    Bild in Backbuffer, Ellipsen in Backbuffer, aklles weitere in Backbuffer, zum Schluss Backbuffer in GUI kopieren.

    /edit/ wenn es zu langsam ist, immer das komplette Bild in den Backbuffer zu zeichnen, erstelle eine Kopie des Bildes und kopiere immer nur den kleinen Teil, der durch die Ellippsen überschrieben wurde.

  • Zitat

    wenn es zu langsam ist, immer das komplette Bild in den Backbuffer zu zeichnen, erstelle eine Kopie des Bildes und kopiere immer nur den kleinen Teil, der durch die Ellippsen überschrieben wurde.

    und wie??

  • Nur getestet, ist eig ganz schnell:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GuiConstants.au3>

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

    Opt("GuionEventmode",1)

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

    _GDIPlus_Startup()

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

    $BackgroundBMP = _GDIPlus_BitmapCreateFromFile("background.jpg")

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

    $Width = 800
    $Height = 600

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

    $hWnd = GUICreate("test",$Width,$Height)

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

    GUISetOnEvent($GUI_EVENT_CLOSE,"_Exit")

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

    GUISetState(@SW_SHOW)

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

    Global $hPen = _GDIPlus_PenCreate(0xFFFF0000,10)

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

    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)

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

    Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $hGraphics)
    Global $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    Global $hFGBitmap = _GDIPlus_BitmapCreateFromGraphics($Width,$Height, $hBackbuffer)
    Global $hFGBackbuffer = _GDIPlus_ImageGetGraphicsContext($hFGBitmap)

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

    ;~ _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$BackgroundBMP,0,0,$Width,$Height)

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

    $x1=0;
    $y1=$Height
    $x2=$width
    $y2=$Height
    $step=100
    ;~ $clearcolor = 0xFFFFFFff
    $clearcolor = _GDIPlus_ImageLoadFromFile (@desktopdir & "\Bilder\weiss.png")

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

    While 1
    $Mouse = GUIGetCursorInfo($hWnd)

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

    If $Mouse[2] = 1 Then
    $m1=($mouse[1]-$y1)/($mouse[0]-$x1)
    $b1=$mouse[1]-$m1*$mouse[0]
    $m2=($mouse[1]-$y2)/($mouse[0]-$x2)
    $b2=$mouse[1]-$m2*$mouse[0]

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

    ;~ _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$BackgroundBMP,0,0,$Width,$Height)

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

    for $x=$x1 to $mouse[0] step $step
    $y=$m1*$x+$b1
    ;~ _GDIPlus_GraphicsClear($hFGBackbuffer,$clearcolor)
    _GDIPlus_GraphicsDrawEllipse($hFGBackbuffer, $x, $y, 5, 5,$hPen)
    ;~ _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$BackgroundBMP,0,0,$Width,$Height)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$hFGBitmap,0,0,$Width,$Height)
    _GDIPlus_GraphicsDrawImageRect($hGraphics,$hBitmap,0,0,$Width,$Height)
    _GDIPlus_GraphicsDrawImageRect ( $hfgBackbuffer,$clearcolor,$x-100, $y-100,200, 200)
    next

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

    for $x=$x2 to $mouse[0] step -$step
    $y=$m2*$x+$b2
    ;~ _GDIPlus_GraphicsClear($hFGBackbuffer,$clearcolor)
    _GDIPlus_GraphicsDrawEllipse($hFGBackbuffer, $x, $y, 5, 5,$hPen)
    ;~ _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$BackgroundBMP,0,0,$Width,$Height)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$hFGBitmap,0,0,$Width,$Height)
    _GDIPlus_GraphicsDrawImageRect($hGraphics,$hBitmap,0,0,$Width,$Height)
    _GDIPlus_GraphicsDrawImageRect ( $hfgBackbuffer,$clearcolor,$x- 100, $y-100, 200, 200)
    next

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

    Else
    ;~ _GDIPlus_GraphicsClear($hFGBackbuffer,$clearcolor)
    _GDIPlus_GraphicsDrawImageRect ( $hfgBackbuffer,$clearcolor,0, 0, $width,$Height)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$BackgroundBMP,0,0,$Width,$Height)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$hFGBitmap,0,0,$Width,$Height)
    _GDIPlus_GraphicsDrawImageRect($hGraphics,$hBitmap,0,0,$Width,$Height)

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

    EndIf
    WEnd

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

    Func _Exit()
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit]

    PS: Estell eine PNG mit weiß, oder ändere den Pfad zu einem weißen Bild.

    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

  • @sprenger, bei weißem Hintergrund hast du Recht, wenn man allerdings ein Bild als Hintergrund hat, dann kopiert man nur die entsprechenden Bildteile, um die von den Ellipsen überdeckten Bereiche zu "löschen". Da sämtliche durch die GDI-Funktionen bearbeiteten Daten komplett über den Bus zur Graka geschoben werden, ist es schon ein Unterschied, ob man 1920x1080 Pixel über den Bus jagt, oder nur 50x50. Pro Frame natürlich.

    Zitat

    und wie?

    Du weisst, an welcher Position die "alte" Ellipse gezeichnet wurde. Diese bedeckt nur einen kleinen Teil des Hintergrundes. Anstatt nun den kompletten Hintergrund (Backbuffer) mit dem Hintergrund zu überschreiben um die winzige Ellipse zu "löschen", überschreibt man nur den Teil des Hintergrundes, der von der Ellipse bedeckt wird.
    Wenn deine Ellipse 30x30 Pixel gross ist, kopiere aus dem Hintergund die Fläche an der Position der Ellipse (30x30 Pixel) in den Backbuffer und danach die "neue" Ellipse.

    In AutoIt könnte es damit irgendwann kritisch werden, da der Verwaltungsaufwand bzw der Overhead der GDI-Funktionsaufrufe bei vielen kleinen Sprites die Geschichte eher verlangsamt. Aber wer "richtig schnell" Grafiken darstellen möchte, dem bleibt nur übrig, so wenige Pixel wie möglich zu bearbeiten.

  • So ?

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GuiConstants.au3>

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

    Opt("GuionEventmode", 1)

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

    _GDIPlus_Startup()

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

    $BackgroundBMP = _GDIPlus_BitmapCreateFromFile("background.jpg")

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

    $Width = 800
    $Height = 600

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

    $hWnd = GUICreate("test", $Width, $Height)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

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

    GUISetState(@SW_SHOW)

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

    Global $hPen = _GDIPlus_PenCreate(0xFFFF0000, 10)

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

    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)

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

    Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $hGraphics)
    Global $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    Global $hFGBitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $hBackbuffer)
    Global $hFGBackbuffer = _GDIPlus_ImageGetGraphicsContext($hFGBitmap)

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

    Global $hBrush = _GDIPlus_BrushCreateSolid(0xffffffff)
    ;~ _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$BackgroundBMP,0,0,$Width,$Height)

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

    $x1 = 0;
    $y1 = $Height
    $x2 = $Width
    $y2 = $Height
    $step = 100
    ;~ $clearcolor = 0xFFFFFFff
    ;~ $clearcolor = _GDIPlus_ImageLoadFromFile (@desktopdir & "\Bilder\weiss.png")

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

    While 1
    $Mouse = GUIGetCursorInfo($hWnd)

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

    If $Mouse[2] = 1 Then
    $m1 = ($Mouse[1] - $y1) / ($Mouse[0] - $x1)
    $b1 = $Mouse[1] - $m1 * $Mouse[0]
    $m2 = ($Mouse[1] - $y2) / ($Mouse[0] - $x2)
    $b2 = $Mouse[1] - $m2 * $Mouse[0]

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

    ;~ _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$BackgroundBMP,0,0,$Width,$Height)

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

    For $x = $x1 To $Mouse[0] Step $step
    $y = $m1 * $x + $b1
    ;~ _GDIPlus_GraphicsClear($hFGBackbuffer,$clearcolor)
    _GDIPlus_GraphicsDrawEllipse($hFGBackbuffer, $x, $y, 5, 5, $hPen)
    ;~ _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$BackgroundBMP,0,0,$Width,$Height)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hFGBitmap, 0, 0, $Width, $Height)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $Width, $Height)
    ;~ _GDIPlus_GraphicsDrawImageRect ( $hfgBackbuffer,$clearcolor,$x-100, $y-100,200, 200)
    _GDIPlus_GraphicsFillRect($hFGBackbuffer, $x-10 , $y-10 , 30,30,$hBrush)

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

    Next

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

    For $x = $x2 To $Mouse[0] Step -$step
    $y = $m2 * $x + $b2
    ;~ _GDIPlus_GraphicsClear($hFGBackbuffer,$clearcolor)
    _GDIPlus_GraphicsDrawEllipse($hFGBackbuffer, $x, $y, 5, 5, $hPen)
    ;~ _GDIPlus_GraphicsDrawImageRect($hBackbuffer,$BackgroundBMP,0,0,$Width,$Height)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hFGBitmap, 0, 0, $Width, $Height)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $Width, $Height)
    ;~ _GDIPlus_GraphicsDrawImageRect($hFGBackbuffer, $clearcolor, $x - 100, $y - 100, 200, 200)
    _GDIPlus_GraphicsFillRect($hFGBackbuffer, $x - 10, $y - 10, 30, 30,$hBrush)
    Next

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

    Else
    ;~ _GDIPlus_GraphicsClear($hFGBackbuffer,$clearcolor)
    _GDIPlus_GraphicsFillRect($hFGBackbuffer, 0, 0, $Width, $Height,$hBrush)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $BackgroundBMP, 0, 0, $Width, $Height)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hFGBitmap, 0, 0, $Width, $Height)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $Width, $Height)

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

    EndIf
    WEnd

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

    Func _Exit()
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    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

  • Hallo,

    wenn ich Dein Vorhaben richtig verstehe, sollte es auch so gehen:

    Spoiler anzeigen
    [autoit]

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

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

    _GDIPlus_Startup()
    $BackgroundPIC = @ProgramFilesDir & "\AutoIt3\Examples\GUI\msoobe.jpg"

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

    $Width = 800
    $Height = 600

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

    Opt("GuionEventmode", 1)

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

    $hWnd = GUICreate("Test", $Width, $Height)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_Draw")
    GUISetOnEvent($GUI_EVENT_PRIMARYUP, "_Clear")
    GUICtrlCreatePic($BackgroundPIC, 0, 0, $Width, $Height)

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

    GUISetState(@SW_SHOW)

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

    Global $BackgroundBMP = _GDIPlus_BitmapCreateFromFile($BackgroundPIC)
    Global $hPen = _GDIPlus_PenCreate(0xFFFF0000, 10)
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $hGraphics)
    Global $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    $x1 = 0
    $y1 = $Height
    $x2 = $Width
    $y2 = $Height
    $step = 30
    $clearcolor = 0x00FFFFFF

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

    While True
    Sleep(1000)
    WEnd

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

    Func _Draw()
    $Mouse = GUIGetCursorInfo()

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

    If @error Or Not $Mouse[4] Then Return

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

    $m1 = ($Mouse[1] - $y1) / ($Mouse[0] - $x1)
    $b1 = $Mouse[1] - $m1 * $Mouse[0]
    $m2 = ($Mouse[1] - $y2) / ($Mouse[0] - $x2)
    $b2 = $Mouse[1] - $m2 * $Mouse[0]

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

    _GDIPlus_GraphicsClear($hBackbuffer, $clearcolor)

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

    For $x = $x1 To $Mouse[0] Step $step
    $y = $m1 * $x + $b1
    _GDIPlus_GraphicsDrawEllipse($hBackbuffer, $x, $y, 5, 5, $hPen)
    Next

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

    For $x = $x2 To $Mouse[0] Step -$step
    $y = $m2 * $x + $b2
    _GDIPlus_GraphicsDrawEllipse($hBackbuffer, $x, $y, 5, 5, $hPen)
    Next

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

    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $Width, $Height)
    EndFunc ;==>_Draw

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

    Func _Clear()
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $BackgroundBMP, 0, 0, $Width, $Height)
    EndFunc ;==>_Clear

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

    Func _Exit()
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]


    P.S.: Wenn Du ein Skript testest, soltest Du Dir auch ab und zu mal den CPU-Verbrauch im Taskmanager anschauen. ;)

  • Vielleicht liegst an meinem PC oder jmd. hat mich falsch verstanden.

    Die oben genannten Beispiele ändern nichts an meinem Probelm;

    entweder hat man keinen Hintergrund, oder ss ist immer mehr als eine Ellipse zu sehen.

    Ich kann das Hintergrundbild ja mal anhängen;

  • Wie wärs denn damit?

    Spoiler anzeigen
    [autoit]

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

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

    _GDIPlus_Startup()
    $BackgroundPIC = @ProgramFilesDir & "\AutoIt3\Examples\GUI\msoobe.jpg"

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

    $Width = 800
    $Height = 600

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

    Opt("GuionEventmode", 1)

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

    $hWnd = GUICreate("Test", $Width, $Height)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_Draw")
    GUISetOnEvent($GUI_EVENT_PRIMARYUP, "_Clear")

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

    GUISetState(@SW_SHOW)

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

    Global $BackgroundBMP = _GDIPlus_BitmapCreateFromFile($BackgroundPIC)
    Global $hPen = _GDIPlus_PenCreate(0xFFFF0000, 10)
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $hGraphics)
    Global $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    $x1 = 0
    $y1 = $Height
    $x2 = $Width
    $y2 = $Height
    $step = 30
    $clearcolor = 0x00FFFFFF

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

    While True
    Sleep(1000)
    WEnd

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

    Func _Draw()
    $Mouse = GUIGetCursorInfo()

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

    If @error Or Not $Mouse[4] Then Return

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

    $m1 = ($Mouse[1] - $y1) / ($Mouse[0] - $x1)
    $b1 = $Mouse[1] - $m1 * $Mouse[0]
    $m2 = ($Mouse[1] - $y2) / ($Mouse[0] - $x2)
    $b2 = $Mouse[1] - $m2 * $Mouse[0]

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

    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $BackgroundBMP, 0, 0, $Width, $Height)

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

    For $x = $x1 To $Mouse[0] Step $step
    $y = $m1 * $x + $b1
    _GDIPlus_GraphicsDrawEllipse($hBackbuffer, $x, $y, 5, 5, $hPen)
    Next

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

    For $x = $x2 To $Mouse[0] Step -$step
    $y = $m2 * $x + $b2
    _GDIPlus_GraphicsDrawEllipse($hBackbuffer, $x, $y, 5, 5, $hPen)
    Next

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

    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $Width, $Height)
    EndFunc ;==>_Draw

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

    Func _Exit()
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_GraphicsDispose($hBackbuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_BitmapDispose($BackgroundBMP)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]


    Irgendwie vergisst du immer die Ressourcen aus dem Arbeitsspeicher wieder zu entfernen, oder du weißt nicht wie es geht. :huh: _GDIPlus_Shutdown alleine reicht da nicht, du musst auch Grafiken mit _GDIPlus_GraphicsDispose löschen etc. ;).