Photos veille - Le code

Programmation d'applications complexes
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Photos veille - Le code

Message par Le Soldat Inconnu »

Donc voilà le code de mon dernier logiciel (vous le trouverez sur mon site)

C'est un écran de veille qui permet d'afficher vos images préférées.

C'est pas trop commenté. Alors voila le principe de base :

Pour les images, je les charge en copiant le fichier image en mémoire, mais pas avec LoadImage, je les charge avec un CopyData, en gros je met le fichier en mémoire, c'est en "décompresser" le contenu (pour du jpg)
Le but est de minimiser l'e^space mémoire nécessaire, surtout si il y a beaucoup d'image.

Si je prend une image 1024*768 par exemple, si je charge avec LoadImage, ca donne 2Mo en mémoire en gros, *40 image, ouille
Tandis que si je laisse en format jpg, en bonne qualité ca donne 500ko en mémoire, j'ai diviser par 4

Donc je copie le fichier image en mémoire. Et quand j'ai besoin d'afficher l'image, j'utilise CatchImage(
Et dès que je n'ai plus besoin de l'image, je fais un FreeImage(

Voir les procedure Charger() et Decharger()


Ensuite, la partie affichage.
Pour ête fluide, l'idée est de ne JAMAIS utiliser de Sprite classique, même avec StartSpecialFX()
Cela est beaucoup trop lent comparer au Sprite3D
Si j'ai tout compris, dite moi si je dis une bétise
Le sprite classique est en mémoire normale du PC, et utilise le processeur pour s'afficher. Cela deveint vite pénalisant
tandis que le Sprite3D utilse pleinement la carte graphique et pas le processeur.
Le gain en affichage est énorme, au minimum * 4 en vitesse, juste sur des sprite sans aucun effet.
Et l'avantage avec le Sprite3D, c'est qu'un effet de transparence ou l'utilisation de Sprite avec une couche Alpha non pratiquement aucune insidence, c'est comme si on affichait un Sprite3D sans effet.
J'ai vu ça pour un jeu que j'ai commencé. L'affichage des dalles qui forme le terrain va bien plus vite avec des sprites3D qu'avec des sprite classique (j'étais rendu avec un FPS de 30 juste avec le terrain, ouille, mais avec les sprite3D, je suis a fond FPS 75Hz, avec terrain, décor, véhicule, etc ... )
Donc pour être fluide --> Sprite3D


Ensuite, les effets :
Du classique, je garde l'ancienne image en mémoire, et je charge l'image suivante.
Puis je lance mon animation avec ces deux images pour faite la transition.


L'effet le plus lent est le rectangle, j'explique.
Quand je dessine le rectanglme sur le sprite pour découper une zone dedans, Je passe avec un startDrawing, donc sur la mémoire et le processeur, et plus la carte graphique. Voila , vlan, je deviens plus lent.
Si quelqu'un a une astuces pour dessiner sur un sprite plus rapidement, je prends


Amusez vous bien.

Note : Il faut compiler sous la forme machin.scr et pas machin.exe pour tester.
UNe fois le scr créer, vous pourrez tester
Sinon, vous n'aurez que la configuration de l'écran de veille.

Code : Tout sélectionner

Structure Structure_Image
  Memoire.l
  Sprite.l
  Sprite3D.l
  Fichier.s
EndStructure

Global NewList Image.Structure_Image()
Global Ecran_X, Ecran_Y
Global Option_Image_Redim, Option_Image_Aleatoire, Option_Image_Presentation
Global Option_Temps_Effet, Option_Temps_Image
Global Option_Dossier.s
#Effet_Nombre = 5
Global Dim Option_Effet(#Effet_Nombre)
#Effet_Defilement_Nombre = 4
Global Dim Option_Effet_Defilement(#Effet_Defilement_Nombre)
#Effet_Diagonale_Nombre = 4
Global Dim Option_Effet_Diagonale(#Effet_Diagonale_Nombre)
#Effet_Rectangle_Nombre = 2
Global Dim Option_Effet_Rectangle(#Effet_Rectangle_Nombre)

UseJPEGImageDecoder()

Procedure.l LoadWindowFont(Bold = -1, Italic = -1, UnderLine = -1, Size.f = -1)
  Protected ncm.NONCLIENTMETRICS
  ncm\cbSize = SizeOf(NONCLIENTMETRICS)
  SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS, SizeOf(NONCLIENTMETRICS), @ncm, 0)
  If Bold = 0
    ncm\lfMessageFont\lfWeight = 0
  ElseIf Bold = 1
    ncm\lfMessageFont\lfWeight = 700
  EndIf
  If Italic = 0
    ncm\lfMessageFont\lfItalic = 0
  ElseIf Italic = 1
    ncm\lfMessageFont\lfItalic = 1
  EndIf
  If UnderLine = 0
    ncm\lfMessageFont\lfUnderline = 0
  ElseIf UnderLine = 1
    ncm\lfMessageFont\lfUnderline = 1
  EndIf
  If Size > 0
    ncm\lfMessageFont\lfheight * Size
  EndIf
  
  ProcedureReturn CreateFontIndirect_(@ncm\lfMessageFont)
EndProcedure


Global Langue.s
Global Dim Langue.s(100)

Declare Configuration_Sauver()
Procedure SelectLanguage()
  Protected WinID, Liste, Bouton
  WinID = OpenWindow(#PB_Any, 0, 0, 200, 63, "Langue / Language", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
  If WinID
    If CreateGadgetList(WindowID(WinID))
      Liste = ComboBoxGadget(#PB_Any, 5, 5, 190, 200)
      Bouton = ButtonGadget(#PB_Any, 5, 35, 190, 23, "OK")
      
      If ExamineDirectory(0, "Lng-Photos veille\", "*.txt")
        
        While NextDirectoryEntry(0)
          FileType = DirectoryEntryType(0)
          If FileType = 1
            AddGadgetItem(Liste, -1, RemoveString(DirectoryEntryName(0), ".txt", 1))
          EndIf
        Wend
        
        If Langue <> "Inconnu"
          Nb = CountGadgetItems(Liste)
          For n = 0 To Nb - 1
            If GetGadgetItemText(Liste, n, 0) = Langue
              SetGadgetState(Liste, n)
              Break
            EndIf
          Next
        Else
          Nb = CountGadgetItems(Liste)
          For n = 0 To Nb - 1
            If GetGadgetItemText(Liste, n, 0) = "Francais"
              SetGadgetState(Liste, n)
              Break
            EndIf
          Next
        EndIf
        
        Repeat
          Event = WaitWindowEvent()
          
          If Event = #PB_Event_Gadget
            Select EventGadget()
              Case Bouton
                If Langue <> GetGadgetText(Liste)
                  Langue = GetGadgetText(Liste)
                  Configuration_Sauver()
                  RunProgram(ProgramFilename(), "", ProgramFiledirectory()) ; on relance le programme
                  End
                Else
                  Event = #PB_Event_CloseWindow
                EndIf
            EndSelect
          EndIf
          
        Until Event = #PB_Event_CloseWindow
        
      EndIf
    EndIf
    CloseWindow(WinID)
    If Langue = "Inconnu"
      End
    EndIf
  EndIf
EndProcedure

Procedure Configuration_Langue()
  
  ; Langue
  If Langue = "Inconnu" Or FileSize("Lng-Photos veille\" + Langue + ".txt") = -1
    SelectLanguage()
  EndIf
  If ReadFile(0, "Lng-Photos veille\Francais.txt")
    Repeat
      Txt.s = ReadString(0)
      If Left(Txt, 1) <> "[" And Txt <> ""
        n = FindString(Txt, "=", 1)
        nn = Val(Left(Txt, n - 1))
        Txt = Right(Txt, Len(Txt) - n)
        If Left(Txt, 1) = "#"
          Txt = Langue(Val(Right(Txt, Len(Txt) - 1)))
        EndIf
        Langue(nn) = Txt
      EndIf
    Until Eof(0)
    CloseFile(0)
  EndIf
  If Langue <> "Francais" And ReadFile(0, "Lng-Photos veille\" + Langue + ".Txt")
    Repeat
      Txt.s = ReadString(0)
      If Left(Txt, 1) <> "[" And Txt <> ""
        n = FindString(Txt, "=", 1)
        nn = Val(Left(Txt, n - 1))
        Txt = Right(Txt, Len(Txt) - n)
        If Left(Txt, 1) = "#"
          Txt = Langue(Val(Right(Txt, Len(Txt) - 1)))
        EndIf
        If Txt <> ""
          Langue(nn) = Txt
        EndIf
      EndIf
    Until Eof(0)
    CloseFile(0)
  EndIf
  
EndProcedure

Procedure Apercu()
  
  WindowPreview = Val(ProgramParameter())
  GetClientRect_(WindowPreview, @WindowPreview_Size.RECT)
  
  If OpenWindow(0, 0, 0, WindowPreview_Size\right, WindowPreview_Size\bottom, "Photos veille", #WS_CHILD, WindowPreview) And CreateGadgetList(WindowID(0))
    SetWindowColor(0, $FFFFFF)
    
    If LoadImage(0, "Ressources\Apercu.jpg")
      If WindowPreview_Size\right < ImageWidth(0) Or WindowPreview_Size\bottom < ImageHeight(0)
        If WindowPreview_Size\right * ImageHeight(0) <= ImageWidth(0) * WindowPreview_Size\bottom
          ResizeImage(0, WindowPreview_Size\right, ImageHeight(0) * WindowPreview_Size\right / ImageWidth(0))
        Else
          ResizeImage(0, ImageWidth(0) * WindowPreview_Size\bottom / ImageHeight(0), WindowPreview_Size\bottom)
        EndIf
      EndIf
      ImageGadget(0, (WindowPreview_Size\right - ImageWidth(0)) / 2, (WindowPreview_Size\bottom - ImageHeight(0)) / 2, 0, 0, ImageID(0))
    EndIf
    
    Repeat
      Event = WaitWindowEvent(10)
      
    Until Event = #WM_CLOSE Or IsWindow_(WindowPreview) = 0
    
  EndIf
  
  End
EndProcedure

Procedure Configuration_Charger()
  
  SetCurrentDirectory(ProgramFiledirectory())
  OpenPreferences("Photos veille.ini")
  Dossier.s = ReadPreferenceString("Dossier_Programme", "")
  ClosePreferences()
  If Dossier And FileSize(Dossier) = -2
    SetCurrentDirectory(Dossier)
  EndIf
  
  OpenPreferences("Photos veille.ini")
  
  Langue = ReadPreferenceString("Langue", "Inconnu")
  
  Option_Dossier = ReadPreferenceString("Dossier_Images", "")
  
  Option_Image_Redim = ReadPreferenceLong("Image_Redim", 0)
  Option_Image_Aleatoire = ReadPreferenceLong("Image_Aleatoire", 0)
  Option_Image_Presentation = ReadPreferenceLong("Image_Presentation", 0)
  
  Option_Temps_Image = ReadPreferenceLong("Temps_Image", 3000)
  
  Option_Temps_Effet = ReadPreferenceLong("Temps_Effet", 1000)
  
  For n = 1 To #Effet_Nombre
    Option_Effet(n) = ReadPreferenceLong("Effet " + Str(n), 1)
  Next
  For n = 1 To #Effet_Defilement_Nombre
    Option_Effet_Defilement(n) = ReadPreferenceLong("Effet_Defilement " + Str(n), 1)
  Next
  For n = 1 To #Effet_Diagonale_Nombre
    Option_Effet_Diagonale(n) = ReadPreferenceLong("Effet_Diagonale " + Str(n), 1)
  Next
  For n = 1 To #Effet_Rectangle_Nombre
    Option_Effet_Rectangle(n) = ReadPreferenceLong("Effet_Rectangle " + Str(n), 1)
  Next
  
  ClosePreferences()
EndProcedure
Procedure Configuration_Sauver()
  If CreatePreferences("Photos veille.ini")
    
    WritePreferenceString("Langue", Langue)
    
    WritePreferenceString("Dossier_Images", Option_Dossier)
    
    WritePreferenceLong("Image_Redim", Option_Image_Redim)
    WritePreferenceLong("Image_Aleatoire", Option_Image_Aleatoire)
    WritePreferenceLong("Image_Presentation", Option_Image_Presentation)
    
    WritePreferenceLong("Temps_Image", Option_Temps_Image)
    
    WritePreferenceLong("Temps_Effet", Option_Temps_Effet)
    
    For n = 1 To #Effet_Nombre
      WritePreferenceLong("Effet " + Str(n), Option_Effet(n))
    Next
    For n = 1 To #Effet_Defilement_Nombre
      WritePreferenceLong("Effet_Defilement " + Str(n), Option_Effet_Defilement(n))
    Next
    For n = 1 To #Effet_Diagonale_Nombre
      WritePreferenceLong("Effet_Diagonale " + Str(n), Option_Effet_Diagonale(n))
    Next
    For n = 1 To #Effet_Rectangle_Nombre
      WritePreferenceLong("Effet_Rectangle " + Str(n), Option_Effet_Rectangle(n))
    Next
    
    ClosePreferences()
  EndIf
EndProcedure
Procedure Configuration()
  #Fenetre_B = 5
  #Fenetre_L = 300
  
  Configuration_Langue()
  
  If OpenWindow(0, 0, 0, #Fenetre_L + 2 * #Fenetre_B, 100 + 2 * #Fenetre_B, "Photos veille", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
    
    x = #Fenetre_B
    y = #Fenetre_B
    
    If LoadImage(0, "Ressources\Photos veille.jpg")
      ImageGadget(0, x, y, 0, 0, ImageID(0))
      y + #Fenetre_B + ImageHeight(0)
    EndIf
    
    Police_Gras = LoadWindowFont(1, -1, -1, 1.2)
    
    ;- Dossier des images
    Gadget = 100
    TextGadget(Gadget, x, y, #Fenetre_L, 20, Langue(1), #PB_Text_Border)
    SetGadgetFont(Gadget, Police_Gras)
    SetGadgetColor(Gadget, #PB_Gadget_FrontColor, $6C7460)
    SetGadgetColor(Gadget, #PB_Gadget_BackColor, $FFFFFF)
    y + GadgetHeight(Gadget) + #Fenetre_B
    
    Gadget = 101
    TextGadget(Gadget, x, y, #Fenetre_L, 15, Langue(2))
    y + GadgetHeight(Gadget)
    Gadget = 102
    StringGadget(Gadget, x, y, #Fenetre_L - 75, 20, Option_Dossier, #PB_String_ReadOnly)
    Gadget = 103
    ButtonGadget(Gadget, x + #Fenetre_L - 75, y, 75, 20, Langue(3))
    y + GadgetHeight(Gadget) + #Fenetre_B
    
    ;- Affichage
    Gadget = 200
    TextGadget(Gadget, x, y, #Fenetre_L, 20, Langue(4), #PB_Text_Border)
    SetGadgetFont(Gadget, Police_Gras)
    SetGadgetColor(Gadget, #PB_Gadget_FrontColor, $6C7460)
    SetGadgetColor(Gadget, #PB_Gadget_BackColor, $FFFFFF)
    y + GadgetHeight(Gadget) + #Fenetre_B
    Gadget = 201
    OptionGadget(Gadget, x, y, #Fenetre_L, 15, Langue(5))
    SetGadgetState(Gadget, 1 - Option_Image_Aleatoire)
    y + GadgetHeight(Gadget)
    Gadget = 202
    OptionGadget(Gadget, x, y, #Fenetre_L, 15, Langue(6))
    SetGadgetState(Gadget, Option_Image_Aleatoire)
    y + GadgetHeight(Gadget)
    Gadget = 203
    CheckBoxGadget(Gadget, x, y, #Fenetre_L, 15, Langue(7))
    SetGadgetState(Gadget, Option_Image_Presentation)
    y + GadgetHeight(Gadget)
    Gadget = 204
    CheckBoxGadget(Gadget, x, y, #Fenetre_L, 15, Langue(8))
    SetGadgetState(Gadget, Option_Image_Redim)
    y + GadgetHeight(Gadget) + #Fenetre_B
    Gadget = 205
    TextGadget(Gadget, x, y, #Fenetre_L, 15, Langue(9))
    y + GadgetHeight(Gadget)
    Gadget = 206
    TextGadget(Gadget, x, y, 75, 15, StrF(Option_Temps_Image / 1000, 1) +Langue(10))
    Gadget = 207
    TrackBarGadget(Gadget, x + 75, y, #Fenetre_L - 75, 25, 0, 19, #PB_TrackBar_Ticks)
    SetGadgetState(Gadget, (Option_Temps_Image - 500) / 500)
    y + GadgetHeight(Gadget) + #Fenetre_B
    Gadget = 208
    TextGadget(Gadget, x, y, #Fenetre_L, 15, Langue(11))
    y + GadgetHeight(Gadget)
    Gadget = 209
    TextGadget(Gadget, x, y, 75, 15, StrF(Option_Temps_Effet / 1000, 2) +Langue(12))
    Gadget = 210
    TrackBarGadget(Gadget, x + 75, y, #Fenetre_L - 75, 25, 0, 18, #PB_TrackBar_Ticks)
    SetGadgetState(Gadget, (Option_Temps_Effet - 250) / 250)
    y + GadgetHeight(Gadget) + #Fenetre_B
    
    ;- Effets de transition
    Gadget = 300
    TextGadget(Gadget, x, y, #Fenetre_L, 25, Langue(13), #PB_Text_Border)
    SetGadgetFont(Gadget, Police_Gras)
    SetGadgetColor(Gadget, #PB_Gadget_FrontColor, $6C7460)
    SetGadgetColor(Gadget, #PB_Gadget_BackColor, $FFFFFF)
    y + GadgetHeight(Gadget) + #Fenetre_B
    Gadget = 398
    TextGadget(Gadget, x, y, #Fenetre_L, 30, Langue(14))
    y + GadgetHeight(Gadget)
    Gadget = 399
    ScrollAreaGadget(Gadget, x, y, #Fenetre_L, 100, #Fenetre_L - 75, 100, 10, #PB_ScrollArea_Single)
      y + GadgetHeight(Gadget) + #Fenetre_B
      
      y2 = #Fenetre_B
      Gadget = 305
      CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(15))
      SetGadgetState(Gadget, Option_Effet(1))
      y2 + GadgetHeight(Gadget) + #Fenetre_B
      Gadget = 310
      CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(16))
      SetGadgetState(Gadget, Option_Effet(2))
      y2 + GadgetHeight(Gadget)
      x + 25
      Gadget = 311
      CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(17))
      SetGadgetState(Gadget, Option_Effet_Defilement(1))
      y2 + GadgetHeight(Gadget)
      Gadget = 312
      CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(18))
      SetGadgetState(Gadget, Option_Effet_Defilement(2))
      y2 + GadgetHeight(Gadget)
      Gadget = 313
      CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(19))
      SetGadgetState(Gadget, Option_Effet_Defilement(3))
      y2 + GadgetHeight(Gadget)
      Gadget = 314
      CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(20))
      SetGadgetState(Gadget, Option_Effet_Defilement(4))
      y2 + GadgetHeight(Gadget)
      x - 25
      y2 + #Fenetre_B
      Gadget = 315
      CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(21))
      SetGadgetState(Gadget, Option_Effet(3))
      y2 + GadgetHeight(Gadget) + #Fenetre_B
      Gadget = 320
      CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(22))
      SetGadgetState(Gadget, Option_Effet(4))
      y2 + GadgetHeight(Gadget)
      x + 25
      Gadget = 321
      CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(23))
      SetGadgetState(Gadget, Option_Effet_Diagonale(1))
      y2 + GadgetHeight(Gadget)
      Gadget = 322
      CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(24))
      SetGadgetState(Gadget, Option_Effet_Diagonale(2))
      y2 + GadgetHeight(Gadget)
      Gadget = 323
      CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(25))
      SetGadgetState(Gadget, Option_Effet_Diagonale(3))
      y2 + GadgetHeight(Gadget)
      Gadget = 324
      CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(26))
      SetGadgetState(Gadget, Option_Effet_Diagonale(4))
      y2 + GadgetHeight(Gadget)
      x - 25
      Gadget = 325
      CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(37))
      SetGadgetState(Gadget, Option_Effet(5))
      y2 + GadgetHeight(Gadget)
      x + 25
      Gadget = 326
      CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(38))
      SetGadgetState(Gadget, Option_Effet_Rectangle(1))
      y2 + GadgetHeight(Gadget)
      Gadget = 327
      CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(39))
      SetGadgetState(Gadget, Option_Effet_Rectangle(2))
      y2 + GadgetHeight(Gadget)
      x - 25
      y2 + #Fenetre_B
      
      SetGadgetAttribute(399, #PB_ScrollArea_InnerHeight, y2)
      
    CloseGadgetList()
    
 
    ;- Barre de boutons
    ResizeWindow(0, #PB_Ignore, WindowY(0) - (y + 25 + #Fenetre_B - WindowHeight(0)) / 2, #PB_Ignore, y + 25 + #Fenetre_B)
    Gadget = 500
    ButtonGadget(Gadget, x, y, 25, 25, Langue(27))
    x + GadgetWidth(Gadget)
    Gadget = 501
    ButtonGadget(Gadget, x, y, 75, 25, "Language")
    x + GadgetWidth(Gadget)
    x + 50
    Gadget = 502
    ButtonGadget(Gadget, x, y, 75, 25, Langue(28))
    x + GadgetWidth(Gadget)
    Gadget = 503
    ButtonGadget(Gadget, x, y, 75, 25, Langue(29), #PB_Button_Default)
    x + GadgetWidth(Gadget)
    
    
    Repeat
      Event = WaitWindowEvent()
      
      Select Event
        Case #PB_Event_Gadget
          Select EventGadget()
            Case 103
              Dossier.s = PathRequester(Langue(30), Option_Dossier)
              If Dossier
                Option_Dossier = Dossier
                SetGadgetText(102, Option_Dossier)
              EndIf
              
            Case 201, 202
              Option_Image_Aleatoire = GetGadgetState(202)
            Case 203
              Option_Image_Presentation = GetGadgetState(203)
            Case 204
              Option_Image_Redim = GetGadgetState(204)
            Case 207
              Option_Temps_Image = GetGadgetState(207) * 500 + 500
              SetGadgetText(206, StrF(Option_Temps_Image / 1000, 1) +Langue(31))
            Case 210
              Option_Temps_Effet = GetGadgetState(210) * 250 + 250
              SetGadgetText(209, StrF(Option_Temps_Effet / 1000, 2) +Langue(32))
              
            Case 305
              Option_Effet(1) = GetGadgetState(305)
            Case 310
              Option_Effet(2) = GetGadgetState(310)
              For n = 1 To #Effet_Defilement_Nombre
                Option_Effet_Defilement(n) = Option_Effet(2)
                SetGadgetState(310 + n, Option_Effet(2))
              Next
            Case 311, 312, 313, 314
              nn = 0
              For n = 1 To #Effet_Defilement_Nombre
                Option_Effet_Defilement(n) = GetGadgetState(310 + n)
                nn + Option_Effet_Defilement(n)
              Next
              If nn
                SetGadgetState(310, 1)
                Option_Effet(2) = 1
              Else
                SetGadgetState(310, 0)
                Option_Effet(2) = 0
              EndIf
            Case 315
              Option_Effet(3) = GetGadgetState(315)
            Case 320
              Option_Effet(4) = GetGadgetState(320)
              For n = 1 To #Effet_Defilement_Nombre
                Option_Effet_Diagonale(n) = Option_Effet(4)
                SetGadgetState(320 + n, Option_Effet(4))
              Next
            Case 321, 322, 323, 324
              nn = 0
              For n = 1 To #Effet_Defilement_Nombre
                Option_Effet_Diagonale(n) = GetGadgetState(320 + n)
                nn + Option_Effet_Diagonale(n)
              Next
              If nn
                SetGadgetState(320, 1)
                Option_Effet(4) = 1
              Else
                SetGadgetState(320, 0)
                Option_Effet(4) = 0
              EndIf
            Case 325
              Option_Effet(5) = GetGadgetState(325)
              For n = 1 To #Effet_Rectangle_Nombre
                Option_Effet_Rectangle(n) = Option_Effet(5)
                SetGadgetState(325 + n, Option_Effet(5))
              Next
            Case 326, 327
              nn = 0
              For n = 1 To #Effet_Rectangle_Nombre
                Option_Effet_Rectangle(n) = GetGadgetState(325 + n)
                nn + Option_Effet_Rectangle(n)
              Next
              If nn
                SetGadgetState(325, 1)
                Option_Effet(5) = 1
              Else
                SetGadgetState(325, 0)
                Option_Effet(5) = 0
              EndIf
              
            Case 500
              Licence("Photos veille", 0)
            Case 501
              SelectLanguage()
            Case 502
              Configuration_Sauver()
              RunProgram(ProgramFilename(), "/s", ProgramFiledirectory())
            Case 503
              Configuration_Sauver()
              Event = #PB_Event_CloseWindow
          EndSelect
          
          
      EndSelect
    Until Event = #PB_Event_CloseWindow
    
    If Police_Gras
      DeleteObject_(Police_Gras)
    EndIf
    
  EndIf
  End
EndProcedure

Procedure Charger(Numero.l)
  SelectElement(Image(), Numero)
  
  If Image()\Memoire = 0
    If ReadFile(0, Image()\Fichier)
      Longueur.q = Lof(0)
      Image()\Memoire = AllocateMemory(Longueur)
      ReadData(0, Image()\Memoire, Longueur)
      CloseFile(0)
    EndIf
  EndIf
  If IsSprite(Image()\Sprite) = 0
    Image = CatchImage(#PB_Any, Image()\Memoire)
    
    ;{ Traitement anti point noir
    ; Protected bmi.BITMAPINFO, bm.BITMAP, hdc
    ; GetObject_(ImageID(Image), SizeOf(BITMAP), @bm.BITMAP)
    ; 
    ; Dim ImageBits.l(bm\bmWidth * bm\bmHeight - 1)
    ; hdc = CreateCompatibleDC_(GetDC_(ImageID(Image)))
    ; If hdc
      ; 
      ; bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
      ; bmi\bmiHeader\biWidth = bm\bmWidth
      ; bmi\bmiHeader\biHeight = bm\bmHeight
      ; bmi\bmiHeader\biPlanes = 1
      ; bmi\bmiHeader\biBitCount = 32
      ; bmi\bmiHeader\biCompression = #BI_RGB
      ; 
      ; GetDIBits_(hdc, ImageID(Image), 0, bm\bmHeight, @ImageBits(), @bmi, #DIB_RGB_COLORS) ; on envoie la liste dans l'image
      ; 
      ; For x = 0 To bm\bmWidth * bm\bmHeight - 1
        ; If ImageBits(x) = 0
          ; ImageBits(x) = 1
        ; EndIf
      ; Next
      ; 
      ; SetDIBits_(hdc, ImageID(Image), 0, bm\bmHeight, @ImageBits(), @bmi, #DIB_RGB_COLORS) ; on envoie la liste dans l'image
      ; DeleteDC_(hdc)
    ; EndIf
    ;}
    
    If Option_Image_Redim Or ImageHeight(Image) > Ecran_Y Or ImageWidth(Image) > Ecran_X
      If Ecran_X * ImageHeight(Image) <= ImageWidth(Image) * Ecran_Y
        ResizeImage(Image, Ecran_X, ImageHeight(Image) * Ecran_X / ImageWidth(Image), #PB_Image_Smooth)
      Else
        ResizeImage(Image, ImageWidth(Image) * Ecran_Y / ImageHeight(Image), Ecran_Y, #PB_Image_Smooth)
      EndIf
    EndIf
    
    
    x = (Ecran_X - ImageWidth(Image)) / 2
    y = (Ecran_Y - ImageHeight(Image)) / 2
    Image()\Sprite = CreateSprite(#PB_Any, Ecran_X, Ecran_Y, #PB_Sprite_Texture)
    If StartDrawing(SpriteOutput(Image()\Sprite))
        ; Box(0, 0, Ecran_X, Ecran_Y, $010000)
        DrawImage(ImageID(Image), x, y)
      StopDrawing()
    EndIf
    FreeImage(Image)
    Image()\Sprite3D = CreateSprite3D(#PB_Any, Image()\Sprite)
    
  EndIf
  
EndProcedure
Procedure DeCharger(Numero.l)
  SelectElement(Image(), Numero)
  
  If IsSprite(Image()\Sprite)
    FreeSprite3D(Image()\Sprite3D)
    FreeSprite(Image()\Sprite)
    Image()\Sprite = 0
  EndIf
  
EndProcedure

Procedure Liberer()
  ForEach Image()
    If Image()\Memoire
      FreeMemory(Image()\Memoire)
      Image()\Memoire = 0
    EndIf
    If IsSprite(Image()\Sprite)
      FreeSprite3D(Image()\Sprite3D)
      FreeSprite(Image()\Sprite)
      Image()\Sprite = 0
    EndIf
  Next
EndProcedure

Procedure Image_Chercher(Dossier.s)
  If Right(Dossier, 1) <> "\"
    Dossier + "\"
  EndIf

  If ExamineDirectory(0, Dossier, "*.*")
    ClearList(Image())
    
    While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        Extension.s = LCase(GetExtensionPart(DirectoryEntryName(0)))
        If Extension = "jpg" Or Extension = "bmp"
          AddElement(Image())
          Image()\Fichier = Dossier + DirectoryEntryName(0)
        EndIf
      EndIf
    Wend
    
    SortStructuredList(Image(), 2, OffsetOf(Structure_Image\Fichier), #PB_Sort_String)
    
    FinishDirectory(0)
  EndIf
EndProcedure


Configuration_Charger()
Configuration_Langue()

Parametre.s = LCase(ProgramParameter())
Parametre = Left(Parametre, 2)
Select Parametre
  Case "p", "-p", "/p" ; Pour l'aperçu en petit
    Apercu()
  Case "s", "-s", "/s" ; Pour lancer normalement
    ; on continue le code
  Case "c", "-c", "/c" ; pour la configuration
    Configuration()
  Case "a", "-a", "/a" ; Mot de passe
    End ; on ne fait rien
  Case "" ; Sans aucune demande, on demande si on veut faire l'installation ou la configuration
    Configuration()
  Default ; Autre chose, on fait rien
    End
EndSelect

SystemParametersInfo_(#SPI_SCREENSAVERRUNNING, 1, @ScreenSaver, 0) 

Image_Chercher(Option_Dossier)
If CountList(Image()) = 0
  MessageRequester("Photos veille", Langue(33), 0)
  End
EndIf

Ecran_Nb = ExamineDesktops()
If Ecran_Nb
  Ecran_X = DesktopWidth(0)
  Ecran_Y = DesktopHeight(0)
  Ecran_F = DesktopFrequency(0)
  Ecran_D = DesktopDepth(0)
  For Index = 1 To Ecran_Nb - 1 ; on masque les autres écrans
    If OpenWindow(Index, DesktopX(Index), DesktopY(Index), DesktopWidth(Index), DesktopHeight(Index), "Photo veille", #PB_Window_BorderLess)
      SetWindowColor(Index, 0)
    EndIf
  Next
Else
  MessageRequester("Photos veille", Langue(34), 0)
  End
EndIf

; On ouvre l'openscreen
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSprite3D() = 0
  MessageRequester("Photos veille", Langue(35), 0)
  End
EndIf

SetRefreshRate(Ecran_F)
If OpenScreen(Ecran_X, Ecran_Y, Ecran_D, "Photos veille") = 0
  MessageRequester("Photos veille", Langue(36), 0)
  End
EndIf

Sprite3DQuality(1)
TransparentSpriteColor(#PB_Default, $FF00FF)

Souris_X_Mem = Ecran_X / 2
Souris_Y_Mem = Ecran_Y / 2
MouseLocate(Souris_X_Mem, Souris_Y_Mem)

Temps_Memoire = ElapsedMilliseconds()

If Option_Image_Presentation Or Option_Image_Aleatoire = 0
  Image = 0
Else
  Image = Random(CountList(Image()) - 1)
EndIf
Charger(Image)
If Start3D()
    SelectElement(Image(), Image)
    DisplaySprite3D(Image()\Sprite3D, 0, 0)
  Stop3D()
EndIf
FlipBuffers()

Repeat
  
  ; On lit les évènements clavier et souris
  ExamineMouse()
  ExamineKeyboard()
  
  If KeyboardReleased(#PB_Key_Left) Or KeyboardReleased(#PB_Key_Up)
    Touche_Reculer = 1
  ElseIf KeyboardReleased(#PB_Key_Right) Or KeyboardReleased(#PB_Key_Down)
    Touche_Avancer = 1
  ElseIf KeyboardReleased(#PB_Key_F1)
    Touche_Information = Touche_Information ! 1
  ElseIf KeyboardReleased(#PB_Key_All)
    Quitter = 1
  EndIf
  
  ; Position de la souris
  Souris_X = MouseX()
  Souris_Y = MouseY()
  
  Temps_Systeme = ElapsedMilliseconds()
  
  If Effet_Principal = 0 ;- Affichage de l'image normalement
    ; Ici, on n'affiche rien, on garde l'image actuelle sans la rafraichir
    
    Delay(100) ; Pour diminuer l'utilisation processeur pendant l'affichage fixe d'une image
    
    If Touche_Avancer Or Touche_Reculer
      
      If Touche_Avancer
        Image_Nouvelle = Image + 1
      Else
        Image_Nouvelle = Image - 1
      EndIf
      If Image_Nouvelle < 0
        Image_Nouvelle = CountList(Image()) - 1
      EndIf
      If Image_Nouvelle >= CountList(Image())
        Image_Nouvelle = Option_Image_Presentation
      EndIf
      
      Effet_Principal = -1
      Touche_Reculer = 0
      Touche_Avancer = 0
      
    ElseIf Temps_Systeme - Temps_Memoire > Option_Temps_Image
      
      ; Nouvelle image
      If Option_Image_Aleatoire = 0 ; Ordre alphabétique
        Image_Nouvelle = Image + 1
        If Image_Nouvelle >= CountList(Image())
          Image_Nouvelle = Option_Image_Presentation
        EndIf
      Else ; Ordre aléatoire
        Repeat 
          Image_Nouvelle = Random(CountList(Image()) - Option_Image_Presentation - 1) + Option_Image_Presentation
        Until Image_Nouvelle <> Image
      EndIf
      Charger(Image_Nouvelle)
      
      ; Choix de l'effet
      Effet_Actif = 0
      For n = 1 To #Effet_Nombre
        Effet_Actif + Option_Effet(n)
      Next
      If Effet_Actif = 0
        Effet_Principal = -1
      Else
        Effet_Actif = Random(Effet_Actif - 1) + 1
        For Effet_Principal = 1 To #Effet_Nombre
          If Option_Effet(Effet_Principal)
            Effet_Actif - 1
            If Effet_Actif = 0
              Break
            EndIf
          EndIf
        Next
      EndIf
      
      
      ; Préparation de l'effet
      Effet_Fin = 0
      Select Effet_Principal
        Case -1 ;- Aucun effet
           
        Case 1 ;- Effet de fondu
          Effet_Transparence.f = 0
          Effet_Transparence_Pas.f = 255 / Ecran_F * 1000 / Option_Temps_Effet
          
        Case 2 ;- Défilement
          ; Choix de l'effet secondaire
          Effet_Actif = 0
          For n = 1 To #Effet_Defilement_Nombre
            Effet_Actif + Option_Effet_Defilement(n)
          Next
          Effet_Actif = Random(Effet_Actif - 1) + 1
          For Effet_Secondaire = 1 To #Effet_Defilement_Nombre
            If Option_Effet_Defilement(Effet_Secondaire)
              Effet_Actif - 1
              If Effet_Actif = 0
                Break
              EndIf
            EndIf
          Next
          ; Parametre de l'effet
          Select Effet_Secondaire
            Case 1 ; Défilement vers la gauche
              Effet_Defilement.f = Ecran_X
              Effet_Defilement_Pas.f = Ecran_X / Ecran_F * 1000 / Option_Temps_Effet
            Case 2 ; Défilement vers le bas
              Effet_Defilement.f = 0
              Effet_Defilement_Pas.f = Ecran_Y / Ecran_F * 1000 / Option_Temps_Effet
            Case 3 ; Défilement vers la droite
              Effet_Defilement.f = 0
              Effet_Defilement_Pas.f = Ecran_X / Ecran_F * 1000 / Option_Temps_Effet
            Case 4 ; Défilement vers le haut
              Effet_Defilement.f = Ecran_Y
              Effet_Defilement_Pas.f = Ecran_Y / Ecran_F * 1000 / Option_Temps_Effet
          EndSelect

        Case 3 ;- Zoom
          Effet_Zoom.f = 1
          Effet_Zoom_Pas.f = 2 / Ecran_F * 1000 / Option_Temps_Effet
          Effet_Zoom_Etape = 1
          
        Case 4 ;- Diagonale
          ; Choix de l'effet secondaire
          Effet_Actif = 0
          For n = 1 To #Effet_Diagonale_Nombre
            Effet_Actif + Option_Effet_Diagonale(n)
          Next
          Effet_Actif = Random(Effet_Actif - 1) + 1
          For Effet_Secondaire = 1 To #Effet_Diagonale_Nombre
            If Option_Effet_Diagonale(Effet_Secondaire)
              Effet_Actif - 1
              If Effet_Actif = 0
                Break
              EndIf
            EndIf
          Next
          ; Parametre de l'effet
          Effet_Zoom.f = 1
          Effet_Zoom_Pas.f = 1 / Ecran_F * 1000 / Option_Temps_Effet
          
        Case 5 ;- Rectangle
          ; Choix de l'effet secondaire
          Effet_Actif = 0
          For n = 1 To #Effet_Rectangle_Nombre
            Effet_Actif + Option_Effet_Rectangle(n)
          Next
          Effet_Actif = Random(Effet_Actif - 1) + 1
          For Effet_Secondaire = 1 To #Effet_Rectangle_Nombre
            If Option_Effet_Rectangle(Effet_Secondaire)
              Effet_Actif - 1
              If Effet_Actif = 0
                Break
              EndIf
            EndIf
          Next
          ; Parametre de l'effet
          Select Effet_Secondaire
            Case 1 ; Vers l'intérieur
              Effet_Rectangle.f = 1
              Effet_Rectangle_Pas.f = 1 / Ecran_F * 1000 / Option_Temps_Effet
              SelectElement(Image(), Image)
              Effet_Rectangle_Image2 = CatchImage(#PB_Any, Image()\Memoire)
            Case 2 ; Vers l'extérieur
              Effet_Rectangle.f = 0
              Effet_Rectangle_Pas.f = 1 / Ecran_F * 1000 / Option_Temps_Effet
              SelectElement(Image(), Image_Nouvelle)
              Effet_Rectangle_Image2 = CatchImage(#PB_Any, Image()\Memoire)
          EndSelect
          If Option_Image_Redim Or ImageHeight(Effet_Rectangle_Image2) > Ecran_Y Or ImageWidth(Effet_Rectangle_Image2) > Ecran_X
            If Ecran_X * ImageHeight(Effet_Rectangle_Image2) <= ImageWidth(Effet_Rectangle_Image2) * Ecran_Y
              ResizeImage(Effet_Rectangle_Image2, Ecran_X, ImageHeight(Effet_Rectangle_Image2) * Ecran_X / ImageWidth(Effet_Rectangle_Image2), #PB_Image_Smooth)
            Else
              ResizeImage(Effet_Rectangle_Image2, ImageWidth(Effet_Rectangle_Image2) * Ecran_Y / ImageHeight(Effet_Rectangle_Image2), Ecran_Y, #PB_Image_Smooth)
            EndIf
          EndIf
          x = (Ecran_X - ImageWidth(Effet_Rectangle_Image2)) / 2
          y = (Ecran_Y - ImageHeight(Effet_Rectangle_Image2)) / 2
          Effet_Rectangle_Image = CreateImage(#PB_Any, Ecran_X, Ecran_Y)
          If StartDrawing(ImageOutput(Effet_Rectangle_Image))
              DrawImage(ImageID(Effet_Rectangle_Image2), x, y)
            StopDrawing()
          EndIf
          FreeImage(Effet_Rectangle_Image2)
          
      EndSelect
      Temps_Memoire = ElapsedMilliseconds()
      
    EndIf
    
  Else ;- Effet de transition
    ; On ne change l'affichage que pendant une transition.
    
    ClearScreen($000000)
    
    If Start3D()
        
        Select Effet_Principal
          Case -1 ;- Aucun effet
            Charger(Image_Nouvelle)
            SelectElement(Image(), Image_Nouvelle)
            DisplaySprite3D(Image()\Sprite3D, 0, 0)
            Effet_Fin = 1
            
          Case 1 ;- Effet de fondu
            Effet_Transparence + Effet_Transparence_Pas
            If Effet_Transparence >= 255
              Effet_Fin = 1
              Effet_Transparence = 255
            EndIf
            SelectElement(Image(), Image)
            DisplaySprite3D(Image()\Sprite3D, 0, 0)
            SelectElement(Image(), Image_Nouvelle)
            DisplaySprite3D(Image()\Sprite3D, 0, 0, Effet_Transparence)
            
          Case 2 ;- Defilement
            Select Effet_Secondaire
              Case 1 ; Défilement vers la gauche
                Effet_Defilement - Effet_Defilement_Pas
                If Effet_Defilement <= 0
                  Effet_Fin = 1
                  Effet_Defilement = 0
                EndIf
                SelectElement(Image(), Image)
                DisplaySprite3D(Image()\Sprite3D, Effet_Defilement - Ecran_X, 0)
                SelectElement(Image(), Image_Nouvelle)
                DisplaySprite3D(Image()\Sprite3D, Effet_Defilement, 0)
              Case 2 ; Défilement vers le bas
                Effet_Defilement + Effet_Defilement_Pas
                If Effet_Defilement >= Ecran_Y
                  Effet_Fin = 1
                  Effet_Defilement = Ecran_Y
                EndIf
                SelectElement(Image(), Image)
                DisplaySprite3D(Image()\Sprite3D, 0, Effet_Defilement)
                SelectElement(Image(), Image_Nouvelle)
                DisplaySprite3D(Image()\Sprite3D, 0, Effet_Defilement - Ecran_Y)
              Case 3 ; Défilement vers la droite
                Effet_Defilement + Effet_Defilement_Pas
                If Effet_Defilement >= Ecran_X
                  Effet_Fin = 1
                  Effet_Defilement = Ecran_X
                EndIf
                SelectElement(Image(), Image)
                DisplaySprite3D(Image()\Sprite3D, Effet_Defilement, 0)
                SelectElement(Image(), Image_Nouvelle)
                DisplaySprite3D(Image()\Sprite3D, Effet_Defilement - Ecran_X, 0)
              Case 4 ; Défilement vers le haut
                Effet_Defilement - Effet_Defilement_Pas
                If Effet_Defilement <= 0
                  Effet_Fin = 1
                  Effet_Defilement = 0
                EndIf
                SelectElement(Image(), Image)
                DisplaySprite3D(Image()\Sprite3D, 0, Effet_Defilement - Ecran_Y)
                SelectElement(Image(), Image_Nouvelle)
                DisplaySprite3D(Image()\Sprite3D, 0, Effet_Defilement)
            EndSelect
            
          Case 3 ;- Zoom
            If Effet_Zoom_Etape = 1
              SelectElement(Image(), Image)
              Effet_Zoom - Effet_Zoom_Pas
              If Effet_Zoom <= 0
                Effet_Zoom_Etape = 2
                Effet_Zoom = 0
              Else
                ZoomSprite3D(Image()\Sprite3D, Ecran_X * Effet_Zoom, Ecran_Y * Effet_Zoom)
                DisplaySprite3D(Image()\Sprite3D, Ecran_X * (1 - Effet_Zoom) / 2, Ecran_Y * (1 - Effet_Zoom) / 2)
              EndIf
            Else
              SelectElement(Image(), Image_Nouvelle)
              Effet_Zoom + Effet_Zoom_Pas
              If Effet_Zoom >= 1
                Effet_Zoom_Etape = 2
                Effet_Zoom = 1
                Effet_Fin = 1
                ZoomSprite3D(Image()\Sprite3D, Ecran_X, Ecran_Y)
                DisplaySprite3D(Image()\Sprite3D, 0, 0)
              Else
                ZoomSprite3D(Image()\Sprite3D, Ecran_X * Effet_Zoom, Ecran_Y * Effet_Zoom)
                DisplaySprite3D(Image()\Sprite3D, Ecran_X * (1 - Effet_Zoom) / 2, Ecran_Y * (1 - Effet_Zoom) / 2)
              EndIf
            EndIf
            
          Case 4 ;- Diagonale
            Select Effet_Secondaire
              Case 1 ; Haut gauche vers bas droit
                Effet_Zoom - Effet_Zoom_Pas
                If Effet_Zoom <= 0
                  Effet_Zoom = 0
                  Effet_Fin = 1
                  SelectElement(Image(), Image_Nouvelle)
                  ZoomSprite3D(Image()\Sprite3D, Ecran_X, Ecran_Y)
                  DisplaySprite3D(Image()\Sprite3D, 0, 0)
                Else
                  SelectElement(Image(), Image_Nouvelle)
                  ZoomSprite3D(Image()\Sprite3D, Ecran_X * (1 - Effet_Zoom), Ecran_Y * (1 - Effet_Zoom))
                  DisplaySprite3D(Image()\Sprite3D, 0, 0)
                  SelectElement(Image(), Image)
                  ZoomSprite3D(Image()\Sprite3D, Ecran_X * Effet_Zoom, Ecran_Y * Effet_Zoom)
                  DisplaySprite3D(Image()\Sprite3D, Ecran_X * (1 - Effet_Zoom), Ecran_Y * (1 - Effet_Zoom))
                EndIf
              Case 2 ; Bas gauche vers haut droit
                Effet_Zoom - Effet_Zoom_Pas
                If Effet_Zoom <= 0
                  Effet_Zoom = 0
                  Effet_Fin = 1
                  SelectElement(Image(), Image_Nouvelle)
                  ZoomSprite3D(Image()\Sprite3D, Ecran_X, Ecran_Y)
                  DisplaySprite3D(Image()\Sprite3D, 0, 0)
                Else
                  SelectElement(Image(), Image_Nouvelle)
                  ZoomSprite3D(Image()\Sprite3D, Ecran_X * (1 - Effet_Zoom), Ecran_Y * (1 - Effet_Zoom))
                  DisplaySprite3D(Image()\Sprite3D, Ecran_X * Effet_Zoom, 0)
                  SelectElement(Image(), Image)
                  ZoomSprite3D(Image()\Sprite3D, Ecran_X * Effet_Zoom, Ecran_Y * Effet_Zoom)
                  DisplaySprite3D(Image()\Sprite3D, 0, Ecran_Y * (1 - Effet_Zoom))
                EndIf
              Case 3 ; Haut droit vers bas gauche
                Effet_Zoom - Effet_Zoom_Pas
                If Effet_Zoom <= 0
                  Effet_Zoom = 0
                  Effet_Fin = 1
                  SelectElement(Image(), Image_Nouvelle)
                  ZoomSprite3D(Image()\Sprite3D, Ecran_X, Ecran_Y)
                  DisplaySprite3D(Image()\Sprite3D, 0, 0)
                Else
                  SelectElement(Image(), Image_Nouvelle)
                  ZoomSprite3D(Image()\Sprite3D, Ecran_X * (1 - Effet_Zoom), Ecran_Y * (1 - Effet_Zoom))
                  DisplaySprite3D(Image()\Sprite3D, 0, Ecran_Y * Effet_Zoom)
                  SelectElement(Image(), Image)
                  ZoomSprite3D(Image()\Sprite3D, Ecran_X * Effet_Zoom, Ecran_Y * Effet_Zoom)
                  DisplaySprite3D(Image()\Sprite3D, Ecran_X * (1 - Effet_Zoom), 0)
                EndIf
              Case 4 ; Bas droit vers haut gauche
                Effet_Zoom - Effet_Zoom_Pas
                If Effet_Zoom <= 0
                  Effet_Zoom = 0
                  Effet_Fin = 1
                  SelectElement(Image(), Image_Nouvelle)
                  ZoomSprite3D(Image()\Sprite3D, Ecran_X, Ecran_Y)
                  DisplaySprite3D(Image()\Sprite3D, 0, 0)
                Else
                  SelectElement(Image(), Image_Nouvelle)
                  ZoomSprite3D(Image()\Sprite3D, Ecran_X * (1 - Effet_Zoom), Ecran_Y * (1 - Effet_Zoom))
                  DisplaySprite3D(Image()\Sprite3D, Ecran_X * Effet_Zoom, Ecran_Y * Effet_Zoom)
                  SelectElement(Image(), Image)
                  ZoomSprite3D(Image()\Sprite3D, Ecran_X * Effet_Zoom, Ecran_Y * Effet_Zoom)
                  DisplaySprite3D(Image()\Sprite3D, 0, 0)
                EndIf
            EndSelect
            
          Case 5 ;- Rectangle
            If IsSprite(Effet_Rectangle_Sprite)
              FreeSprite3D(Effet_Rectangle_Sprite3D)
              FreeSprite(Effet_Rectangle_Sprite)
            EndIf
            Select Effet_Secondaire
              Case 1 ; Vers l'intérieur
                Effet_Rectangle - Effet_Rectangle_Pas
                If Effet_Rectangle <= 0
                  Effet_Fin = 1
                  SelectElement(Image(), Image_Nouvelle)
                  DisplaySprite3D(Image()\Sprite3D, 0, 0)
                  FreeImage(Effet_Rectangle_Image)
                Else
                  SelectElement(Image(), Image_Nouvelle)
                  Effet_Rectangle_X = Ecran_X * (1 - Effet_Rectangle) / 2
                  Effet_Rectangle_Y = Ecran_Y * (1 - Effet_Rectangle) / 2
                  Effet_Rectangle_L = Ecran_X * Effet_Rectangle
                  Effet_Rectangle_H = Ecran_Y * Effet_Rectangle
                  Effet_Rectangle_Image2 = GrabImage(Effet_Rectangle_Image, #PB_Any, Effet_Rectangle_X, Effet_Rectangle_Y, Effet_Rectangle_L, Effet_Rectangle_H)
                  Effet_Rectangle_Sprite = CopySprite(Image()\Sprite, #PB_Any, #PB_Sprite_Texture)
                  If StartDrawing(SpriteOutput(Effet_Rectangle_Sprite))
                      DrawImage(ImageID(Effet_Rectangle_Image2), Effet_Rectangle_X, Effet_Rectangle_Y)
                    StopDrawing()
                  EndIf
                  FreeImage(Effet_Rectangle_Image2)
                  Effet_Rectangle_Sprite3D = CreateSprite3D(#PB_Any, Effet_Rectangle_Sprite)
                  DisplaySprite3D(Effet_Rectangle_Sprite3D, 0, 0)
                EndIf
              Case 2 ; Vers l'extérieur
                Effet_Rectangle + Effet_Rectangle_Pas
                If Effet_Rectangle >= 1
                  Effet_Fin = 1
                  SelectElement(Image(), Image_Nouvelle)
                  DisplaySprite3D(Image()\Sprite3D, 0, 0)
                  FreeImage(Effet_Rectangle_Image)
                Else
                  SelectElement(Image(), Image)
                  Effet_Rectangle_X = Ecran_X * (1 - Effet_Rectangle) / 2
                  Effet_Rectangle_Y = Ecran_Y * (1 - Effet_Rectangle) / 2
                  Effet_Rectangle_L = Ecran_X * Effet_Rectangle
                  Effet_Rectangle_H = Ecran_Y * Effet_Rectangle
                  Effet_Rectangle_Image2 = GrabImage(Effet_Rectangle_Image, #PB_Any, Effet_Rectangle_X, Effet_Rectangle_Y, Effet_Rectangle_L, Effet_Rectangle_H)
                  Effet_Rectangle_Sprite = CopySprite(Image()\Sprite, #PB_Any, #PB_Sprite_Texture)
                  If StartDrawing(SpriteOutput(Effet_Rectangle_Sprite))
                      DrawImage(ImageID(Effet_Rectangle_Image2), Effet_Rectangle_X, Effet_Rectangle_Y)
                    StopDrawing()
                  EndIf
                  FreeImage(Effet_Rectangle_Image2)
                  Effet_Rectangle_Sprite3D = CreateSprite3D(#PB_Any, Effet_Rectangle_Sprite)
                  DisplaySprite3D(Effet_Rectangle_Sprite3D, 0, 0)
                EndIf
            EndSelect
        EndSelect
        
      Stop3D()
    EndIf
    
    If Touche_Information
      Information_NombreImage + 1
      If Effet_Fin
        StartDrawing(ScreenOutput())
          DrawText(0, 0, "FPS = " + StrF(Information_NombreImage*1000/(Temps_Systeme - Temps_Memoire), 1))
          Information_NombreImage = 0
        StopDrawing()
      EndIf
    EndIf
    
    If Effet_Fin
      DeCharger(Image)
      Temps_Memoire = Temps_Systeme
      Effet_Principal = 0
      Image = Image_Nouvelle
    EndIf
    
    FlipBuffers(1)
    
  EndIf
  
  If IsScreenActive() = 0
    Quitter = 1
  EndIf
  If Abs(Souris_X - Souris_X_Mem) > 50 Or Abs(Souris_Y - Souris_Y_Mem) > 50 Or MouseButton(#PB_MouseButton_Left) Or MouseButton(#PB_MouseButton_Right)
    Quitter = 1
  EndIf
  
Until Quitter

Liberer()

SystemParametersInfo_(#SPI_SCREENSAVERRUNNING, 0, @ScreenSaver, 0) 
Dernière modification par Le Soldat Inconnu le sam. 31/janv./2009 19:26, modifié 5 fois.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

J'ai des problèmes avec ProgramFiledirectory() et Licence(...), connait pas !!??
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

arf, je corrige :)
Ce sont des libs

Oublié des bouts, le code est mis à jour

Sinon, petite précision sur ce bout de code dans Configuration_Charger()

Code : Tout sélectionner

SetCurrentDirectory(GetPathPart(ProgramFilename())) 
  OpenPreferences("Photos veille.ini") 
  Dossier.s = ReadPreferenceString("Dossier_Programme", "") 
  ClosePreferences() 
  If Dossier And FileSize(Dossier) = -2 
    SetCurrentDirectory(Dossier) 
  EndIf 
C'est pour avoir le dossier du programme.

Un écran de veille se place dans c:\Windows ou c:\windows\system32\
Mon installation se fait dans un dossier c:\program files\Photos veille\
Donc je dois donner comme dossier de travail c:\program files\Photos veille\

Voila comment je fais
Je mets un fichier *.ini avec le *.scr dans c:\windows
le dossier de travail est le meme que celui ou se trouve le programme pour le moment
donc je force le dossier de travail
SetCurrentDirectory(GetPathPart(ProgramFilename()))
je lis le *.ini et je récupère l'adresse du dossier du programme
si le *.ini existe, je change le dossier de travail par celui lu dans le *.ini
Sinon, je garde le dossier actuel (quand je l'install pas, les fichier du *.scr sont avec le *.scr, c'est dans ce cas que je ne change pas car le *.ini ne contient pas de nouveau dossier de travail)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Ligne 399 RunProgram(ProgramFilename(), "/s", ProgramFiledirectory())
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

ouin :cry:
Cette fois, ça doit être bon, j'ai viré toutes mes libs et j'arrive à compiler chez moi :roll:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Message par venom »

ne t'inquiète pas Le Soldat Inconnu sa tourne parfaitement chez moi avec purebasic 4.10 et sans aucune lib's :D .
bien jouer pour les défilement sa rend bien. Encore et toujours du bon travaille de ta part :wink:






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Je l'ai testé et c'est vrai que les transitions sont parfaites comparés à l'album de window, beau boulot.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@LSI

Pour les rectangles, je n'ai pas trop saisi. Mais bon, si tu veux jouer avec des rectangles, découpe chaque image en petits carrés au préalable. ça te permet de nombreux effets supplémentaires.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Ah oui, pas bête :D plutot que dessiner un rectangle mauve pour ne pas affiher une partie, découper le sprite en plusieurs morceaux.
A tester, ca ira peut-êtr plus vite que le Box(...)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Sinon, j'ai l'impression que ton code ne soit pas adapté à un OS inférieur à XP, surtout dans le cas où l'écran de veille soit protégé par un code, il faut dans ce cas que ton programme gère la boite du mot de passe etc...

Un lien qui explique ici:
http://nono40.developpez.com/tutoriel/d ... reensaver/

Un exemple aussi sur Purearea avec le preview dans la fenêtre de window:
http://www.purearea.net/pb/CodeArchiv/O ... enSaver.pb
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

le mot de passe, hum, oui je m'en passe :lol:

Franchement, le mot passe passe à la trappe et ca me va très bien, pas envie de me casser la tête avec ça. c'est pas le but :oops: :lol:

j'ai juste modifier mon code pour bien prendre en compte tous les paramètres possible pour un écran de veille.
et pour le mode de passe, il ne se passe rien.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Excellent code LSI :P
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Correction du code au niveau de la lecture des paramètres de lancement
il faut garder uniquement les 2 premiers caractères parceque, dans l'onglet "ecran de veille" des propriétés de l'affichage, au lieu d'envoyer en param /c, ca envois un truc du genre /c:14561654
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Correction du code pour l'effet "Rectangle"
Marchait pas sous ma nouvelle carte graphique (je suis passé de NVidia à ATI, ben ATI, c'est plus sensible niveau format des sprites)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
fred38
Messages : 4
Inscription : lun. 04/mai/2009 17:17

Message par fred38 »

j'arrive pas a compiler
je fait 1 copier coller du source et il me trouve pas le compilo
peut tu lsi mettre un lien avec le fichier source compilable
merci
Répondre