GDIPlus Zeichnen ohne sichtbare GUI

  • Moin zusammen,

    Befasse mich grad mit GDIPlus und steh da auf´m Schlauch. Wie bekomme ich es hin, dass ich Kreise usw. ohne sichtbare GUI zeichnen kann. Ich möchte in ein Word Fenster direkt auf den Desktop zeichnen, bekomme es aber auch nicht annähernd hin. Kann mir da einer einen Tip, Beispielcode oder sonstwas geben. Hab´s schonmal gesehen, also muß es ja gehen.

    Gruß
    MrB

    P.S.: SuFu mag mich nicht. Finde nix passendes

    Einmal editiert, zuletzt von MrB (15. Dezember 2012 um 08:22)

  • Es gibt mehrere Möglichkeiten.

    Für die einfachste Methode schau dir mal das Hilfebeispiel zu _WinAPI_DrawLine an.

    Wenn die Zeichnung dauerhaft sichtbar sein soll, dann arbeite am besten mit UpdateLayeredWindow:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <StructureConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>

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

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

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

    Opt("MustDeclareVars", 1)

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

    Global $iWidth = @DesktopWidth
    Global $iHeight = @DesktopHeight

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

    _GDIPlus_Startup()
    Global $hGui = GUICreate("Test", $iWidth, $iHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_LAYERED, $WS_EX_TRANSPARENT))

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

    Global $tSize = DllStructCreate($tagSIZE)
    Global $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $iWidth)
    DllStructSetData($tSize, "Y", $iHeight)
    Global $tSource = DllStructCreate($tagPOINT)
    Global $pSource = DllStructGetPtr($tSource)
    Global $tBlend = DllStructCreate($tagBLENDFUNCTION)
    Global $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", 0xFF)
    DllStructSetData($tBlend, "Format", 1)

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

    GUISetState()

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

    _Draw()

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

    While Sleep(10)
    WEnd

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

    Func _Draw()
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
    Local $hBitmap = $aResult[6]
    Local $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    Local $hBrush = _GDIPlus_BrushCreateSolid(0x88886600)
    _GDIPlus_GraphicsFillEllipse($hContext, $iWidth * 0.1, $iHeight * 0.1, $iWidth * 0.8, $iHeight * 0.8, $hBrush)
    _GDIPlus_BrushDispose($hBrush)

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

    Local $hPen = _GDIPlus_PenCreate(0xFFAA8800, 10)
    _GDIPlus_GraphicsDrawEllipse($hContext, $iWidth * 0.1, $iHeight * 0.1, $iWidth * 0.8, $iHeight * 0.8, $hPen)
    _GDIPlus_PenDispose($hPen)

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

    _GDIPlus_GraphicsDispose($hContext)
    Local $hDC = _WinAPI_GetDC($hGui)
    Local $hCDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _GDIPlus_BitmapDispose($hBitmap)
    Local $hOBJ = _WinAPI_SelectObject($hCDC, $hBMP)

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

    _WinAPI_UpdateLayeredWindow($hGui, $hDC, 0, $pSize, $hCDC, $pSource, 0, $pBlend, $ULW_ALPHA)

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

    _WinAPI_SelectObject($hCDC, $hOBJ)
    _WinAPI_DeleteObject($hBMP)
    _WinAPI_DeleteDC($hCDC)
    _WinAPI_ReleaseDC($hGui, $hDC)
    EndFunc ;==>_Draw

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

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

    [/autoit]

    zu _WinAPI_UpdateLayeredWindow findest du im Forum noch weitere zahlreiche Beispiele...

    E

  • Dank dir, hat mich schon weiter gebracht.

    Hab mir mal grad folgendes sinnloses Bsp. zusammen gebastelt. Hab leider grad nicht so viel Zeit.

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>
    #include <StructureConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>

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

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

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

    Global $iWidth = @DesktopWidth
    Global $iHeight = @DesktopHeight
    Global $aTreffer[5][2]

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

    _GDIPlus_Startup()
    Global $hGui = GUICreate("Test", $iWidth, $iHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_LAYERED, $WS_EX_TRANSPARENT))

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

    Global $tSize = DllStructCreate($tagSIZE)
    Global $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $iWidth)
    DllStructSetData($tSize, "Y", $iHeight)
    Global $tSource = DllStructCreate($tagPOINT)
    Global $pSource = DllStructGetPtr($tSource)
    Global $tBlend = DllStructCreate($tagBLENDFUNCTION)
    Global $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", 0xFF)
    DllStructSetData($tBlend, "Format", 1)

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

    GUISetState()

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

    $counter = 0
    $left = 1325
    $top = 0
    $right = @DesktopWidth
    $height = @DesktopHeight

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

    Do
    $Search = PixelSearch($left, $top, $right, $height, 0x4CBAEF)
    If Not @error Then
    $aTreffer[$counter][0] = $Search[0]
    $aTreffer[$counter][1] = $Search[1]
    $counter = $counter + 1
    $top = $Search[1] + 1
    _Draw($aTreffer)
    EndIf
    Until @error

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

    While Sleep(10)
    WEnd

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

    Func _Draw($aTreffer)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
    Local $hBitmap = $aResult[6]
    Local $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    Local $hPen = _GDIPlus_PenCreate(0xFFAA8800, 10)

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

    For $i = 0 To UBound($aTreffer) - 1
    If $aTreffer[$i][0] <> "" Then
    _GDIPlus_GraphicsDrawArc($hContext, $aTreffer[$i][0], $aTreffer[$i][1], 10, 10, 180, 360, $hPen)
    EndIf
    Next
    _GDIPlus_PenDispose($hPen)

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

    _GDIPlus_GraphicsDispose($hContext)
    Local $hDC = _WinAPI_GetDC($hGui)
    Local $hCDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _GDIPlus_BitmapDispose($hBitmap)
    Local $hOBJ = _WinAPI_SelectObject($hCDC, $hBMP)

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

    _WinAPI_UpdateLayeredWindow($hGui, $hDC, 0, $pSize, $hCDC, $pSource, 0, $pBlend, $ULW_ALPHA)

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

    _WinAPI_SelectObject($hCDC, $hOBJ)
    _WinAPI_DeleteObject($hBMP)
    _WinAPI_DeleteDC($hCDC)
    _WinAPI_ReleaseDC($hGui, $hDC)
    EndFunc ;==>_Draw

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

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

    [/autoit]

    Sucht einfach eine beliebige Farbe am Bildschirm und macht einen Kreis an den Fundort. Klappt auch wunderbar, ist auch immer im Vordergrund. Nur wie lösche ich das wieder. Hab leider grad keine Möglichkeit lange zu suchen. Nicht schlimm wenn du keine Lust hast zu antworten. Ich verschieb die Suche dann auf heute Mittag.

    LG
    MrB

  • Zum löschen entweder den Context mit der Farbe 0 "clearen", oder via _WinAPI_CreateCompatibleBitmap einen leeren Buffer erzeugen:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <StructureConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>

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

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

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

    Opt("MustDeclareVars", 1)

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

    Global $iWidth = @DesktopWidth
    Global $iHeight = @DesktopHeight

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

    _GDIPlus_Startup()
    Global $hGui = GUICreate("Test", $iWidth, $iHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_LAYERED, $WS_EX_TRANSPARENT))

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

    Global $tSize = DllStructCreate($tagSIZE)
    Global $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $iWidth)
    DllStructSetData($tSize, "Y", $iHeight)
    Global $tSource = DllStructCreate($tagPOINT)
    Global $pSource = DllStructGetPtr($tSource)
    Global $tBlend = DllStructCreate($tagBLENDFUNCTION)
    Global $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", 0xFF)
    DllStructSetData($tBlend, "Format", 1)

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

    Global $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
    Global $hBitmap = $aResult[6]
    Global $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hContext, 2)

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

    GUISetState()

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

    _DrawEllipse()

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

    Sleep(1000)

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

    _UpdateWindow(0)

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

    Sleep(1000)

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

    _DrawRandom()

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

    While Sleep(10)
    WEnd

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

    Func _DrawRandom()
    Local $hBrush = _GDIPlus_BrushCreateSolid(0)
    Local $hPen = _GDIPlus_PenCreate(0, 3)

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

    Local $fX, $fY, $fR, $iR, $iG, $iB

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

    For $i = 0 To 20

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

    $iR = Random(0, 0xFF, 1)
    $iG = Random(0, 0xFF, 1)
    $iB = Random(0, 0xFF, 1)
    _GDIPlus_PenSetColor($hPen, BitOR(0xFF000000, BitShift($iR, -16), BitShift($iG, -8), $iB))
    _GDIPlus_BrushSetSolidColor($hBrush, BitOR(0x60000000, BitShift($iR, -16), BitShift($iG, -8), $iB))

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

    $fX = Random(0, $iWidth)
    $fY = Random(0, $iHeight)
    $fR = Random(50, 300)
    _GDIPlus_GraphicsFillEllipse($hContext, $fX - $fR, $fY - $fR, $fR * 2, $fR * 2, $hBrush)
    _GDIPlus_GraphicsDrawEllipse($hContext, $fX - $fR, $fY - $fR, $fR * 2, $fR * 2, $hPen)
    _UpdateWindow($hBitmap)

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

    If Mod($i, 3) = 2 Then _GDIPlus_GraphicsClear($hContext, 0)

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

    Sleep(800)
    Next

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

    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_PenDispose($hPen)
    EndFunc ;==>_DrawRandom

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

    Func _DrawEllipse()
    Local $hBrush = _GDIPlus_BrushCreateSolid(0x88886600)
    _GDIPlus_GraphicsFillEllipse($hContext, $iWidth * 0.1, $iHeight * 0.1, $iWidth * 0.8, $iHeight * 0.8, $hBrush)
    _GDIPlus_BrushDispose($hBrush)

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

    Local $hPen = _GDIPlus_PenCreate(0xFFAA8800, 10)
    _GDIPlus_GraphicsDrawEllipse($hContext, $iWidth * 0.1, $iHeight * 0.1, $iWidth * 0.8, $iHeight * 0.8, $hPen)
    _GDIPlus_PenDispose($hPen)

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

    _UpdateWindow($hBitmap)

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

    _GDIPlus_GraphicsClear($hContext, 0)
    EndFunc ;==>_DrawEllipse

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

    Func _UpdateWindow($hBitmap)
    Local $hDC = _WinAPI_GetDC($hGui)
    Local $hCDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hBMP
    If $hBitmap Then
    $hBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    Else
    $hBMP = _WinAPI_CreateCompatibleBitmap($hCDC, $iWidth, $iHeight)
    EndIf
    Local $hOBJ = _WinAPI_SelectObject($hCDC, $hBMP)

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

    _WinAPI_UpdateLayeredWindow($hGui, $hDC, 0, $pSize, $hCDC, $pSource, 0, $pBlend, $ULW_ALPHA)

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

    _WinAPI_SelectObject($hCDC, $hOBJ)
    _WinAPI_DeleteObject($hBMP)
    _WinAPI_DeleteDC($hCDC)
    _WinAPI_ReleaseDC($hGui, $hDC)
    EndFunc ;==>_UpdateWindow

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

    Func _Exit()
    _GDIPlus_GraphicsDispose($hContext)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]
  • Hey, ich hab mich sehr lange damit in AutoIt und C++ befast.

    Eine gesamte Sprite UDF findest du von mir hier: Link
    Ein sehr altes Beispiel hier: Link , der Nachfolger davon heißt: "Maple Deskop", aber die Website ist schon down...
    Im OffTopic/C++ Bereich solltest du auch ein GDI+ Beispiel in C++ dafür finden.

    Grüße Faweyr