Frage an GDIPlus Users!

  • Hallo, GDIPlus-User

    Habe mal folgendes Script geschrieben

    Spoiler anzeigen
    [autoit]


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

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

    Opt("MustDeclareVars", 1) ; 0=nein, 1=erfordert Deklaration
    Opt("GUICloseOnESC", 1) ; 1=ESC beendet, 0=ESC schließt nicht

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

    Global $GUI, $Logo_PNG, $hGraphic

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

    $GUI = GUICreate ("Test-GDIPlus", 364, 290,-1,-1, BitOR($WS_CAPTION, $WS_POPUPWINDOW), BitOR($WS_EX_TOOLWINDOW,$WS_EX_TOPMOST))
    GUISetState (@SW_SHOW)

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

    _GDIPlus_Startup()
    $Logo_PNG = _GDIPlus_ImageLoadFromFile (@ScriptDir & "\testbild.png")
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($GUI)
    _GDIPlus_GraphicsDrawImage ($hGraphic, $Logo_PNG, 32, 6)

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    EndSwitch
    WEnd

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

    GUIDelete ($GUI) ; Schließe Gui
    _GDIPlus_GraphicsDispose ($hGraphic) ; Gib Grafik-Objekt wieder frei
    _GDIPlus_ImageDispose ($Logo_PNG) ; Gib das Bild-Objekt frei
    _GDIPlus_Shutdown() ; Gib die verwendeten Ressourcen wieder frei
    Exit

    [/autoit]

    Meine Frage lautet nun:
    Wie schaffe ich es das, das Bild nicht wieder verschwindet, wenn man den Desktop anzeigt und zum Fenster
    zurück springt. ?(


    Danke, mehr Fragen habe ich nicht...

    Thanx und See you of Autoit ^^

    tv_freeze

    Einmal editiert, zuletzt von tv_freeze (3. Juni 2010 um 23:26)

  • Wenn ich dir einfach helfen würde, würdst dus glaube ich nicht kapieren...
    Schau dir am besten nochmal Ubuntus oder Seubo's Tut an.
    Nur so viel: Du musst herausfinden, wann das ganze neu gezeichnet werden soll (WM_PAINT) ;)

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Mit Backbuffer arbeiten und WM_PAINT Registrieren ;).
    Also so:

    Spoiler anzeigen
    [autoit]

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

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

    Opt("MustDeclareVars", 1) ; 0=nein, 1=erfordert Deklaration
    Opt("GUICloseOnESC", 1) ; 1=ESC beendet, 0=ESC schließt nicht

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

    Global $GUI, $Logo_PNG, $hGraphic, $hBitmap, $hBuffer

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

    $GUI = GUICreate("Test-GDIPlus", 364, 290, -1, -1, BitOR($WS_CAPTION, $WS_POPUPWINDOW), BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
    GUISetState(@SW_SHOW)

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

    _GDIPlus_Startup()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($GUI)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(364, 290, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    $Logo_PNG = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\testbild.png")

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

    _GDIPlus_GraphicsDrawImage($hBuffer, $Logo_PNG, 32, 6)
    WM_PAINT()

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

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    EndSwitch
    WEnd

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

    GUIDelete($GUI) ; Schließe Gui
    _GDIPlus_GraphicsDispose($hGraphic) ; Gib Grafik-Objekt wieder frei
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_ImageDispose($Logo_PNG) ; Gib das Bild-Objekt frei
    _GDIPlus_Shutdown() ; Gib die verwendeten Ressourcen wieder frei
    Exit

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, 364, 290)
    EndFunc

    [/autoit]


    Schau dir bitte trotzdem das Tutorial an ;).

  • Bin trotzdem dafür, das du die Tut's nochmal durcharbeitests, damit du es auch dauerhaft verstehst...
    Die Lösung kennste ja jetzt 8o

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Danke, name22 & Cartan12

    ich habe das mal gemacht....das geht doch auch oder ?


    Spoiler anzeigen
    [autoit]


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

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

    Opt("MustDeclareVars", 1) ; 0=nein, 1=erfordert Deklaration
    Opt("GUICloseOnESC", 1) ; 1=ESC beendet, 0=ESC schließt nicht

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

    Global $GUI, $Logo_PNG, $hGraphic, $flag

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

    $GUI = GUICreate ("Test-GDIPlus", 364, 290,-1,-1, BitOR($WS_CAPTION, $WS_POPUPWINDOW), BitOR($WS_EX_TOOLWINDOW,$WS_EX_TOPMOST))
    GUISetState (@SW_SHOW)

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

    _GDIPlus_Startup()
    $Logo_PNG = _GDIPlus_ImageLoadFromFile (@ScriptDir & "\testbild.png")
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($GUI)
    _GDIPlus_GraphicsDrawImage ($hGraphic, $Logo_PNG, 32, 6)

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    EndSwitch
    ReDraw() ; Fenster prüfen und Logo wieder Anzeigen...
    WEnd

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

    GUIDelete ($GUI) ; Schließe Gui
    _GDIPlus_GraphicsDispose ($hGraphic) ; Gib Grafik-Objekt wieder frei
    _GDIPlus_ImageDispose ($Logo_PNG) ; Gib das Bild-Objekt frei
    _GDIPlus_Shutdown() ; Gib die verwendeten Ressourcen wieder frei
    Exit

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

    Func ReDraw()
    Select
    Case WinActive ("Test-GDIPlus", "") And $flag = 1
    _GDIPlus_GraphicsDrawImage ($hGraphic, $Logo_PNG, 32, 6) ; Logo nochmal zeigen
    $flag = 0 ; nur einmal!
    Case Not WinActive ("Test-GDIPlus", "")
    $flag = 1
    EndSelect
    EndFunc

    [/autoit]

    Cartan12
    Kannste auch mal den Link posten... Danke...

    name22
    Script funktioniert nicht so ganz... Wenn man mehrmals auf Desktop-anzeigen klickt verschwindet das bild immer noch...

  • name22

    Nein, habe mal Dein Script ohne welche Parameter ausprobiert.

    [autoit]


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

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

    Opt("MustDeclareVars", 1) ; 0=nein, 1=erfordert Deklaration
    Opt("GUICloseOnESC", 1) ; 1=ESC beendet, 0=ESC schließt nicht

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

    Global $GUI, $Logo_PNG, $hGraphic, $hBitmap, $hBuffer

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

    $GUI = GUICreate("Test-GDIPlus", 364, 290) ; <- Ohne Parameter!
    GUISetState(@SW_SHOW)

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

    _GDIPlus_Startup()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($GUI)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(364, 290, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    $Logo_PNG = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\testbild.png")

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

    _GDIPlus_GraphicsDrawImage($hBuffer, $Logo_PNG, 32, 6)
    WM_PAINT()

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

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    EndSwitch
    WEnd

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

    GUIDelete($GUI) ; Schließe Gui
    _GDIPlus_GraphicsDispose($hGraphic) ; Gib Grafik-Objekt wieder frei
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_ImageDispose($Logo_PNG) ; Gib das Bild-Objekt frei
    _GDIPlus_Shutdown() ; Gib die verwendeten Ressourcen wieder frei
    Exit

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, 364, 290)
    EndFunc

    [/autoit]

    Zeigt das Bild erst wieder, wenn man ein paarmal zwischen Editor und Gui-Fenster hin und herschaltet.
    Kennst Du ein Script wo so eine Funktion vorkommt ? (Bitte mit Link)

    Danke für Deine Antwort und Dein Lösungsversuch...

  • Das Bild verschwindet bei mir nicht, egal was ich mache... Außer ich minimiere es, dann müsste man es so machen.

    Spoiler anzeigen
    [autoit]

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

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

    Opt("MustDeclareVars", 1) ; 0=nein, 1=erfordert Deklaration
    Opt("GUICloseOnESC", 1) ; 1=ESC beendet, 0=ESC schließt nicht

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

    Global $GUI, $Logo_PNG, $hGraphic, $hBitmap, $hBuffer

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

    $GUI = GUICreate("Test-GDIPlus", 364, 290) ; <- Ohne Parameter!
    GUISetState(@SW_SHOW)

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

    _GDIPlus_Startup()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($GUI)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(364, 290, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    $Logo_PNG = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\testbild.png")

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

    _GDIPlus_GraphicsDrawImage($hBuffer, $Logo_PNG, 32, 6)
    WM_PAINT()

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

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $GUI_EVENT_RESTORE
    WM_PAINT()
    EndSwitch
    WEnd

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

    GUIDelete($GUI) ; Schließe Gui
    _GDIPlus_GraphicsDispose($hGraphic) ; Gib Grafik-Objekt wieder frei
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_ImageDispose($Logo_PNG) ; Gib das Bild-Objekt frei
    _GDIPlus_Shutdown() ; Gib die verwendeten Ressourcen wieder frei
    Exit

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, 364, 290)
    EndFunc

    [/autoit]


    Und ich habe bis jetzt noch keine andere Lösung für so ein GDI+ basiertes Script gesehen.