Moin AutoIt-ler,
dies ist das erste Mal das ich GDI+ mal fürs zeichnen verwenden möchte. Habe sonst lediglich Screenshots weiter verarbeitet und gespeichert.
Ich möchte also gerne direkt auf dem Screen zeichnen. Nach einiger Recherche habe ich herausbekommen das man wohl immer eine GUI benötigt damit man etwas auf dem Screen darstellen kann.
Habe das Beispiel von "Croco" aus diesem Forum übernommen: https://www.elitepvpers.com/forum/coding-t…hirm-malen.html mit dem die GUI ja tatsächlich transparent wird und es quasi wirkt als würde man direkt auf den Screen zeichnen.
Mein Problem ist nur, das ich gezeichnete "GDI+ Graphics" nicht sauber wieder gelöscht bekomme. Tatsächlich funktioniert nur die dort gepostete WinApi Funktion:
Da ich aber eine Art "Animation" darstellen wollte bei den ich immer wieder das Gezeichnete schnell hintereinander löschen müsste entsteht aufgrund der WinApi-Funktion ein starkes Flackern.
Habt ihr eine Idee wie man dies sauber darstellen könnte (ohne Flackern) ?
Beispiel-Skript: (angehängte .gif muss sich im skript-ordner befinden: autoit.de/wcf/attachment/89077/ )
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <MsgBoxConstants.au3>
#include <WinApi.au3>
Global $hGraphic = ""
Global $hWND = ""
Global $hPen = ""
_GDIPlus_Startup()
$hPen = _GDIPlus_PenCreate(0xFFFF0000, 4) ;color format AARRGGBB (hex)
$hWND = GUICreate("", @DesktopWidth, @DesktopHeight, -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED,$WS_EX_TOPMOST))
$Pic1 = GUICtrlCreatePic("bg.gif", 0, 0, @DesktopWidth, @DesktopHeight)
_WinAPI_SetLayeredWindowAttributes($hWND, 0x00FF00)
GUISetState(@SW_SHOW)
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWND)
_GDIPlus_GraphicsSetSmoothingMode($hGraphic, $GDIP_SMOOTHINGMODE_HIGHQUALITY) ;sets the graphics object rendering quality (antialiasing)
_GDIPlus_GraphicsDrawEllipse($hGraphic, MouseGetPos(0) - 24, MouseGetPos(1), 50, 50,$hPen)
Sleep(50)
_WinAPI_RedrawWindow($hWND) ;Das löschen der Elipse verursacht ein Flackern. Keine GDI+ Funktion gefunden die es schaft die Elipse wieder zu entfernen
_GDIPlus_GraphicsDrawEllipse($hGraphic, MouseGetPos(0) - 19, MouseGetPos(1) +4, 40, 40,$hPen)
Sleep(50)
_WinAPI_RedrawWindow($hWND)
_GDIPlus_GraphicsDrawEllipse($hGraphic, MouseGetPos(0) - 14, MouseGetPos(1) +6, 30, 30,$hPen)
Sleep(50)
_WinAPI_RedrawWindow($hWND)
_GDIPlus_GraphicsDrawEllipse($hGraphic, MouseGetPos(0) - 9, MouseGetPos(1) +10, 20, 20,$hPen)
Sleep(50)
_WinAPI_RedrawWindow($hWND)
_GDIPlus_GraphicsDrawEllipse($hGraphic, MouseGetPos(0) - 4, MouseGetPos(1) +12, 10, 10,$hPen)
Sleep(500)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown()
Alles anzeigen