Écran de veille - Diaporamma

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Écran de veille - Diaporamma

Message par Guimauve »

Je viens de terminer la programmation d'un écran de veille. Il affiche les images bmp et jpeg d'un répertoire sélectionné à un interval régulier.

A+
Guimauve

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; PureBasic Screensaver template -
; Nom de l'écran de veille : Diaporamma
; Programmation : Version 1.0
; Programmé par : Guimauve
; Date : 28 décembre 2004
; Codé avec PureBasic V3.92
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Écran de veille qui affiche les images bmp et jpeg d'un répertoire sélectionné comme un 
; diaporamma.
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Déclaration des procédures

Declare ChargementImages(Repertoire$)
Declare CreateINI(Fichier$, Repertoire$, delais.l)
Declare SpinLong(No.l, mini.l, maxi.l, increment.l)
Declare OnlyOneSCRStop()
Declare OnlyOneSCRStart(Name$)
Declare InitScreenSaver(ScreenSaverName$, ScrWidth.w, ScrHeight.w, ScrDepth.w)

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Constantes, Variables, Structure, Création des Tableaux, etc.

Enumeration
     
     #Scr_Win_Param
     
     #Txt_version
     #String_Repertoire
     #Txt_delais
     #String_delais
     #TrackBar_Delais
     #Btn_Parcourir
     #Btn_ok
     #Btn_cancel
     
EndEnumeration

ScreenSaverName$ = "Diaporamma"
ScreenSaverVersion$ = "Version 1.0"

