Bilder auf Bildschirm zeichnen

  • Hallo liebe Com,
    ich habe mal wieder eine Frage, die lautet:

    Wie kann ich, wie Faweyr in vielen seiner Scripte, Bilder auf den Bildschirm zeichen?

    Ich hab bis jetzt an den Beispielen gesehen, das das mit einem "DC" und WinApi zu tun hat, kann jedoch daraus leider gar nichts erschließen. Meine kläglichen Versuche:

    [autoit]


    $dc = _WinAPI_CreateCompatibleDC(_WinAPI_GetDC(0))
    $sprite = _GDIPlus_ImageLoadFromFile($spritepath & "w1.bmp")

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

    $graphics = _GDIPlus_GraphicsCreateFromHDC($dc)
    _GDIPlus_GraphicsDrawImageRect($graphics, $sprite, 0, 0, 200, 200)

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

    While 1

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

    WEnd

    [/autoit]


    Hoffe ihr könnt mir helfen!
    Vielen Dank im Vorraus,
    viele Grüße,
    stayawayknight


    PS: Das sind solche Scripte von Faweyr: Office Killer 2.1 [Full Game] [Lite-Version]
    Maple-Desktop <Last Update>
    Grußkarte mit Sylvesterknaller (GDI+)

    Einmal editiert, zuletzt von stayawayknight (15. Oktober 2010 um 18:38)

  • schau dir mal das Beispiel zu

    [autoit]

    _WinAPI_DrawLine ()

    [/autoit]

    an...
    /edit/ zeichnen....ich sollte die Fragen besser lesen...

  • [autoit]

    #include <WinAPI.au3>
    #include <GDIPlus.au3>
    _GDIPlus_Startup() ;wichtig!

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

    $dc = _WinAPI_GetDC(0) ;der DC des Desktops, der "compatibleDC" erstellt einen kompatiblen DC, in den du auch reingezeichnet hast!
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $dc = ' & $dc & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $sprite = _GDIPlus_ImageLoadFromFile( "rgbhsv.jpg")
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sprite = ' & $sprite & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $graphics = _GDIPlus_GraphicsCreateFromHDC($dc)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $graphics = ' & $graphics & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    _GDIPlus_GraphicsDrawImageRect($graphics, $sprite, 0, 0, 200, 200)

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

    While 1

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

    WEnd

    [/autoit]
  • Danke, das kommt dem ganzen schon sehr nahe, jedoch bleiben die typischen GDI+ Eigenschaften:
    Die Maus funktioniert wie ein Radierer sozusagen, und wenn man das Fenster wechselt ist alles weg... Natürlich kann man das Nachzeichnen, aber dann taucht wieder das Geflackere auf... ich glaub das geht noch irgendwie anders, evtl. auch ohne GDI und mit WinApi...
    danke trotzdem soweit für eure Antworten!

    Edit: Das mit dem DrawLine Beispiel kommt dem sehr sehr Nahe, das gleiche nur noch mit Bild und es wäre perfekt

  • Hi

    Kommt darauf an, was du genau machen willst.
    Recht einfach finde ich diese Version:

    Spoiler anzeigen
    [autoit]

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

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

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

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

    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile("rgbhsv.jpg")
    $iWidth = _GDIPlus_ImageGetWidth($hImage)
    $iHeight = _GDIPlus_ImageGetHeight($hImage)

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

    $hGui = GUICreate("Test", $iWidth, $iHeight, Default, Default, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_LAYERED, $WS_EX_TRANSPARENT))
    GUISetState()

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

    _DrawImage($hGui, $hImage, $iWidth, $iHeight)

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

    While 1
    Sleep(100)
    WEnd

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

    Func _DrawImage($hWnd, $hBitmap, $iW, $iH)
    Local $tSize = DllStructCreate("long X;long Y")
    DllStructSetData($tSize, "X", $iW)
    DllStructSetData($tSize, "Y", $iH)
    Local $tSource = DllStructCreate("long X;long Y")
    Local $tBlendI = DllStructCreate("byte Op;byte Flags;byte Alpha;byte Format")
    DllStructSetData($tBlendI, "Alpha", 0xFF)
    DllStructSetData($tBlendI, "Format", 1)

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

    Local $hDCD = _WinAPI_GetDC($hWnd)
    Local $hDCS = _WinAPI_CreateCompatibleDC($hDCD)
    Local $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    Local $hOrig = _WinAPI_SelectObject($hDCS, $hBmp)

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

    _WinAPI_UpdateLayeredWindow($hWnd, $hDCD, 0, DllStructGetPtr($tSize), $hDCS, DllStructGetPtr($tSource), 0, DllStructGetPtr($tBlendI), 2)

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

    _WinAPI_SelectObject($hDCS, $hOrig)
    _WinAPI_DeleteObject($hBmp)
    _WinAPI_DeleteDC($hDCS)
    _WinAPI_ReleaseDC($hWnd, $hDCD)
    EndFunc ;==>_DrawImage

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

    Func _EXIT()
    _GDIPlus_BitmapDispose($hImage)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_EXIT

    [/autoit]

    mfgE

  • Muss leider nochmals hochholen - es ergibt sich ein weiteres Problem.
    Ich habe Bilder von verschiedenen Größen (alle um 60x60 bis 71x71, nicht nur quadratisch!). Diese werden aber nun bei unterschiedlichen GuiGrößen entweder angezeigt oder nicht angezeigt. Sprich, mach ich die Gui größer, werden die kleinern nicht mehr angezeigt, andersrum aber genauso.

    Weiß vielleicht nochmal jemand Rat?
    Vielen Dank im Vorraus!

    Edit: Hätte eukalyptus' Beispiel besser anschauen sollen... Problem hat sich erledigt, entschuldigt bitte