Bildschirmschoner bauen

  • Hallo,

    ich habe mit dem Bildschirmschoner noch folgendes Problem:
    Ich habe die GUI jetzt so weit, dass sie einen kompletten schwarzen Bildschirm anzeigt, und das Bild sich auch bewegt.
    Leider flackert das Bild nach jedem Schleifendurchlauf (da ich das Bild jedesmal aus der GUI entferne, und dann wieder an neuer Position einfüge).

    Spoiler anzeigen
    [autoit]


    #region --- GuiBuilder code Start ---
    #include <GuiConstants.au3>

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

    $breite = @DesktopWidth
    $hoehe = @DesktopHeight

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

    $links1 = (3000 - $breite) /2
    $oben1 = (3000 - $hoehe) /2
    $oben = $oben1
    $links = $links1
    $zaehler = 0
    $bild = "blub"

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

    GuiCreate("Bildschirmschoner", 3000, 3000)
    GUISetBkColor (000000)

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

    GuiSetState()

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

    While 1
    $msg = GuiGetMsg()

    Do
    sleep (150)
    guictrldelete ($bild)
    $links = $links + 1
    $oben = $oben + 2
    $bild = GUICtrlCreatePic("C:\Dokumente und Einstellungen\srb\Desktop\Bildschirmschoner\Aufzug.jpg", $links, $oben, 515, 408)
    $zaehler = $zaehler + 1

    UNTIL $zaehler > 5
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case Else
    ;;;
    EndSelect
    WEnd
    Exit
    #endregion --- GuiBuilder generated code End ---

    [/autoit]

    Ich bräuchte jetzt wahrscheinlich eine Funktkion od. ähnliches, das das Bild auf einer Sinuskurve, oder einer Gerade od. ähnlichem bewegt.

    Könnt ihr mir da helfen?

    Gruß

  • Xenobiologist : Ich glaube nicht, dass es das ist, was er erreichen möchte, wobei es sicherlich eine mögliche Erweiterung wäre.

    @srb: Wenn ich Dich richtig verstehen, möchtest Du einen Bildschirmschoner erstellen, bei dem EIN Bild auf dem Bildschirm bewegt wird.
    Folgendes reicht dazu:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>

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

    Opt("GUICloseOnESC", 1)
    Opt("MustDeclareVars", 1)

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

    Local Const $S_PICTURE = @ScriptDir & "\3IOB_2wallpaper800x600.jpg"
    Local Const $I_CHANGE = 500

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

    Local Const $I_GUIWIDTH = @DesktopWidth
    Local Const $I_GUIHEIGHT = @DesktopHeight
    Local Const $I_PICWIDTH = 800
    Local Const $I_PICHEIGHT = 600
    Local $a_orgmousepos = -1
    Local $a_curmousepos = -1
    Local $h_scrgui = -1
    Local $h_scrpic = -1
    Local $msg = 0

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

    MouseMove($I_GUIWIDTH, $I_GUIHEIGHT, 1)
    $a_orgmousepos = MouseGetPos()
    $h_scrgui = GUICreate("Simple Screen Saver", $I_GUIWIDTH, $I_GUIHEIGHT, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST)
    $h_scrpic = GUICtrlCreatePic($S_PICTURE, 0, 0, $I_PICWIDTH, $I_PICHEIGHT)
    GUISetBkColor(000000, $h_scrgui)

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

    GUISetState(@SW_SHOW, $h_scrgui)

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

    While 1
    $msg = GUIGetMsg()
    $a_curmousepos = MouseGetPos()

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

    If $msg == $GUI_EVENT_CLOSE Or $a_curmousepos[0] <> $a_orgmousepos[0] Or $a_curmousepos[1] <> $a_orgmousepos[1] Then
    ExitLoop 1
    EndIf

    GUICtrlSetPos($h_scrpic, Random(0, $I_GUIWIDTH - $I_PICWIDTH, 1), Random(0, $I_GUIHEIGHT - $I_PICHEIGHT, 1))
    Sleep($I_CHANGE)
    WEnd
    MouseMove($a_orgmousepos[0], $a_orgmousepos[1], 1)
    GUIDelete($h_scrgui)

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

    Exit (0)

    [/autoit]


    EDIT: Der Mauzeiger stört natürlich. Habe ich jetzt geändert. Was irgendwie nicht funktioniert ist den Mauszeiger an die ursprüngliche Position zu setzen. Weiß jemand wieso das nicht klappt?

    Einmal editiert, zuletzt von teh_hahn (27. Juli 2007 um 17:37)

  • Hallo,

    Xenobiologist : Ich glaube Du meintest Guictrlsetpos, denn mit Guictrlsetimage kann man ja die Position nicht verändern.
    Oder ich habe bei diesem Befehl nicht verstanden wie...

    teh_hahn: Danke, werde ich am Montag gleich mal ausprobieren, ob es so funktioniert, wie ich es mir vorstelle.

    Gruß
    Und schönes WE!!!

  • Ach übrigens, ist mir grade noch so eingefallen:

    meine Schleife bricht nicht ab. Sollte sie aber, wenn der Zähler größer 5 ist, also sollte sich die Position des Bildes nur 5 mal ändern, und dann stehen bleiben.
    Kann mir jemand erklären, woran das liegt? Denn wie schon gesagt läuft sie endlos weiter..

    Gruß

    Schönes WE

  • Hallo,

    die Do-Until Schleife bricht jetzt auch ab. Ich habe die Schleife aus der While Schleife genommen.

    Hier der Code, wie ich ihn jetzt habe:

    Spoiler anzeigen


    #include <GuiConstants.au3>

    $breite = @DesktopWidth
    $hoehe = @DesktopHeight

    $links1 = (3000 - $breite) /2
    $oben1 = (3000 - $hoehe) /2
    $oben = $oben1
    $links = $links1
    $zaehler = 0

    GuiCreate("Bildschirmschoner", 3000, 3000)
    GUISetBkColor (000000)
    $bild = GUICtrlCreatePic("C:\Dokumente und Einstellungen\srb\Desktop\Bildschirmschoner\Aufzug.jpg", $links, $oben, 515, 408)
    $file = "C:\Dokumente und Einstellungen\srb\Desktop\Bildschirmschoner\Aufzug.jpg"

    guisetstate()

    Do
    sleep (250)
    $links = $links + 1
    $oben = $oben + 1
    GUICtrlSetPos ($bild, $links, $oben)

    $zaehler = $zaehler + 1

    UNTIL $zaehler > 80

    While 1
    $msg = GuiGetMsg()

    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case Else
    ;;;
    EndSelect
    WEnd
    Exit

    Leider habe ich immernoch das Problem, dass das Bild sich jedes mal neu aufbaut, und somit keine schöne Kurve ergibt.

    Das gepostete Script für den Bildschirmschoner ist zwar gut, aber leider nicht das, was ich will.
    Ich hätte gerne eine Funktion, die das Bild weiterschiebt, und nicht jedesmal neu malt.

    Kann mir da vllt. jemand helfen?

    Gruß

    • Offizieller Beitrag

    Hallo

    Also wenn ich das richtig verstanden habe, möchtest du das Bild bewegen, aber ONHE flickern? Falls ja, brauchst du ein Child GUI was du dann immer bewegst.. In der Hilfe ist das auch nochmal beschrieben unter GuiCreate

    Habe dir dein Script mal umgebaut, jetzt läuft es ohne flickern

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>

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

    $breite = @DesktopWidth
    $hoehe = @DesktopHeight

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

    $links1 = (3000 - $breite) / 2
    $oben1 = (3000 - $hoehe) / 2
    $oben = $oben1
    $links = $links1
    $zaehler = 0

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

    $MAIN = GUICreate("Bildschirmschoner", 3000, 3000)
    GUISetBkColor(000000)
    GUISetState()
    $BildGui = GUICreate("",515,408,$links,$oben,$WS_CHILD,-1,$MAIN)
    $bild = GUICtrlCreatePic("C:\Dokumente und Einstellungen\srb\Desktop\Bildschirmschoner\Aufzug.jpg", $links, $oben, 515, 408)
    $file = "C:\Dokumente und Einstellungen\srb\Desktop\Bildschirmschoner\Aufzug.jpg"
    GUISetState()

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

    Do
    Sleep(10)
    $links = $links + 1
    $oben = $oben + 1
    WinMove($BildGui,'',$links,$oben)

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

    $zaehler = $zaehler + 1

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

    Until $zaehler > 80

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

    While 1
    $msg = GUIGetMsg()

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

    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case Else
    ;;;
    EndSelect
    WEnd
    Exit

    [/autoit]

    Mfg Spider

  • Hallo,

    vielen Dank, funktioniert auf den ersten Blick sehr gut.
    Leider weiß ich nicht, wo ich jetzt mein Bild einfügen muss...

    Gruß

  • Ja, aber da zeigt er mir kein Bild an, sondern nur einen grauen Rahmen.
    Die Bilder sind auch an dem Ort, den die GUI aufruft.

    Gruß

  • So, hier nochmal meine Version mit "Verschieben":
    Bild gibts Du ganz oben an:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>

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

    Opt("GUICloseOnESC", 1)
    Opt("MustDeclareVars", 1)

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

    Local Const $S_PICTURE = @ScriptDir & "\3IOB_2wallpaper800x600.jpg"
    Local Const $I_CHANGE = 10
    Local Const $I_GUIWIDTH = @DesktopWidth
    Local Const $I_GUIHEIGHT = @DesktopHeight
    Local Const $I_PICWIDTH = 800
    Local Const $I_PICHEIGHT = 600
    Local $i_left = 0
    Local $i_top = 0
    Local $i_counter = 0
    Local $h_scrgui = -1
    Local $h_picgui = -1
    Local $h_scrpic = -1
    Local $msg = 0

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

    $h_scrgui = GUICreate("Simple Screen Saver", $I_GUIWIDTH, $I_GUIHEIGHT, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST)
    $h_picgui = GUICreate("", $I_PICWIDTH, $I_PICHEIGHT, $i_left, $i_top, $WS_CHILD, -1, $h_scrgui)
    $h_scrpic = GUICtrlCreatePic($S_PICTURE, 0, 0, $I_PICWIDTH, $I_PICHEIGHT)

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

    GUISetBkColor(000000, $h_scrgui)
    GUISetState(@SW_SHOW, $h_scrgui)
    GUISetState(@SW_SHOW, $h_picgui)

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

    Do
    Sleep($I_CHANGE)
    $i_left += 1
    $i_top += 1
    WinMove($h_picgui, "", $i_left, $i_top)
    $i_counter += 1
    Until $i_counter >= @DesktopHeight - $I_PICHEIGHT

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

    While 1
    $msg = GUIGetMsg()

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

    If $msg == $GUI_EVENT_CLOSE Then
    ExitLoop 1
    EndIf
    WEnd
    GUIDelete($h_scrgui)
    Exit (0)

    [/autoit]

    Einmal editiert, zuletzt von teh_hahn (30. Juli 2007 um 15:15)