ScreenW = GetSystemMetrics_(#SM_CXSCREEN)
ScreenH = GetSystemMetrics_(#SM_CYSCREEN)
ScreenD = 32

UseJPEGImageDecoder()

NewList ListeImages.s()

; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Programme principale
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

OnlyOneSCRStart(ScreenSaverName$)

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; On regarde quel paramètre à été donné au programme

FirstParam$ = ProgramParameter()
command$ = LCase(Left(ReplaceString(FirstParam$, "-", "/"), 2))
ParentWindow.l = Val(StringField(FirstParam$, 2, ":")) | Val(ProgramParameter())

; Le fichier ini n'existe pas, créer celui par défaut
If FileSize(ScreenSaverName$ + ".ini") = -1
     CreateINI(ScreenSaverName$ + ".ini", "", 250)
EndIf

OpenPreferences(ScreenSaverName$ + ".ini")
     Repertoire_a_Charger$ = ReadPreferenceString("Répertoire d'images", "")
     delais.l = ReadPreferenceLong("Délais entre les images", 250)
ClosePreferences()

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; L'écran de veille, le scr est lancé avec /s comme paramètre

Select command$
          
     Case "/s"
          
          InitScreenSaver(ScreenSaverName$, ScreenW, ScreenH, ScreenD)
          GetCursorPos_(SourisOrigine.POINT)
          ShowCursor_(0)
          
          ChargementImages(Repertoire_a_Charger$)
          sprite_no.l = 0
          Repeat
               
               FlipBuffers()
               ClearScreen(0, 0, 0)
               
               ; <><><><><><><><><><><><><><><><><><><><><><><><><><><>
               ; Mettre ici le code de ce que l'on veut voir à l'écran
               ; Code
               ; <><><><><><><><><><><><><><><><><><><><><><><><><><><>
               largeur.w = SpriteWidth(sprite_no)
               hauteur.w = SpriteHeight(sprite_no)
               If largeur <> ScreenW
                    x = (ScreenW - largeur) / 2
               Else
                    x = 0
               EndIf
               
               If hauteur <> ScreenH
                    y = (ScreenH - hauteur) / 2
               Else
                    y = 0
               EndIf
               
               DisplaySprite(sprite_no, x, y)
               
               ; StartDrawing(ScreenOutput())
               ; Locate(5, 5)
               ; FrontColor(100, 15, 175)
               ; DrawingMode(1)
               ; DrawText("Image no : " + Str(sprite_no + 1) )
               ; StopDrawing()
                   
               If frame = delais
                    sprite_no = SpinLong(sprite_no, 0, CountList(ListeImages()) - 1, 1)
                    frame = 0
               EndIf
               
               ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
               ; On vérifie si l'utilisateur touche au clavier ou à la souris
               GetCursorPos_(Souris.POINT)
               ExamineKeyboard()
               
               Frame + 1
               
          Until KeyboardPushed(#PB_Key_All) > 0 Or Souris\x <> SourisOrigine\x Or Souris\y <> SourisOrigine\y ; WindowEvent() = #PB_Event_CloseWindow Or
          
          
          
          ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
          ; Fenètre de paramétrage de l'écran de veille
          
     Case "/c"
          
          If OpenWindow(#Scr_Win_Param, 0, 0, 300, 225, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, ScreenSaverName$) <> 0
               
               If CreateGadgetList(WindowID(#Scr_Win_Param)) <> 0
                    
                    StringGadget(#String_Repertoire, 5, 5, 290, 20, Repertoire_a_Charger$)
                    ButtonGadget(#Btn_Parcourir, 5, 30, 290, 25, "Choisir un répertoire d'images")
                    TextGadget(#Txt_delais, 5, 60, 145, 20, "Délais entre les images :", #PB_Text_Center)
                    StringGadget(#String_delais, 150, 60, 145, 20, Str(delais), #PB_String_ReadOnly)
                    TrackBarGadget(#TrackBar_Delais, 5, 85, 290, 20, 25, 1000)
                    TextGadget(#Txt_version, 10, 200, 150, 20, ScreenSaverVersion$)
                    ButtonGadget(#Btn_ok, 130, 195, 75, 25, "Ok")
                    ButtonGadget(#Btn_cancel, 215, 195, 75, 25, "Cancel")
                    
               EndIf
               
               SetGadgetState(#TrackBar_Delais, delais)
               
               Repeat
                    
                    EventID.l = WaitWindowEvent()
                    
                    If EventID = #PB_EventGadget
                         Select EventGadgetID()
                                   
                              Case #TrackBar_Delais
                                   SetGadgetText(#String_delais, Str(GetGadgetState(#TrackBar_Delais)))
                                   
                              Case #Btn_Parcourir
                                   Nouveaurepertoire$ = PathRequester("Choisir un répertoire d'images", Repertoire_a_Charger$)
                                   
                                   If Nouveaurepertoire$ <> Repertoire_a_Charger$
                                        Repertoire_a_Charger$ = Nouveaurepertoire$
                                        SetGadgetText(#String_Repertoire,Repertoire_a_Charger$)
                                   EndIf
                                   
                              Case #Btn_ok
                                   CreateINI(ScreenSaverName$ + ".ini", Repertoire_a_Charger$, Val(GetGadgetText(#String_delais)))
                                   EventID = #PB_EventCloseWindow
                                   
                              Case #Btn_cancel
                                   EventID = #PB_EventCloseWindow
                                   
                         EndSelect
                    EndIf
                    
               Until EventID = #PB_EventCloseWindow
               
          EndIf
          
          
          ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
          ; Code pour l'affichage de l'aperçu
          
     Case "/p"
          End
          
EndSelect


OnlyOneSCRStop()

End



; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; <<<<<<<<<<<<<<<<<<<<<<<<<<<< Procédures Secondaires >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


Procedure ChargementImages(Repertoire$)
     
     If ExamineDirectory(0, Repertoire$, "*.bmp") <> 0
          While NextDirectoryEntry() <> 0
               Nom_de_fichier$ = DirectoryEntryName()
               If Left(Nom_de_fichier$, 1) <> "."
                    AddElement(ListeImages())
                    ListeImages() = Nom_de_fichier$
               EndIf
          Wend
     EndIf
     
     If ExamineDirectory(0, Repertoire$, "*.jpg") <> 0
          While NextDirectoryEntry() <> 0
               Nom_de_fichier$ = DirectoryEntryName()
               If Left(Nom_de_fichier$, 1) <> "."
                    AddElement(ListeImages())
                    ListeImages() = Nom_de_fichier$
               EndIf
          Wend
     EndIf
     
     ForEach ListeImages()
          LoadSprite(index, Repertoire$ + "\" + ListeImages())
          index + 1
     Next
     
EndProcedure

; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Procedure CreateINI(Fichier$, Repertoire$, delais.l)
     
     CreatePreferences(Fichier$)
          WritePreferenceString("Répertoire d'images", Repertoire$)
          WritePreferenceLong("Délais entre les images", delais)
     ClosePreferences()
     
EndProcedure

; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Procedure.l SpinLong(No.l, mini.l, maxi.l, increment.l)
     
     No + increment
     
     If No > maxi
          No = mini
     EndIf
     
     If No < mini
          No = Maxi
     EndIf
     
     ProcedureReturn No
     
EndProcedure


Procedure OnlyOneSCRStart(Name$)
     Shared OnlyOneStartMutex.l
     OnlyOneStartMutex = CreateMutex_(0, 1, Name$)
     OnlyOneStartError.l = GetLastError_()
     If OnlyOneStartMutex <> 0 And OnlyOneStartError = 0
          ProcedureReturn 1
     Else
          CloseHandle_(OnlyOneStartMutex)
          End
     EndIf
EndProcedure

Procedure OnlyOneSCRStop()
     CloseHandle_(OnlyOneStartMutex)
EndProcedure

Procedure InitScreenSaver(ScreenSaverName$, ScrWidth.w, ScrHeight.w, ScrDepth.w)
     
     ; Initialisation des sprites et du clavier.
     If InitSprite() = 0 Or InitKeyboard() = 0
          MessageRequester("Error", "Can't open DirectX 7 Or later", 0)
          End
     EndIf
     
     ; Ouverture du screen
     If OpenScreen(ScrWidth, ScrHeight, ScrDepth, ScreenSaverName$) = 0
          MessageRequester("Error", "Can't open a screen !", 0)
          End
     EndIf
     
EndProcedure