_GDI+ Objekte löschen

  • Hey,

    und mal wieder Ich ;/

    Leider komm ich an einem aktuellen Problem nicht weiter.

    Ich erstelle einen Screenshot, danach leg ich ne GUI über den gesamten Bildschirm und lade dort das Bild.

    Jetzt möchte ich sobald die linke Maustaste gedrückt und gehalten wird und weggezogen wird ein Viereck zeichnen, das funktioniert auch.

    Das Viereck dient dazu die Koordinaten für ein Screenshot festzulegen.

    Das Problem was ich jetzt habe, ich kann zwar das Viereck (Ich zeichne alle 4 linien einzeln) funktioniert zwar, aber das löschen des "alten" Vierecks nicht! Finde auch keine Befehle dafür.

    Als letzten Versuch habe ich probiert in der Schleife das GDI+ zu starten und zu beenden, aber auch das löscht nicht zuversichtlich die letzten Vierecke :/

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <ScreenCapture.au3>
    #include <Misc.au3>

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

    Opt("TrayIconDebug", 1)

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

    HotKeySet("{ESC}", "ende")

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

    Global $CaptureFile = "C:\test.bmp"
    Global $Edit_Alt[2]
    Global $line_x = 0

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

    $Fenster = GUICreate("Test", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
    _ScreenCapture_Capture($CaptureFile, 0, 0, -1, -1, 0)

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

    GUICtrlCreatePic($CaptureFile, 0, 0, @DesktopWidth, @DesktopHeight)

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

    GUISetState()

    $UserDLL = DllOpen("user32.dll")

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

    While 1
    If _IsPressed("01", $UserDLL) Then
    Local $Start_Pos = MouseGetPos()
    ExitLoop
    EndIf
    Sleep(100)
    WEnd

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

    While 1

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

    $Edit_Pos = MouseGetPos()

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

    _GDIPlus_Startup()

    $Graphic = _GDIPlus_GraphicsCreateFromHWND($Fenster)

    $Pinsel = _GDIPlus_PenCreate(0xFF000000, 4)

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

    If $Edit_Pos[0] <> $Start_Pos[0] And $Edit_Pos[0] <> $Edit_Alt[0] Then

    $line_x = _GDIPlus_GraphicsDrawLine($Graphic, $Start_Pos[0], $Start_Pos[1], $Edit_Pos[0], $Start_Pos[1], $Pinsel)
    $line_x2 = _GDIPlus_GraphicsDrawLine($Graphic, $Start_Pos[0], $Edit_Pos[1], $Edit_Pos[0], $Edit_Pos[1], $Pinsel)

    $Edit_Alt[0] = $Edit_Pos[0]

    EndIf

    If $Edit_Pos[1] <> $Start_Pos[1] And $Edit_Pos[1] <> $Edit_Alt[1] Then

    $line_y = _GDIPlus_GraphicsDrawLine($Graphic, $Start_Pos[0], $Start_Pos[1], $Start_Pos[0], $Edit_Pos[1], $Pinsel)
    $line_y2 = _GDIPlus_GraphicsDrawLine($Graphic, $Edit_Pos[0], $Start_Pos[1], $Edit_Pos[0], $Edit_Pos[1], $Pinsel)

    $Edit_Alt[1] = $Edit_Pos[1]

    EndIf

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

    _GDIPlus_GraphicsDispose($Graphic)
    _GDIPlus_Shutdown()

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

    If Not _IsPressed("01", $UserDLL) Then
    Local $End_Pos = MouseGetPos()

    If $Start_Pos[0] < $End_Pos[0] Then
    $left = $Start_Pos[0]
    $right = $End_Pos[0]
    Else
    $left = $End_Pos[0]
    $right = $Start_Pos[0]
    EndIf

    If $Start_Pos[1] < $End_Pos[1] Then
    $top = $Start_Pos[1]
    $bottom = $End_Pos[1]
    Else
    $top = $End_Pos[1]
    $bottom = $Start_Pos[1]
    EndIf

    ExitLoop
    EndIf

    Sleep(100)
    WEnd

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

    Func ende()

    Exit

    EndFunc

    [/autoit]

    Vllt hat ja jemand Erfahrung mit _GDI+ und dieser Problematik.

    Gruß

    Prajoss

    "Never touch a running System!"

    Einmal editiert, zuletzt von Prajoss (25. März 2009 um 16:49)

  • Hatte nen Geistesblitz und es selbst gelöst,

    einfach ein 2. Gui erstellen, ebenfalls über den Bildschirm legen und Transparent machen *g* (komplizierte Geschichte^^)

    "Never touch a running System!"

  • Nein, das funktioniert nur in einer Layerd-GUI, die ABCDEF als transparente Farbe hat...

  • Hey,

    im moment sieht das Script so aus:

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <ScreenCapture.au3>
    #include <Misc.au3>

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

    Opt("TrayIconDebug", 1)

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

    HotKeySet("{ESC}", "ende")

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

    Global $CaptureFile = "C:\test.bmp"
    Global $Edit_Alt[2]

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

    $Fenster = GUICreate("Test", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
    _ScreenCapture_Capture($CaptureFile, 0, 0, -1, -1, 0)

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

    GUICtrlCreatePic($CaptureFile, 0, 0, @DesktopWidth, @DesktopHeight)

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

    GUISetCursor(3, 1)

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

    GUISetState(@SW_SHOW, $Fenster)
    GUISetState(@SW_DISABLE, $Fenster)

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

    $Fenster2 = GUICreate("Test2", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, $WS_EX_LAYERED)
    GUISetBkColor(0xABCDEF)
    _WinAPI_SetLayeredWindowAttributes($Fenster2, 0xABCDEF, 255)

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

    GUISetState(@SW_SHOW, $Fenster2)

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

    GUISetCursor(3, 1)

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

    _GDIPlus_Startup()

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

    $Graphic = _GDIPlus_GraphicsCreateFromHWND($Fenster2)

    $Pinsel = _GDIPlus_PenCreate(0xFF000000, 4)

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

    $UserDLL = DllOpen("user32.dll")

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

    While 1
    If _IsPressed("01", $UserDLL) Then
    Local $Start_Pos = MouseGetPos()
    ExitLoop
    EndIf
    Sleep(100)
    WEnd

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

    While 1

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

    $Edit_Pos = MouseGetPos()

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

    If ($Edit_Pos[0] <> $Start_Pos[0] And $Edit_Pos[0] <> $Edit_Alt[0]) Or ($Edit_Pos[1] <> $Start_Pos[1] And $Edit_Pos[1] <> $Edit_Alt[1]) Then

    _GDIPlus_GraphicsClear($Graphic, 0xFFABCDEF)

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

    $line_x = _GDIPlus_GraphicsDrawLine($Graphic, $Start_Pos[0], $Start_Pos[1], $Edit_Pos[0], $Start_Pos[1], $Pinsel)
    $line_x2 = _GDIPlus_GraphicsDrawLine($Graphic, $Start_Pos[0], $Edit_Pos[1], $Edit_Pos[0], $Edit_Pos[1], $Pinsel)
    $line_y = _GDIPlus_GraphicsDrawLine($Graphic, $Start_Pos[0], $Start_Pos[1], $Start_Pos[0], $Edit_Pos[1], $Pinsel)
    $line_y2 = _GDIPlus_GraphicsDrawLine($Graphic, $Edit_Pos[0], $Start_Pos[1], $Edit_Pos[0], $Edit_Pos[1], $Pinsel)

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

    $Edit_Alt[0] = $Edit_Pos[0]
    $Edit_Alt[1] = $Edit_Pos[1]

    EndIf

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

    If Not _IsPressed("01", $UserDLL) Then
    Local $End_Pos = MouseGetPos()

    If $Start_Pos[0] < $End_Pos[0] Then
    $left = $Start_Pos[0]
    $right = $End_Pos[0]
    Else
    $left = $End_Pos[0]
    $right = $Start_Pos[0]
    EndIf

    If $Start_Pos[1] < $End_Pos[1] Then
    $top = $Start_Pos[1]
    $bottom = $End_Pos[1]
    Else
    $top = $End_Pos[1]
    $bottom = $Start_Pos[1]
    EndIf

    ExitLoop
    EndIf

    Sleep(100)
    WEnd

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

    _GDIPlus_GraphicsDispose($Graphic)
    _GDIPlus_Shutdown()

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

    Func ende()

    Exit

    EndFunc

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

    Func _WinAPI_SetLayeredWindowAttributes($hwnd, $i_transcolor, $Transparency = 255, $dwFlages = 0x03, $isColorRef = False)
    ; progandy
    If $dwFlages = Default Or $dwFlages = "" Or $dwFlages < 0 Then $dwFlages = 0x03
    If Not $isColorRef Then
    $i_transcolor = Hex(String($i_transcolor), 6)
    $i_transcolor = Execute('0x00' & StringMid($i_transcolor, 5, 2) & StringMid($i_transcolor, 3, 2) & StringMid($i_transcolor, 1, 2))
    EndIf
    Local $Ret = DllCall("user32.dll", "int", "SetLayeredWindowAttributes", "hwnd", $hwnd, "long", $i_transcolor, "byte", $Transparency, "long", $dwFlages)
    Select
    Case @error
    Return SetError(@error, 0, 0)
    Case $Ret[0] = 0
    Return SetError(4, _WinAPI_GetLastError(), 0)
    Case Else
    Return 1
    EndSelect
    EndFunc ;==>_WinAPI_SetLayeredWindowAttributes#cs ----------------------------------------------------------------------------

    [/autoit]

    Und so funktioniert es auch/gestern abend noch vor Feierabend hinbekommen^^), Danke hier nochmal an Progandy für diese Funktion :)

    "Never touch a running System!"