Créer une galerie d'images simplement

Programmation d'applications complexes
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Créer une galerie d'images simplement

Message par Jacobus »

Bonjour,
je vous propose un programme permettant de créer facilement une galerie d'images et de les visionner. Il existe déjà des applications et des codes du genre, mais ici j'ai privilégié l'utilisation d'un PanelGadget() et ImageGadget() pour afficher les imagettes pour afficher les images vues et une galerie principale où les images sont affichées simplement dans des ImageGadget(). Cela permet plus de possibilités de gestion des actions/évènements.

Code : Tout sélectionner

;-Entête
;{
;=================================
; Create an image gallery simply 
; Committed by Jacobus, 2024/11/15
; With the involuntary complicity of Wilbert, Sparkie, Oryaaaaa, And LSI
; --------------------------------
; updated code : 2025/04/24
; --------------------------------
; FEATURES / FONCTIONNALITES:
; --------------------------------
; - Double-left-clicking on an image displays it in the viewing area / un double clic gauche sur une image l'affiche dans la zone de visualisation
; - Right-clicking on an image in the gallery displays a context menu / un clic droit sur une image de la galerie affiche un menu contextuel
;
; - [Amended] : The limit of 100 images uploaded to the gallery has been increased to approximately 400 by reducing the size of the thumbnails
;               La limite de 100 images chargées dans la galerie a été augmentée à plus ou moins 400 en réduisant la taille des imagettes
;
; - [Amended] : Each image loaded into the gallery (left) is displayed in an "ImageGadget()"
;               Chaque image chargée dans la galerie (à gauche) est affichée dans un « ImageGadget() »
;
; - [Amended] : Removed empty space from gallery scrollarea which was initial space when window was created and not used when loading images.
;               Suppression de l'espace vide de la scrollarea de la galerie qui était l'espace initial lors de la création de la fenêtre et non utilisé lors du chargement des images.
;
; - [Added] : A progress bar has been added to show the loading of images in the gallery
;             Une barre de progression a été ajoutée permettant de matérialiser le chargement des images dans la galerie
;
; - [Added] : Each gallery image that is opened and displayed in the central area is also displayed in a thumbnail on the right, along with its information, in a PanelGadget(). These are defined as recently viewed/opened images.
;             It is then possible to open the image in your default viewer from this thumbnail or to remove the thumbnail and associated gadgets from the list.
;             Chaque image de la galerie qui est ouverte et affichée dans la zone centrale, est également affichée dans une imagette à droite, avec ses informations, dans un PanelGadget(). Elles sont définies comme images récemment vues/ouvertes.
;             Il est alors possible d'ouvrir l'image dans votre visionneuse par défaut depuis cette imagette ou de supprimer l'imagette et les gadgets associés de la liste.
;
; - [Added] : In addition to the Exif data, basic information such as size, weight and dates of each displayed image is added.
;             En plus des données Exif, sont ajoutées les informations de base telles que taille, poids et dates, de chaque image affichées.
;
; - [Added] : If an image displayed in the viewing area is later reopened, it is not recreated as the image viewed in the right gallery. This prevents duplicates in recently viewed images.
;             Si une image affichée dans la zone de visualisation est rouverte ultérieurement, elle n'est pas recréée comme image vue dans la galerie de droite. Cela évite les doublons dans les images vues récemment.
;
; - [Added] : Each recently viewed image can be reopened by double-left-clicking on it.
;             Chaque image récemment visualisée peut être rouverte en double-cliquant dessus avec le bouton gauche de la souris.
; --------------------------------
; Errors found and not solved:
; --------------------------------
; 1/Using a 'thread' to load the gallery means that after loading, which is done correctly, all the images/panel disappear ??
; --------------------------------
; Since gadgets should not be created in a Thread, the main window is disabled while images are loading. 
; This means that you should Not move the window during loading To avoid freezing it. 
; If the window freezes, this will have no effect on loading, which will Continue To happen.
;
; Puisqu'il ne faut pas créer de gadgets dans un Thread, la fenêtre principale est désactivée pendant le chargement des images. 
; Cela implique de ne pas déplacer la fenêtre pendant le chargement pour ne pas la figer. 
; Si malgré tout la fenêtre se fige, cela reste sans conséquence sur le chargement qui Continue néanmoins à se faire.
; --------------------------------
; 2/If hundreds of images are loaded into the gallery, the last ones in the series are not displayed correctly in the scrollarea.
; --------------------------------
; The problem is partially solved by reducing the number of thumbnails created when loading the gallery
;
; Le problème est partiellement résolu par la réduction des imagettes créées lors du chargement de la galerie
;}
;=================================
;-ImagePlugin
UseJPEGImageDecoder() 
UseJPEGImageEncoder()
UseTGAImageDecoder() 
UsePNGImageDecoder()
UsePNGImageEncoder() 
UseTIFFImageDecoder()
UseGIFImageDecoder()

;-CONSTANTES
Enumeration
  #WinViewer
EndEnumeration

Enumeration
  ;{
  #PhotoLoad 
  #DirectoryImages
  #Photo
  #ReadExif
  #RedimImage
  
  #Txt_scroll_Galerie
  #scroll_Galerie
  
  #Txt_scroll_image
  #scroll_image
  #PhotoView
  
  #Txt_scroll_Viewed
  #scroll_Viewed
  
  #LoadingProgress
  
  ;-ToolBarMain
  #ToolBarMain 
  #Tbar_btn_OpenFolder
  #Tbar_btn_CloseImage
  #Tbar_btn_Redim
  #Tbar_btn_ActualSize
  #Tbar_btn_ZoomIn
  #Tbar_btn_ZoomOut
  #Tbar_btn_ZoomPercent
  ;-PopUpMenu Sizes
  #MenuSizes
  #Menu_SizeDiv2
  #Menu_SizeDiv4
  #Menu_SizeDiv6
  #Menu_SizeDiv8
  #Menu_SizeMult2
  #Menu_SizeMult4
  #Menu_SizeMult6
  #Menu_SizeMult8
  
  #MenuPercentZoom
   #ZoomIn_10
   #ZoomIn_20
   #ZoomIn_30
   #ZoomIn_40
   #ZoomIn_50
   #ZoomIn_60
   #ZoomIn_70
   #ZoomIn_80
   #ZoomIn_90    
   #ZoomIn_100
   #ZoomIn_120
   #ZoomIn_140
   #ZoomIn_150
   #ZoomIn_160
   #ZoomIn_180
   #ZoomIn_200
   #ZoomIn_220
   #ZoomIn_240
   #ZoomIn_260
   #ZoomIn_280
   #ZoomIn_300
   #ZoomIn_320
   #ZoomIn_340
   #ZoomIn_360
   #ZoomIn_380
   #ZoomIn_400
   
   #ZoomOut_10
   #ZoomOut_20
   #ZoomOut_30
   #ZoomOut_40
   #ZoomOut_50
   #ZoomOut_60
   #ZoomOut_70
   #ZoomOut_80
   #ZoomOut_90
  
  ;-PopUp ActualSize
  #PopUp_ActualSize
  #DisplaySizeImage
  #DisplayActualSize
  ;-PopUp Galery
  #PopUp_Galerie
  #Menu_Galerie_OpenFile
  #Menu_Galerie_FileProperty
  
  #StatusViewer
  ;}
EndEnumeration

;-===============================
;-VARIABLES
Global Quitter = 0
Global BackColor = RGB(86, 96, 101)
Global ForeColor = RGB(222, 205, 62)
Global FontID1   = LoadFont(0, "Bahnschrift Semibold Condensed", 10,#PB_Font_HighQuality)
Global ChInitial$

Global yImg.l = 2     ; scrollarea gallery
Global PosyImg.l = 2  ; scrollarea recently viewed

;Determines the current directory without error
Global curdir.s, AppliDir$
curdir.s = Space(#MAX_PATH)
GetModuleFileName_(GetModuleHandle_(0), @curdir, #MAX_PATH)
AppliDir$ = GetPathPart(curdir)

; Global ThreadGalerie.l = 0, EndThreadGalerie.l = 0     ; à décommenter/commenter en cas d'utilisation ou non d'un thread
Global ImagesDir$
Global ImageName$
Global NomPhoto$, PhotoGalerie$
Global Result_Photo
Global mult.f = 1.0

;-DPI
;Necessary for large screens
CompilerIf #PB_Compiler_DPIAware = 1
  
  Global dpix.d = DesktopResolutionX()
  Global dpiy.d = DesktopResolutionY()
  
CompilerElse
  
  Global dpix.d = 1.00
  Global dpiy.d = 1.00
  
CompilerEndIf

;-===============================
;-DONNEES EXIF
;Endian procs by wilbert
;Original code by Sparkie
;Modif GetCameraModel by oryaaaaa
Procedure.w xchEndianW(e.w) 
  ProcedureReturn (e & $FF) << 8 + (e >> 8) & $FF 
EndProcedure 
Procedure xchEndianL(e.i) 
  ProcedureReturn (e & $FF) << 24 + (e & $FF00) << 8 + (e >> 8) & $FF00 + (e >> 24) & $FF 
EndProcedure 
Procedure GetCameraModel(imageAdress.i,ExifEditor.i) 
  Protected OffsetField.i = imageAdress +3 
  Protected Header.b, wordOrder.i, tifFormat.i, ifd1.i, nFields.i, currentTag.i, flg.b 
  Protected fieldType.i, fieldLength.i, fieldValue.i, currentloc.i, cam$ 
  If PeekB(OffsetField) &$FF = $E1 
    Header = 12 
  Else 
    Header = 30 
  EndIf 
  OffsetField = imageAdress + Header 
  wordOrder = PeekW(OffsetField) 
  OffsetField + 2 
  If wordOrder = $4949 Or wordOrder = $4D4D 
    If wordOrder = $4949 
      tifFormat = PeekW(OffsetField) 
    Else 
      tifFormat = xchEndianW(PeekW(OffsetField)) 
    EndIf 
    OffsetField + 2 
    If tifFormat = $2A 
      If wordOrder = $4949 
        ifd1 = PeekL(OffsetField) 
      Else 
        ifd1 = xchEndianL(PeekL(OffsetField) ) 
      EndIf 
      OffsetField + 4 
      OffsetField = imageAdress + ifd1 + Header 
      If wordOrder = $4949 
        nFields = PeekW(OffsetField) 
      Else 
        nFields = xchEndianW(PeekW(OffsetField)) 
      EndIf 
      OffsetField + 2 
      For i = 1 To nFields 
        If wordOrder = $4949 
          currentTag = PeekW(OffsetField) 
        Else 
          currentTag = xchEndianW(PeekW(OffsetField)) 
        EndIf 
        OffsetField + 2 
        flg=#True 
        Select currentTag 
          Case 271 
            cam$ = " Fabricant: " 
          Case 272 
            cam$ = " Modèle: " 
          Case 305 
            cam$ = " Appareil: " 
          Case 306 
            cam$ = " Date prise de vue: " 
          Case 315 
            cam$ = " Auteur: " 
          Default 
            flg=#False 
        EndSelect 
        If flg=#True 
          If wordOrder = $4949 
            fieldType = PeekW(OffsetField) 
          Else 
            fieldType = xchEndianW(PeekW(OffsetField)) 
          EndIf 
          OffsetField + 2 
          fieldLength = PeekL(OffsetField) 
          OffsetField + 4 
          If fieldLength <= 4 
            currentloc = OffsetField 
            AddGadgetItem(ExifEditor, -1, PeekS(OffsetField,0, #PB_Ascii)) 
            OffsetField + 4 
          Else 
            currentloc = OffsetField 
            If wordOrder = $4949 
              fieldValue = PeekL(OffsetField) 
            Else 
              fieldValue = xchEndianL(PeekL(OffsetField)) 
            EndIf 
            OffsetField = imageAdress + fieldValue + Header 
            AddGadgetItem(ExifEditor, -1, cam$ + PeekS(OffsetField, 255, #PB_Ascii)) 
            OffsetField = currentloc + 4 
          EndIf 
        Else 
           OffsetField +10 
        EndIf 
      Next 
    EndIf 
  EndIf 
EndProcedure 

;-===============================
;-STRUCTURE LIST
; Image gallery
Structure ImageGalerie ;{
  ShowImage.i
  NewImg.i
  PathImg.s
  ImgName.s ;}
EndStructure
Global NewList ScrollShowImage.ImageGalerie()
;Procedure for releasing the gallery before loading other images
Procedure FreeGalerie()
  ;Removing an image and associated gadgets from the gallery
  For i = 0 To ListSize(ScrollShowImage.ImageGalerie())-1
    ShowImage = SelectElement(ScrollShowImage(), i) ;ImageGadget()
    NewImg    = SelectElement(ScrollShowImage(), i) ;The displayed thumbnail image
    PathImg   = SelectElement(ScrollShowImage(), i) ;The location of the image on disk
    ImgName   = SelectElement(ScrollShowImage(), i) 
    ;We release the 1 "Gadget" type elements on the 5 elements :
    FreeGadget(ScrollShowImage()\ShowImage)  
  Next
  yImg = 2 ;reset y position to restart display at the beginning of the ScrollareaGadget
EndProcedure

; Recently viewed images
Structure ImageViewed ;{
  Panel.i
  ViewImage.i
  CopyImg.i
  DirFile.s
  FileName.s 
  BtnOpen.i
  BtnRemove.i 
  ;}
EndStructure
Global NewList ScrollViewed.ImageViewed()
Procedure FreeViewedImages()
  ;Removing an image and associated gadgets from the gallery
  For i = 0 To ListSize(ScrollViewed.ImageViewed())-1
    Panel     = SelectElement(ScrollViewed(), i) ;PanelGadget() receiving the ImageGadget()
    ViewImage = SelectElement(ScrollViewed(), i) ;ImageGadget()
    CopyImg   = SelectElement(ScrollViewed(), i) ;The displayed thumbnail image
    DirFile   = SelectElement(ScrollViewed(), i) ;The location of the image on disk
    FileName  = SelectElement(ScrollViewed(), i) ;The FileName of the image on disk
    BtnOpen   = SelectElement(ScrollViewed(), i) ;The button to open in Windows image viewer
    BtnRemove = SelectElement(ScrollViewed(), i) ;The button to remove of th list
    ;We release the 4 "Gadget" type elements on the 7 elements :
    FreeGadget(ScrollViewed()\ViewImage)
    FreeGadget(ScrollViewed()\BtnOpen)
    FreeGadget(ScrollViewed()\BtnRemove)
    FreeGadget(ScrollViewed()\Panel)
  Next
  yImg = 2 ;reset y position to restart display at the beginning of the ScrollareaGadget
EndProcedure

;-===============================
;-PROCEDURES GENERALES
Procedure FileProperty(File$)
  verb$ = "properties" 
  SEI.SHELLEXECUTEINFO 
  SEI\cbSize = SizeOf(SHELLEXECUTEINFO) 
  SEI\fMask = #SEE_MASK_NOCLOSEPROCESS | #SEE_MASK_INVOKEIDLIST | #SEE_MASK_FLAG_NO_UI 
  SEI\lpVerb = @verb$ 
  ;File$ = SelFile$
  SEI\lpFile = @File$ 
  ShellExecuteEx_(@SEI)
EndProcedure
 Structure Characters 
  c.c[0] 
EndStructure
Procedure.s GetDirectoryPart(FileName.s) ;by LSI 
  Protected Directory.s, i.i 
  Protected *Directory.Characters 
  Directory = GetPathPart(FileName) 
  If Directory 
    i = Len(Directory) - 2 
    *Directory = @Directory  
    While i >= 0 And *Directory\c[i] <> '/' And *Directory\c[i] <> '\' 
      i - 1 
    Wend  
    i + 2 
    Directory = Mid(Directory, i, Len(Directory) - i) 
  EndIf 
  ProcedureReturn Directory 
EndProcedure
Procedure.s DisplaySize(Taille.q, Unite.l = -1, NbDecimals.l = 0);by LSI 
	; Taille = taille du lecteur
	; Unite = unité de la taille, 0 = Octect, 1 = Ko, 2 = Mo, 3 = Go. Si = -1, Le choix de l'unité et du nombre de décimal sera automatique
	; NbDecimals = nombre de chiffre après la virgule.
	
	Protected Val.q, Txt.s
	
	If Unite = -1
		NbDecimals = 0 : Unite = 0
		If Taille >= 1000 : Unite = 1 : NbDecimals = 2 : EndIf
		If Taille >= 10000 : Unite = 1 : NbDecimals = 1 : EndIf
		If Taille >= 1000000 : Unite = 2 : NbDecimals = 2 : EndIf
		If Taille >= 10000000 : Unite = 2 : NbDecimals = 1 : EndIf
		If Taille >= 1000000000 : Unite = 3 : NbDecimals = 2 : EndIf
		If Taille >= 10000000000 : Unite = 3 : NbDecimals = 1 : EndIf
	EndIf
	Select Unite
		Case 0 : Val = 1 : Txt = " octets"
		Case 1 : Val = 1024 : Txt = " Ko"
		Case 2 : Val = 1024 * 1024 : Txt = " Mo"
		Case 3 : Val = 1024 * 1024 * 1024 : Txt = " Go"
	EndSelect
	ProcedureReturn StrF(Taille / Val, NbDecimals) + Txt
	
EndProcedure

;-===============================
;-CREATION OF GALLERIES
Procedure.l CountImagesGallery(ImagesDir$)
  ;Allows you to count the images that will be in the gallery and adapt the progressbar
  ;Permet de compter les images qui seront dans la galerie et d'adapter la progressbar
  nbimg.l = 0
  If ExamineDirectory(#DirectoryImages, ImagesDir$, "*.*") <> 0 
    While NextDirectoryEntry(#DirectoryImages)
      If DirectoryEntryType(#DirectoryImages) = #PB_DirectoryEntry_File
        ImageName$ = DirectoryEntryName(#DirectoryImages)
        ImageExt$  = GetExtensionPart(ImageName$)
        If LCase(ImageExt$) = "bmp" Or LCase(ImageExt$) = "jpeg" Or LCase(ImageExt$) = "jpg" Or LCase(ImageExt$) = "png" Or LCase(ImageExt$) = "gif" Or LCase(ImageExt$) = "tif" Or LCase(ImageExt$) = "tga"
          nbimg + 1
        EndIf 
      EndIf 
    Wend
    ProcedureReturn nbimg
  Else 
    ProcedureReturn 0
  EndIf 
EndProcedure
;This is the procedure that does all the work of displaying the gallery
Procedure CreateGallery(ImagesDir$)
  ; Reduced the size of the scroll area to avoid having an empty part/Réduction de la taille de la scrollarea pour éviter d'avoir une partie vide
  SetGadgetAttribute(#scroll_Galerie, #PB_ScrollArea_InnerHeight,2) 
  SetGadgetAttribute(#scroll_Galerie, #PB_ScrollArea_Y, 0) ; reset  
  SetGadgetAttribute(#scroll_Galerie, #PB_ScrollArea_X, 0) ; for a display at the beginning 
  DisableWindow(#WinViewer, #True)
  
  MaxImages = CountImagesGallery(ImagesDir$)
  If MaxImages <> 0
    SetGadgetAttribute(#LoadingProgress, #PB_ProgressBar_Maximum, MaxImages)
  EndIf 
  
  If ExamineDirectory(#DirectoryImages, ImagesDir$, "*.*") <> 0  :  n = 0
    SetWindowTitle(#WinViewer, "Image Viewer (Loading images into the gallery...)") 
    StatusBarText(#StatusViewer, 0, "Gallery : "+GetDirectoryPart(ImagesDir$))   
    While NextDirectoryEntry(#DirectoryImages)      
      If DirectoryEntryType(#DirectoryImages) = #PB_DirectoryEntry_File 
        ImageName$ = DirectoryEntryName(#DirectoryImages)
        ImageExt$  = GetExtensionPart(ImageName$)
        If LCase(ImageExt$) = "bmp" Or LCase(ImageExt$) = "jpeg" Or LCase(ImageExt$) = "jpg" Or LCase(ImageExt$) = "png" Or LCase(ImageExt$) = "gif" Or LCase(ImageExt$) = "tif" Or LCase(ImageExt$) = "tga"      
          PhotoSelect = LoadImage(#Photo, ImagesDir$+ImageName$)         
          If PhotoSelect
            n+1
            StatusBarText(#StatusViewer, 1, Str(n)+" files")
            SetGadgetState(#LoadingProgress, n)
            
            OpenGadgetList(#scroll_Galerie) 
              NewImg = CopyImage(#Photo,#PB_Any)
              ResizeImage(NewImg,75*dpix,50*dpiy,#PB_Image_Smooth)
              ShowImage = ImageGadget(#PB_Any,5,yImg,75*dpix,50*dpiy,ImageID(NewImg),#PB_Image_Border)
              *Element.ImageGalerie = AddElement(ScrollShowImage())
              If *Element<>0
                *Element\ShowImage = ShowImage
                *Element\NewImg    = NewImg
                *Element\PathImg   = ImagesDir$
                *Element\ImgName   = ImageName$
              EndIf
            CloseGadgetList()
                
            yImg = yImg + 62  ; 62 = 50 + 12 --> hauteur image + espace entre images
            InHeight = GetGadgetAttribute(#scroll_Galerie, #PB_ScrollArea_InnerHeight)            
            SetGadgetAttribute(#scroll_Galerie, #PB_ScrollArea_InnerHeight, InHeight+62)
          EndIf            
        EndIf         
      EndIf
      Delay(1)
      RedrawWindow_(WindowID(#WinViewer), #Null, #Null, #RDW_UPDATENOW)
    Wend   
    FinishDirectory(#DirectoryImages) 
  EndIf 
  SetWindowTitle(#WinViewer, "Image Viewer") 
  SetGadgetState(#LoadingProgress, 0)
  DisableWindow(#WinViewer, #False)     
EndProcedure

Procedure RecentlyViewedImages(ImagesDir$,ImageName$)
  
  Protected Exist.l = 0, Pan.l
  ; Check that the image has not already been opened/ Vérification que l'image n'a pas déjà été ouverte
  ; if this is the case we do not recreate it a second time in the images seen recently./si c'est le cas on ne la recrée pas une seconde fois dans les images vues récemment.
  If ListIndex(ScrollViewed())<>-1    
    For Pan = 0 To ListSize(ScrollViewed.ImageViewed())-1     
      SelectElement(ScrollViewed(),Pan)         
      If ScrollViewed()\FileName <> ImageName$ 
        Exist = 0
      ElseIf ScrollViewed()\FileName = ImageName$
        Exist = 1 : Break 
      EndIf      
    Next   
  ElseIf ListIndex(ScrollViewed())=-1 ; if the list is empty we move to the beginning of the scroll area/si la liste est vide on se place au début de la scrollarea
    SetGadgetAttribute(#scroll_Viewed, #PB_ScrollArea_InnerHeight,2) ; ... 
    SetGadgetAttribute(#scroll_Viewed, #PB_ScrollArea_Y, 0) ; reset  
    SetGadgetAttribute(#scroll_Viewed, #PB_ScrollArea_X, 0) ; for a display at the beginning 
  EndIf
  
  ; only if the image has not already been opened, we create the panel and the thumbnail on the right
  If Exist = 0 ; seulement si l'image n'a pas déjà été ouverte, on crée le panel et l'imagette à droite
    ;{
    If FileSize(ImagesDir$+ImageName$)<>-1 ; we still check that the file exists/on contrôle quand même que le fichier existe bien             
      If LoadImage(#Photo, ImagesDir$+ImageName$)
        Largeur = ImageWidth(#Photo)
        Hauteur = ImageHeight(#Photo)
        
        OpenGadgetList(#scroll_Viewed) 
        Panel = PanelGadget(#PB_Any, 0, PosyImg, 200, 100)             
        AddGadgetItem(Panel,0,ImageName$)                             ; first element that will receive the ImageGadget()            
        WidthPanel.d  = GetGadgetAttribute(Panel, #PB_Panel_ItemWidth)  ; usable width for ImageGadget()
        HeightPanel.d = GetGadgetAttribute(Panel, #PB_Panel_ItemHeight) ; usable height for ImageGadget()           
        
        CopyImg = CopyImage(#Photo,#PB_Any)
        ResizeImage(CopyImg,100*dpix,67*dpiy,#PB_Image_Smooth)
        ViewImage = ImageGadget(#PB_Any,5,0,100*dpix,67*dpiy,ImageID(CopyImg),#PB_Image_Border) ;creating the ImageGadget() with image   
        
        BtnOpen   = ButtonGadget(#PB_Any,120,5,60,25,"Open") ; To open the image with the default Windows viewer                               
        BtnRemove = ButtonGadget(#PB_Any,120,35,60,25,"Remove") ; To remove the image from the list and recently opened images
        
        ; added the thumbnail to the list of viewed images/ajout de l'imagette dans la liste des images vues
        *Element.ImageViewed = AddElement(ScrollViewed())
        If *Element<>0
          *Element\Panel     = Panel
          *Element\ViewImage = ViewImage
          *Element\CopyImg   = CopyImg
          *Element\DirFile   = ImagesDir$
          *Element\FileName  = ImageName$
          *Element\BtnOpen   = BtnOpen
          *Element\BtnRemove = BtnRemove
        EndIf
    
        AddGadgetItem(Panel,1,"Info",ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",171))
        TextExif = EditorGadget(#PB_Any,0,0,WidthPanel,HeightPanel,#PB_Editor_ReadOnly|#PB_Editor_WordWrap)
        SetGadgetFont(TextExif,FontID1) : SetGadgetColor(TextExif,#PB_Gadget_BackColor,BackColor) : SetGadgetColor(TextExif,#PB_Gadget_FrontColor,RGB(255, 255, 255))
        
        ;information about the image to display in the panel/info sur l'image à afficher dans le panel
        AddGadgetItem(TextExif, -1, " Hauteur : "+Str(Hauteur)+" pixels")
        AddGadgetItem(TextExif, -1, " Largeur  : "+Str(Largeur)+" pixels")
        AddGadgetItem(TextExif, -1, " Taille image : "+StrF((Largeur*Hauteur)/1024/1024,2)+" MP") 
        AddGadgetItem(TextExif, -1, " Taille fichier: "+DisplaySize(FileSize(ImagesDir$+ImageName$)))    
        AddGadgetItem(TextExif, -1, " Fichier créé le : "+FormatDate("%dd/%mm/%yyyy",GetFileDate(ImagesDir$+ImageName$,  #PB_Date_Created)))
        AddGadgetItem(TextExif, -1, " Fichier modifié le : "+FormatDate("%dd/%mm/%yyyy",GetFileDate(ImagesDir$+ImageName$, #PB_Date_Modified)))
        AddGadgetItem(TextExif, -1, " Dernier accès le : "+FormatDate("%dd/%mm/%yyyy",GetFileDate(ImagesDir$+ImageName$, #PB_Date_Accessed)))
        SelectFileExt$ = GetExtensionPart(ImagesDir$+ImageName$)     
        If LCase(SelectFileExt$) = "jpg" Or LCase(SelectFileExt$) = "jpeg" ;Or LCase(SelectFileExt$) = "jp2"
          If ReadFile(#ReadExif, ImagesDir$+ImageName$)                    ;Reads image data
            *BufferImg = AllocateMemory(Lof(#ReadExif))                    ;Allocates a memory area 
            ReadData(#ReadExif, *BufferImg, Lof(#ReadExif))                ;places the read data into memory
            CloseFile(#ReadExif) 
            GetCameraModel(*BufferImg,TextExif) ; Retrieves data from memory that is processed by the procedure and displayed in the editor
          EndIf
          FreeMemory(*BufferImg)
        EndIf 
      
        CloseGadgetList() ; closed the panel
        CloseGadgetList() ; closed the scrollarea
        
        PosyImg = PosyImg + 102 ;GetGadgetAttribute(Panel, #PB_Panel_ItemHeight)+GetGadgetAttribute(Panel, #PB_Panel_TabHeight)+2
        InHeight = GetGadgetAttribute(#scroll_Viewed, #PB_ScrollArea_InnerHeight)            
        SetGadgetAttribute(#scroll_Viewed, #PB_ScrollArea_InnerHeight, InHeight+102)
      EndIf 
    EndIf
    ;}
  EndIf
EndProcedure
;Procedure to display an image from the gallery in the viewing area
Procedure OpenImageGalerie(PhotoGalerie$) 
  
  If PhotoGalerie$ <> "" 
    Result_Photo = LoadImage(#PhotoLoad, PhotoGalerie$)
    If Result_Photo     
      Hauteur = ImageHeight(#PhotoLoad) : ValeurH$ = Str(Hauteur)  
      Largeur = ImageWidth(#PhotoLoad)  : ValeurL$ = Str(Largeur)
      SetMenuItemText(#PopUp_ActualSize,#DisplayActualSize,"Show actual dimensions : "+ValeurL$+" x "+ValeurH$)     
      ;if the image is larger than the display area, it is reduced to display the entire image  
      If Largeur > 575 ;GetGadgetAttribute(#scroll_image, #PB_ScrollArea_InnerWidth) Or Hauteur > GetGadgetAttribute(#scroll_image, #PB_ScrollArea_InnerHeight)
        NL = Largeur/4
        NH = Hauteur/4
        Result_Photo = ResizeImage(#PhotoLoad,NL,NH,#PB_Image_Smooth)
      ElseIf Largeur <= 575
        NL = Largeur
        NH = Hauteur
      EndIf
      SetMenuItemText(#PopUp_ActualSize,#DisplaySizeImage,"Dimensions of displayed image : "+Str(NL)+" x "+Str(NH))
      SetGadgetAttribute(#scroll_image, #PB_ScrollArea_InnerWidth, NL);Changes the width of the inner scrollarea area based on the width of the image. 
      SetGadgetAttribute(#scroll_image, #PB_ScrollArea_InnerHeight, NH);Changes the height of the inner area of ​​the scrollarea based on the height of the image. 
      SetGadgetState(#PhotoView, Result_Photo) 
      SetGadgetAttribute(#scroll_image, #PB_ScrollArea_Y, 0)
      SetGadgetAttribute(#scroll_image, #PB_ScrollArea_X, 0)
      ImageName$ = GetFilePart(PhotoGalerie$) 
      StatusBarText(#StatusViewer, 2, "View : "+ImageName$,#PB_StatusBar_Center)             
      StatusBarText(#StatusViewer, 3, "Dimensions : "+ValeurL$+" x "+ValeurH$+" | "+StrF((Largeur*Hauteur)/1024/1024,2)+" MP")  
      StatusBarText(#StatusViewer, 4, "Size : "+DisplaySize(FileSize(PhotoGalerie$))) 
      
      ImagesDir$ = GetPathPart(PhotoGalerie$)      
      RecentlyViewedImages(ImagesDir$,ImageName$)
    EndIf       
  EndIf 
  
EndProcedure
Procedure RedimImageSize_Div(divi.l) 
  If IsImage(#PhotoLoad) <> 0
    If LoadImage(#PhotoLoad,NomPhoto$); if the image is reloaded, the new dimensions are applied to the original image
      Timgx = ImageWidth(#PhotoLoad)  : ValImgX$ = Str(Timgx/divi); we divide the image size by two 
      Timgy = ImageHeight(#PhotoLoad) : ValImgY$ = Str(Timgy/divi)       
      SetGadgetState(#PhotoView, ResizeImage(#PhotoLoad,Val(ValImgX$) ,Val(ValImgY$),#PB_Image_Smooth)); then we resize the image immediately with the new values     
      SetGadgetAttribute(#scroll_image, #PB_ScrollArea_InnerWidth, Val(ValImgX$))     ;  we adapt the scrollarea according to the new dimensions 
      SetGadgetAttribute(#scroll_image, #PB_ScrollArea_InnerHeight, Val(ValImgY$)) 
      SetGadgetAttribute(#scroll_image, #PB_ScrollArea_Y, 0)
      SetGadgetAttribute(#scroll_image, #PB_ScrollArea_X, 0)
    EndIf 
  EndIf 
EndProcedure
Procedure RedimImageSize_Mult(multi.l)
  If IsImage(#PhotoLoad) <> 0
    If LoadImage(#PhotoLoad,NomPhoto$) 
      Timgx = ImageWidth(#PhotoLoad)  : ValImgX$ = Str(Timgx*multi)
      Timgy = ImageHeight(#PhotoLoad) : ValImgY$ = Str(Timgy*multi) 
      SetGadgetState(#PhotoView, ResizeImage(#PhotoLoad,Val(ValImgX$) ,Val(ValImgY$),#PB_Image_Smooth))
      SetGadgetAttribute(#scroll_image, #PB_ScrollArea_InnerWidth, Val(ValImgX$))
      SetGadgetAttribute(#scroll_image, #PB_ScrollArea_InnerHeight, Val(ValImgY$)) 
      SetGadgetAttribute(#scroll_image, #PB_ScrollArea_Y, 0)
      SetGadgetAttribute(#scroll_image, #PB_ScrollArea_X, 0)
    EndIf 
  EndIf 
EndProcedure
Procedure ZoomInImage(zoom$)
  Protected Zmult.f
  If IsImage(#PhotoLoad) 
    If LoadImage(#PhotoLoad,NomPhoto$) ;we reload the image for better quality when resizing
      Select zoom$
        Case "+10 %"  : Zmult = 1.1
        Case "+20 %"  : Zmult = 1.2
        Case "+30 %"  : Zmult = 1.3
        Case "+40 %"  : Zmult = 1.4
        Case "+50 %"  : Zmult = 1.5
        Case "+60 %"  : Zmult = 1.6
        Case "+70 %"  : Zmult = 1.7
        Case "+80 %"  : Zmult = 1.8
        Case "+90 %"  : Zmult = 1.9    
        Case "+100 %" : Zmult = 2
        Case "+120 %" : Zmult = 2.2
        Case "+140 %" : Zmult = 2.4
        Case "+150 %" : Zmult = 2.2
        Case "+160 %" : Zmult = 2.6
        Case "+180 %" : Zmult = 2.8
        Case "+200 %" : Zmult = 3
        Case "+220 %" : Zmult = 3.2
        Case "+240 %" : Zmult = 3.4
        Case "+260 %" : Zmult = 3.6
        Case "+280 %" : Zmult = 3.8
        Case "+300 %" : Zmult = 4
        Case "+320 %" : Zmult = 4.2
        Case "+340 %" : Zmult = 4.4
        Case "+360 %" : Zmult = 4.6
        Case "+380 %" : Zmult = 4.8
        Case "+400 %" : Zmult = 5   
      EndSelect
      Timgx = ImageWidth(#PhotoLoad)  
      Timgy = ImageHeight(#PhotoLoad)
      ValImgX$ = Str(Timgx*Zmult)
      ValImgY$ = Str(Timgy*Zmult)
      SetGadgetState(#PhotoView, ResizeImage(#PhotoLoad,Val(ValImgX$) ,Val(ValImgY$),#PB_Image_Smooth))
      SetGadgetAttribute(#scroll_image, #PB_ScrollArea_InnerWidth, Val(ValImgX$))   
      SetGadgetAttribute(#scroll_image, #PB_ScrollArea_InnerHeight, Val(ValImgY$)) 
    EndIf 
  EndIf 
EndProcedure
Procedure ZoomOutImage(zoom$)
  Protected Zmult.f
  If IsImage(#PhotoLoad)<>0
    If LoadImage(#PhotoLoad,NomPhoto$)
      Select zoom$
        Case "-10 %" : Zmult = 0.9
        Case "-20 %" : Zmult = 0.8
        Case "-30 %" : Zmult = 0.7
        Case "-40 %" : Zmult = 0.6
        Case "-50 %" : Zmult = 0.5
        Case "-60 %" : Zmult = 0.4
        Case "-70 %" : Zmult = 0.3
        Case "-80 %" : Zmult = 0.2
        Case "-90 %" : Zmult = 0.1      
      EndSelect
      Timgx = ImageWidth(#PhotoLoad)  
      Timgy = ImageHeight(#PhotoLoad)
      ValImgX$ = Str(Timgx*Zmult)
      ValImgY$ = Str(Timgy*Zmult)
      SetGadgetState(#PhotoView, ResizeImage(#PhotoLoad,Val(ValImgX$) ,Val(ValImgY$),#PB_Image_Smooth)) 
      SetGadgetAttribute(#scroll_image, #PB_ScrollArea_InnerWidth, Val(ValImgX$))      
      SetGadgetAttribute(#scroll_image, #PB_ScrollArea_InnerHeight, Val(ValImgY$)) 
    EndIf 
  EndIf 
EndProcedure
Procedure ZoomAuto(mult.f) 
  If IsImage(#PhotoLoad)<>0           ;if an image is displayed
    Wimg = ImageWidth(#PhotoLoad)     ;we recover its width
    Himg = ImageHeight(#PhotoLoad)    ;we recover its height             
    ValImgX$ = StrF(Wimg*mult,1)
    ValImgY$ = StrF(Himg*mult,1)     
    If LoadImage(#PhotoLoad,NomPhoto$) ;we reload the image for better quality otherwise it degrades as ResizeImage() is used
      SetGadgetState(#PhotoView, ResizeImage(#PhotoLoad,Val(ValImgX$) ,Val(ValImgY$),#PB_Image_Smooth))
      SetGadgetAttribute(#scroll_image, #PB_ScrollArea_InnerWidth, Val(ValImgX$)) 
      SetGadgetAttribute(#scroll_image, #PB_ScrollArea_InnerHeight, Val(ValImgY$))
    EndIf  
  EndIf
EndProcedure
Procedure ResizeImageViewer()
  
  Protected WinWidth.l, WinHeight.l
  WinWidth  = WindowWidth(#WinViewer,#PB_Window_InnerCoordinate)
  WinHeight = WindowHeight(#WinViewer,#PB_Window_InnerCoordinate) 
   
  ResizeGadget(#scroll_Galerie, #PB_Ignore,#PB_Ignore,#PB_Ignore,WinHeight-120)
   
  If IsImage(#PhotoLoad)
    Hauteur = ImageHeight(#PhotoLoad)*dpix  
    Largeur = ImageWidth(#PhotoLoad)*dpiy 
    SetGadgetAttribute(#scroll_image, #PB_ScrollArea_InnerWidth, Largeur)
    SetGadgetAttribute(#scroll_image, #PB_ScrollArea_InnerHeight, Hauteur)
  EndIf 
  
  ResizeGadget(#scroll_image,#PB_Ignore,#PB_Ignore,WinWidth-359,WinHeight-120) ; 205,75,575,WinHeight-120
  
  ResizeGadget(#Txt_scroll_Viewed,WinWidth-230,#PB_Ignore,#PB_Ignore,#PB_Ignore)
  ResizeGadget(#scroll_Viewed, WinWidth-230,#PB_Ignore,#PB_Ignore,WinHeight-120)
  
  ResizeGadget(#LoadingProgress,#PB_Ignore,WinHeight-40,WinWidth-4,#PB_Ignore)
  
  UpdateWindow_(WindowID(#WinViewer))
  
EndProcedure
;-===============================
;-Fenêtre 
If OpenWindow(#WinViewer ,0,0, 1014, 718, "Image Viewer", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget |#PB_Window_TitleBar) 
  WindowBounds(#WinViewer, 1014, 718, #PB_Ignore, #PB_Ignore)
  WinWidth  = WindowWidth(#WinViewer,#PB_Window_InnerCoordinate)
  WinHeight = WindowHeight(#WinViewer,#PB_Window_InnerCoordinate)   
  SetWindowColor(#WinViewer, BackColor)
  ;-Toolbar Main   
  If CreateToolBar(#ToolBarMain, WindowID(#WinViewer),#PB_ToolBar_Large|#PB_ToolBar_Text) ;{ 
    ToolBarSeparator()
    ToolBarImageButton(#Tbar_btn_OpenFolder,ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",318),#PB_ToolBar_Normal,"Images")    
    ToolBarImageButton(#Tbar_btn_CloseImage,ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",219),#PB_ToolBar_Normal,"Close")
    ToolBarSeparator()
    ToolBarImageButton(#Tbar_btn_ActualSize,ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",245),#PB_ToolBar_Normal,"Actual")
    ToolBarImageButton(#Tbar_btn_Redim,ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",192),#PB_ToolBar_Normal,"Resize")
    ToolBarSeparator()
    ToolBarImageButton(#Tbar_btn_ZoomIn,ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",246),#PB_ToolBar_Normal,"+10%")
    ToolBarImageButton(#Tbar_btn_ZoomOut,ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",247),#PB_ToolBar_Normal,"-10%")
    ToolBarImageButton(#Tbar_btn_ZoomPercent,ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",263),#PB_ToolBar_Normal,"Other")
    ToolBarSeparator()
    
    ToolBarToolTip(#ToolBarMain, #Tbar_btn_OpenFolder, "Select and load an image gallery")
    ToolBarToolTip(#ToolBarMain, #Tbar_btn_CloseImage, "Close the displayed image")
    ToolBarToolTip(#ToolBarMain, #Tbar_btn_ActualSize, "Show image at actual size")
    ToolBarToolTip(#ToolBarMain, #Tbar_btn_Redim, "Resize the image")
    ToolBarToolTip(#ToolBarMain, #Tbar_btn_ZoomIn, "Zoom in image +10%")
    ToolBarToolTip(#ToolBarMain, #Tbar_btn_ZoomOut, "Zoom out image -10%")
    ToolBarToolTip(#ToolBarMain, #Tbar_btn_ZoomPercent, "Zoom in or out the image in %")
    ;}
  EndIf 
  ;-MenuSizes
  If CreatePopupMenu(#MenuSizes) ;{
    OpenSubMenu("Reduce")
    MenuItem(#Menu_SizeDiv2,"Image/2")
    MenuItem(#Menu_SizeDiv4,"Image/4")
    MenuItem(#Menu_SizeDiv6,"Image/6")
    MenuItem(#Menu_SizeDiv8,"Image/8")
    CloseSubMenu()
    MenuBar()
    OpenSubMenu("Enlarge")
    MenuItem(#Menu_SizeMult2,"Image x2")
    MenuItem(#Menu_SizeMult4,"Image x4")
    MenuItem(#Menu_SizeMult6,"Image x6")
    MenuItem(#Menu_SizeMult8,"Image x8")
    CloseSubMenu()
    ;}
  EndIf  
  ;-MenuPercentZoom
  If CreatePopupMenu(#MenuPercentZoom) ;{
    OpenSubMenu("% Zoom +")
    MenuItem(#ZoomIn_10,"Actual Size +10 %")
    MenuItem(#ZoomIn_20,"Actual Size +20 %")
    MenuItem(#ZoomIn_30,"Actual Size +30 %")
    MenuItem(#ZoomIn_40,"Actual Size +40 %")
    MenuItem(#ZoomIn_50,"Actual Size +50 %")
    MenuItem(#ZoomIn_60,"Actual Size +60 %")
    MenuItem(#ZoomIn_70,"Actual Size +70 %")
    MenuItem(#ZoomIn_80,"Actual Size +80 %")
    MenuItem(#ZoomIn_90,"Actual Size +90 %")    
    MenuItem(#ZoomIn_100,"Actual Size +100 %")
    MenuItem(#ZoomIn_120,"Actual Size +120 %")
    MenuItem(#ZoomIn_140,"Actual Size +140 %")
    MenuItem(#ZoomIn_150,"Actual Size +150 %")
    MenuItem(#ZoomIn_160,"Actual Size +160 %")
    MenuItem(#ZoomIn_180,"Actual Size +180 %")
    MenuItem(#ZoomIn_200,"Actual Size +200 %")
    MenuItem(#ZoomIn_220,"Actual Size +220 %")
    MenuItem(#ZoomIn_240,"Actual Size +240 %")
    MenuItem(#ZoomIn_260,"Actual Size +260 %")
    MenuItem(#ZoomIn_280,"Actual Size +280 %")
    MenuItem(#ZoomIn_300,"Actual Size +300 %")
    MenuItem(#ZoomIn_320,"Actual Size +320 %")
    MenuItem(#ZoomIn_340,"Actual Size +340 %")
    MenuItem(#ZoomIn_360,"Actual Size +360 %")
    MenuItem(#ZoomIn_380,"Actual Size +380 %")
    MenuItem(#ZoomIn_400,"Actual Size +400 %")
    CloseSubMenu()
    MenuBar()
    OpenSubMenu("% Zoom -")
    MenuItem(#ZoomOut_10,"Actual Size -10 %")
    MenuItem(#ZoomOut_20,"Actual Size -20 %")
    MenuItem(#ZoomOut_30,"Actual Size -30 %")
    MenuItem(#ZoomOut_40,"Actual Size -40 %")
    MenuItem(#ZoomOut_50,"Actual Size -50 %")
    MenuItem(#ZoomOut_60,"Actual Size -60 %")
    MenuItem(#ZoomOut_70,"Actual Size -70 %")
    MenuItem(#ZoomOut_80,"Actual Size -80 %")
    MenuItem(#ZoomOut_90,"Actual Size -90 %")
    CloseSubMenu()
    ;}
  EndIf
  ;-PopUp_ActualSize
  If CreatePopupMenu(#PopUp_ActualSize) ;{
    MenuItem(#DisplaySizeImage,"Dimensions of displayed image :")
    MenuItem(#DisplayActualSize,"Show actual dimensions :")
    ;}
  EndIf
  ;-PopUpMenu_Galerie    
  If CreatePopupMenu(#PopUp_Galerie) ;{
    MenuItem(#Menu_Galerie_OpenFile,     "Open with default application")  ;,ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",264))
    MenuBar()
    MenuItem(#Menu_Galerie_FileProperty, "Image properties")  ;,ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",171))
    ;}
  EndIf
  
  ;-ScrollArea Galerie d'images (left)
  TextGadget(#Txt_scroll_Galerie,2,55,200,15,"Image Gallery")
  SetGadgetFont(#Txt_scroll_Galerie,FontID1) : SetGadgetColor(#Txt_scroll_Galerie,#PB_Gadget_BackColor,BackColor) : SetGadgetColor(#Txt_scroll_Galerie,#PB_Gadget_FrontColor,ForeColor)
  ScrollAreaGadget(#scroll_Galerie, 2,75,120,WinHeight-120, 90, WinHeight-120, 100,#PB_ScrollArea_Center) 
  SetGadgetColor(#scroll_Galerie, #PB_Gadget_BackColor, BackColor)
  CloseGadgetList()
  ShowScrollBar_(GadgetID(#scroll_Galerie), #SB_HORZ, 0) ;keep the horizontal scrollbar always hidden
   
  ;-ScrollArea de visionnage d'image (middle)
  TextGadget(#Txt_scroll_image,125,55,200,15,"Viewing area")
  SetGadgetFont(#Txt_scroll_image,FontID1) : SetGadgetColor(#Txt_scroll_image,#PB_Gadget_BackColor,BackColor) : SetGadgetColor(#Txt_scroll_image,#PB_Gadget_FrontColor,ForeColor)
  ScrollAreaGadget(#scroll_image, 125,75,655,WinHeight-120, 655, 500, 30,#PB_ScrollArea_Center)  
  SetGadgetColor(#scroll_image, #PB_Gadget_BackColor, BackColor)
  ImageGadget(#PhotoView,0,0,0,0,0)  ;initialisé à zéro 
  CloseGadgetList() 
  
  ;-ScrollArea d'images récemment ouvertes (right)
  TextGadget(#Txt_scroll_Viewed,WinWidth-230,55,220,15,"Recently viewed images")
  SetGadgetFont(#Txt_scroll_Viewed,FontID1) : SetGadgetColor(#Txt_scroll_Viewed,#PB_Gadget_BackColor,BackColor) : SetGadgetColor(#Txt_scroll_Viewed,#PB_Gadget_FrontColor,ForeColor)
  ScrollAreaGadget(#scroll_Viewed, WinWidth-230,75,220,WinHeight-120, 220, WinHeight-120, 100);,#PB_ScrollArea_Center) 
  SetGadgetColor(#scroll_Viewed, #PB_Gadget_BackColor, BackColor)
  CloseGadgetList()
  ShowScrollBar_(GadgetID(#scroll_Viewed), #SB_HORZ, 0) ;keep the horizontal scrollbar always hidden
  
  ProgressBarGadget(#LoadingProgress,2,WinHeight-40,WinWidth-4,12,0,100)
  
  ;-Statusbar  
  If CreateStatusBar(#StatusViewer,WindowID(#WinViewer)) ;{
    AddStatusBarField(#PB_Ignore)
    AddStatusBarField(70)
    AddStatusBarField(#PB_Ignore)
    AddStatusBarField(#PB_Ignore)
    AddStatusBarField(80)
    AddStatusBarField(75)
    AddStatusBarField(75)
    ;AddStatusBarField(#PB_Ignore)
    StatusBarText(#StatusViewer, 0, "Galery : ")
    StatusBarText(#StatusViewer, 1, "Files : ")
    StatusBarText(#StatusViewer, 2, "View : ")
    StatusBarText(#StatusViewer, 3, "Dimensions :")
    StatusBarText(#StatusViewer, 4, "Size : ") 
    StatusBarText(#StatusViewer, 5, "PosX")
    StatusBarText(#StatusViewer, 6, "PosY")
    ;}
  EndIf 

  BindEvent(#PB_Event_SizeWindow, @ResizeImageViewer())
EndIf

;-===========================
;-Programme 
Repeat 
  Event = WaitWindowEvent() 
  ;Cursor position on the image :   
  If Event ;{
    GetCursorPos_(@cp.point)
    GetWindowRect_(GadgetID(#PhotoView),gr.RECT)
    If PtInRect_(@gr,PeekQ(@cp))
      MapWindowPoints_(#Null, GadgetID(#PhotoView),cp,1) 
      StatusBarText(#StatusViewer, 5, "PosX: "+Str(cp\x))
      StatusBarText(#StatusViewer, 6, "PosY: "+Str(cp\y))
    Else 
      StatusBarText(#StatusViewer, 5, "PosX:")
      StatusBarText(#StatusViewer, 6, "PosY:")
    EndIf ;}
  EndIf
  
  ;Image gadget selection in list/gallery and actions :
  For i = 0 To ListSize(ScrollShowImage.ImageGalerie())-1 ;{  
    ShowImage = SelectElement(ScrollShowImage(), i)       ;ImageGadget()
    NewImg    = SelectElement(ScrollShowImage(), i)       ;The displayed thumbnail image
    PathImg   = SelectElement(ScrollShowImage(), i)       ;The location of the image on disk
    ImgName   = SelectElement(ScrollShowImage(), i)       ;The name of file
    Select Event
      Case #PB_Event_Gadget 
        Select EventGadget()  
          Case ScrollShowImage()\ShowImage ; l'ImageGadget()
            Select EventType()
              Case #PB_EventType_LeftDoubleClick
                PhotoGalerie$ = ScrollShowImage()\PathImg + ScrollShowImage()\ImgName
                OpenImageGalerie(PhotoGalerie$)
                NomPhoto$ = PhotoGalerie$               
              Case #PB_EventType_RightClick
                PhotoGalerie$ = ScrollShowImage()\PathImg + ScrollShowImage()\ImgName
                DisplayPopupMenu(#PopUp_Galerie,WindowID(#WinViewer))               
            EndSelect
        EndSelect         
    EndSelect ;}
  Next
  ;Recently viewed images = Panel/Image gadget selection in list and displaying :  
  For j = 0 To ListSize(ScrollViewed.ImageViewed())-1 ;{
    Panel     = SelectElement(ScrollViewed(), j)  ;PanelGadget() receiving the ImageGadget()    
    ViewImage = SelectElement(ScrollViewed(), j)  ;ImageGadget()
    CopyImg   = SelectElement(ScrollViewed(), j)  ;The displayed thumbnail image
    DirFile   = SelectElement(ScrollViewed(), j)  ;The location of the image on disk
    FileName  = SelectElement(ScrollViewed(), j)  ;The name of file
    BtnOpen   = SelectElement(ScrollViewed(), j)  ;The button to open in Windows image viewer
    BtnRemove = SelectElement(ScrollViewed(), j)  ;The button to remove of the list
    Select Event
      Case #PB_Event_Gadget 
        Select EventGadget() 
            
          Case ScrollViewed()\ViewImage ;{
            Select EventType()
              Case #PB_EventType_LeftDoubleClick
                PhotoGalerie$ = ScrollViewed()\DirFile + ScrollViewed()\FileName
                OpenImageGalerie(PhotoGalerie$)
                NomPhoto$ = PhotoGalerie$               
              Case #PB_EventType_RightClick
                PhotoGalerie$ = ScrollViewed()\DirFile + ScrollViewed()\FileName
                ;DisplayPopupMenu(#PopUp_Galerie,WindowID(#WinViewer))               
            EndSelect
            ;}
          Case ScrollViewed()\BtnOpen ;{  
            PhotoGalerie$ = ScrollViewed()\DirFile + ScrollViewed()\FileName
            If PhotoGalerie$
               ShellExecute_(0,"open",PhotoGalerie$,0,0,1)  
             EndIf   ;}             
          Case ScrollViewed()\BtnRemove ;{
             ; Release of all associated gadgets, the Panel last
             ; Libération de tous les gadgets associés, le Panel en dernier
             FreeGadget(ScrollViewed()\BtnOpen)
             FreeGadget(ScrollViewed()\BtnRemove)
             FreeGadget(ScrollViewed()\ViewImage)
             FreeGadget(ScrollViewed()\Panel)
             ; Deleting the item from the list / Suppression de l'élément dans la liste
             DeleteElement(ScrollViewed(),1) 
             ; After deleting the element, the display is adjusted so that there is no gap.
             ; The easiest way to do this is to resize all the PanelGadget()s in the list
             ; Après la suppression de l'élément on ajuste l'affichage pour qu'il n'y ait pas de trou.
             ; Pour cela le plus simple est de redimensionner tous les PanelGadget() de la liste
             PosyImg = 2 ; ici pour reprendre l'ordre correctement (merci Itsy Bitsy)
             If ListIndex(ScrollViewed())<>-1
               For Pan = 0 To ListSize(ScrollViewed.ImageViewed())-1     
                 SelectElement(ScrollViewed(),Pan)         
                 ResizeGadget(ScrollViewed()\Panel,0,PosyImg, 200, 100) 
                 PosyImg = PosyImg + 102
               Next
             EndIf             
             ;}
             
        EndSelect         
    EndSelect ;}
  Next 
  
  Select Event
      ;-Event Gadget             
    Case #PB_Event_Gadget 
      Select EventGadget()                 
          
        Case #PhotoView ;{          
          Select EventType() 
            Case #PB_EventType_LeftClick  
              ;Action to be taken if necessary
            Case #PB_EventType_RightClick
              ;Action to be taken if necessary
          EndSelect 
          ;}        
          
      EndSelect 
    ;-Event Menu  
     Case #PB_Event_Menu 
       Select EventMenu()
           
           Case #Tbar_btn_OpenFolder ;{
             If ThreadGalerie = 0
               If ChInitial$ = ""
                 ChInitial$ = GetUserDirectory(#PB_Directory_Pictures)
               Else 
                 ChInitial$ = ChInitial$
               EndIf
               ImagesDir$ = PathRequester("Sélectionnez un dossier d'images, elles seront ajoutées à la galerie", ChInitial$,WindowID(#WinViewer)) 
               If ImagesDir$<>""
                 ChInitial$ = ImagesDir$                 
                 If ListSize(ScrollShowImage()) <> 0
                   FreeGalerie()
                   ClearList(ScrollShowImage())
                 EndIf
                 CreateGallery(ImagesDir$) 
               EndIf
             EndIf 
             ;}               
           Case #Tbar_btn_CloseImage ;{
             ImgInit = IsImage(#PhotoLoad) 
             If ImgInit <> 0 
               SetGadgetState(#PhotoView, 0)   
               ResizeGadget(#PhotoView, 0,0,0,0)
               StatusBarText(#StatusViewer, 4, "Taille : ")
               StatusBarText(#StatusViewer, 3, "Dimensions : ")
               StatusBarText(#StatusViewer, 2, "Vue :")
               FreeImage(#PhotoLoad)
             EndIf 
             ;}   
           Case #Tbar_btn_Redim : DisplayPopupMenu(#MenuSizes,WindowID(#WinViewer))
           Case #Tbar_btn_ActualSize;{
             If IsImage(#PhotoLoad) <> 0
               Hauteur = ImageHeight(#PhotoLoad)  
               Largeur = ImageWidth(#PhotoLoad) 
               SetMenuItemText(#PopUp_ActualSize,#DisplaySizeImage,"Dimensions image affichée : "+Str(Largeur)+" x "+Str(Hauteur))
               DisplayPopupMenu(#PopUp_ActualSize,WindowID(#WinViewer))
             Else 
               MessageRequester("Image","Pas d'image affichée.",#PB_MessageRequester_Warning,WindowID(#WinViewer))
             EndIf 
             ;}
           Case #Tbar_btn_ZoomIn : ZoomAuto(1.1)           
           Case #Tbar_btn_ZoomOut ;{ 
             If IsImage(#PhotoLoad)           ;si une image est affichée
               Wimg = ImageWidth(#PhotoLoad)  ;on récupère sa largeur
               Himg = ImageHeight(#PhotoLoad) ;on récupère sa hauteur           
               If Wimg <= 30 Or Himg <= 30
                 MessageRequester("Réduction d'image", "La dimension minimale est atteinte.",#PB_MessageRequester_Ok|#PB_MessageRequester_Info,WindowID(#WinViewer))
               ElseIf Wimg > 30 And Himg > 30
                 ZoomAuto(0.9)
               EndIf 
             EndIf 
             ;}
           Case #Tbar_btn_ZoomPercent : DisplayPopupMenu(#MenuPercentZoom,WindowID(#WinViewer))
             
           Case #Menu_SizeDiv2 : RedimImageSize_Div(2)      
           Case #Menu_SizeDiv4 : RedimImageSize_Div(4)        
           Case #Menu_SizeDiv6 : RedimImageSize_Div(6)        
           Case #Menu_SizeDiv8 : RedimImageSize_Div(8)
             
           Case #Menu_SizeMult2 : RedimImageSize_Mult(2)       
           Case #Menu_SizeMult4 : RedimImageSize_Mult(4)        
           Case #Menu_SizeMult6 : RedimImageSize_Mult(6)        
           Case #Menu_SizeMult8 : RedimImageSize_Mult(8)
             
           Case #Menu_Galerie_OpenFile ;{  
             If PhotoGalerie$
               ShellExecute_(0,"open",PhotoGalerie$,0,0,1)  
             EndIf   ;}  
           Case #Menu_Galerie_FileProperty ;{  
             If PhotoGalerie$
               FileProperty(PhotoGalerie$) 
             EndIf   ;} 
 
           Case #DisplaySizeImage ;{ 
             If IsImage(#PhotoLoad)
               Hauteur = ImageHeight(#PhotoLoad) : ValeurH$ = Str(Hauteur)  
               Largeur = ImageWidth(#PhotoLoad)  : ValeurL$ = Str(Largeur) 
               If ImageName$<>"" 
                 MessageRequester(ImageName$,"Dimensions de l'image affichée :"+Chr(13)+"Largeur : "+ValeurL$+"  pixels"+Chr(13)+"Hauteur : "+ValeurH$+"  pixels"+Chr(13)+"Emplacement : "+NomPhoto$ ,#PB_MessageRequester_Info,WindowID(#WinViewer))  
               EndIf
             EndIf
             ;}    
           Case #DisplayActualSize ;{
             If IsImage(#PhotoLoad)
               If NomPhoto$
                 If LoadImage(#PhotoLoad,NomPhoto$) 
                   Timgx = ImageWidth(#PhotoLoad)  : ValX$ = Str(Timgx) 
                   Timgy = ImageHeight(#PhotoLoad) : ValY$ = Str(Timgy) 
                   SetGadgetState(#PhotoView, ResizeImage(#PhotoLoad,Val(ValX$) ,Val(ValY$))) ; on remet l'image à sa taille réelle et initiale 
                   SetGadgetAttribute(#scroll_image, #PB_ScrollArea_InnerWidth, ImageWidth(#PhotoLoad)) 
                   SetGadgetAttribute(#scroll_image, #PB_ScrollArea_InnerHeight, ImageHeight(#PhotoLoad)) 
                 EndIf
               EndIf 
             EndIf 
             ;} 
             
             ;-#MenuZoomIn           
           Case #ZoomIn_10  : zoom$ = "+10 %"  : ZoomInImage(zoom$) ;{
           Case #ZoomIn_20  : zoom$ = "+20 %"  : ZoomInImage(zoom$)
           Case #ZoomIn_30  : zoom$ = "+30 %"  : ZoomInImage(zoom$)
           Case #ZoomIn_40  : zoom$ = "+40 %"  : ZoomInImage(zoom$)
           Case #ZoomIn_50  : zoom$ = "+50 %"  : ZoomInImage(zoom$)
           Case #ZoomIn_60  : zoom$ = "+60 %"  : ZoomInImage(zoom$)
           Case #ZoomIn_70  : zoom$ = "+70 %"  : ZoomInImage(zoom$)
           Case #ZoomIn_80  : zoom$ = "+80 %"  : ZoomInImage(zoom$)
           Case #ZoomIn_90  : zoom$ = "+90 %"  : ZoomInImage(zoom$) 
           Case #ZoomIn_100 : zoom$ = "+100 %" : ZoomInImage(zoom$)
           Case #ZoomIn_120 : zoom$ = "+120 %" : ZoomInImage(zoom$)
           Case #ZoomIn_140 : zoom$ = "+140 %" : ZoomInImage(zoom$)
           Case #ZoomIn_150 : zoom$ = "+150 %" : ZoomInImage(zoom$)
           Case #ZoomIn_160 : zoom$ = "+160 %" : ZoomInImage(zoom$)
           Case #ZoomIn_180 : zoom$ = "+180 %" : ZoomInImage(zoom$)
           Case #ZoomIn_200 : zoom$ = "+200 %" : ZoomInImage(zoom$)
           Case #ZoomIn_220 : zoom$ = "+220 %" : ZoomInImage(zoom$)
           Case #ZoomIn_240 : zoom$ = "+240 %" : ZoomInImage(zoom$)
           Case #ZoomIn_260 : zoom$ = "+260 %" : ZoomInImage(zoom$)
           Case #ZoomIn_280 : zoom$ = "+280 %" : ZoomInImage(zoom$)
           Case #ZoomIn_300 : zoom$ = "+300 %" : ZoomInImage(zoom$)
           Case #ZoomIn_320 : zoom$ = "+320 %" : ZoomInImage(zoom$)
           Case #ZoomIn_340 : zoom$ = "+340 %" : ZoomInImage(zoom$)
           Case #ZoomIn_360 : zoom$ = "+360 %" : ZoomInImage(zoom$)
           Case #ZoomIn_380 : zoom$ = "+380 %" : ZoomInImage(zoom$)
           Case #ZoomIn_400 : zoom$ = "+400 %" : ZoomInImage(zoom$)
           ;}  
             ;-#MenuZoomOut 
           Case #ZoomOut_10 : zoom$ = "-10 %" : ZoomOutImage(zoom$) ;{
           Case #ZoomOut_20 : zoom$ = "-20 %" : ZoomOutImage(zoom$)
           Case #ZoomOut_30 : zoom$ = "-30 %" : ZoomOutImage(zoom$)
           Case #ZoomOut_40 : zoom$ = "-40 %" : ZoomOutImage(zoom$)
           Case #ZoomOut_50 : zoom$ = "-50 %" : ZoomOutImage(zoom$)
           Case #ZoomOut_60 : zoom$ = "-60 %" : ZoomOutImage(zoom$)
           Case #ZoomOut_70 : zoom$ = "-70 %" : ZoomOutImage(zoom$)
           Case #ZoomOut_80 : zoom$ = "-80 %" : ZoomOutImage(zoom$)
           Case #ZoomOut_90 : zoom$ = "-90 %" : ZoomOutImage(zoom$)
           ;}  
         EndSelect
       
     Case #PB_Event_CloseWindow : Quitter = 1 
  
EndSelect 
;-END 
Until Quitter 
End      
à plus :)
Dernière modification par Jacobus le jeu. 15/mai/2025 8:10, modifié 5 fois.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Créer une galerie d'images simplement

Message par cage »

Bonjour,

@Jacobus: Merci pour le partage.

Je viens de tester sans rencontrer de soucis.
L'interface est propre et le code est propre et bien lisible.
Je n'ai pas assez d'images sur mon PC pour tester a fond et voir ce problème de Thread et de disparition d'images.
Je vais essayer de me créer un dossier avec pas mal d'images pour tester.

Je ferais un petit retour dès que possible.

cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Créer une galerie d'images simplement

Message par Jacobus »

Salut cage,
merci pour le retour. J'ai eu les réponses aux questions sur le forum anglais. Il s'avère qu'il y a certaines limitations dans PB qui ne permettent pas de procéder comme je l'ai fait. Il ne faut pas créer de gadgets dynamiques dans un Thread, je dois donc revoir la procédure. Il faut faire cela en deux temps si je puis dire, créer les gadgets dans la boucle principale et n'utiliser un Thread que pour l'affichage des images.
Quant à l'affichage de plusieurs centaines d'images, la ScrollAreaGadget() est limitée comme le nombre de gadgets que l'on peut créer.
Etant donné que j'ai des dizaines de milliers de photos ça va pas le faire, il faut que je revoie ma copie... En attendant il vaut mieux ne pas utiliser la procédure en mode "Thread".
Je mettrai le code à jour dès que j'aurai corrigé ça.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Créer une galerie d'images simplement

Message par Kwai chang caine »

Sacré boulot 8O
Ici le programme traine un peu pour visionner et charger les images d'un dossier
Avec ou sans MULTITHREAD, mais je pense que ça doit venir de ma machine :oops:
Bravo et merci du partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Créer une galerie d'images simplement

Message par Jacobus »

Salut KCC,
c'est possible que la lenteur vienne de ta machine, car perso je n'ai pas de problèmes de ressources sur mes machines, même en chargeant 300 ou 400 photos. Le traitement d'images fais partie de ce qui prend le plus de puissance et de mémoire.
Dans tous les cas, procéder comme je l'ai fait n'est pas judicieux pour l'affichage complet d'une galerie, ou alors avec une centaine d'images max.
Il vaut mieux créer une zone d'images simples, style timbres (ou thumbnails) qui prendra moins de ressources et utiliser ma méthode avec Panelgadget() pour afficher seulement les images qui ont été ouvertes (genre fichiers récents ou en cours d'utilisation) un peu comme le fait "PAINT.net" si tu connais.
C'est vers quoi je m'oriente pour gérer cette visionneuse et mes photos.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
AntoineB
Messages : 3
Inscription : dim. 13/avr./2025 23:21

Re: Créer une galerie d'images simplement

Message par AntoineB »

Bonjour Jacobus,

Merci pour ce partage très riche ! Je découvre PureBasic, donc je ne peux pas encore juger du code, mais j’ai trouvé ton approche très claire, surtout le choix du PanelGadget() pour combiner image + EXIF, c’est une belle idée.

Je comprends mieux les limites évoquées concernant les threads et la ScrollArea après avoir lu ton retour. J’aime beaucoup ta piste d’évolution vers un affichage de type “thumbnails actifs” à la Paint.NET. C’est exactement ce que j’aurais envie d’utiliser dans une appli photo légère.

Hâte de voir la suite quand tu mettras à jour le code

Antoine
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Créer une galerie d'images simplement

Message par Jacobus »

Bonjour AntoineB,
Je suis sur autre chose actuellement, mais dès que je pourrai je modifierai le code pour en proposer un fonctionnel.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Mindphazer
Messages : 693
Inscription : mer. 24/août/2005 10:42

Re: Créer une galerie d'images simplement

Message par Mindphazer »

Pas sûr que cet AntoineB soit fait de chair et d'os !!
Bureau : Win10 64bits
Maison : Macbook Pro M3 16" SSD 512 Go / Ram 24 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
AntoineB
Messages : 3
Inscription : dim. 13/avr./2025 23:21

Re: Créer une galerie d'images simplement

Message par AntoineB »

Mindphazer a écrit : ven. 18/avr./2025 16:32 Pas sûr que cet AntoineB soit fait de chair et d'os !!
@Mindphazer : Peut-être qu’AntoineB est une IA spécialisée en PureBasic... formée sur tous les projets de Jacobus depuis 2004 😄
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Créer une galerie d'images simplement

Message par Jacobus »

AntoineB a écrit : jeu. 24/avr./2025 14:06
Mindphazer a écrit : ven. 18/avr./2025 16:32 Pas sûr que cet AntoineB soit fait de chair et d'os !!
@Mindphazer : Peut-être qu’AntoineB est une IA spécialisée en PureBasic... formée sur tous les projets de Jacobus depuis 2004 😄
Mindphazer, il semble que tu aies raison, AntoineB doit être "the Big Bot" d'IA :)
Mais elle ne va pas aller loin si elle n'est formée que sur mes projets... :lol:
Quoi qu'il en soit, si problème il y a, les modos sont là.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Créer une galerie d'images simplement

Message par Jacobus »

Pour en revenir au sujet, et afin de faire avancer un peu le schmilblic et vu le temps magnifique, j'ai revu mon code.
Pour toutes celles et ceux qui veulent tenter la création d'une galerie d'images avec cette méthode, j'ai mis à jour avec quelques options de plus.
Pour l'instant la gestion des images et leur affichage. Le traitement de ces mêmes images, ce sera pour plus tard.
@+
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Itsy Bitsy
Messages : 13
Inscription : lun. 24/juin/2019 12:19

Re: Créer une galerie d'images simplement

Message par Itsy Bitsy »

Bonjour Jacobus,

Merci pour ce petit programme graphique efficace.

Je remonte un petit disfonctionnement facile à corriger :

Lorsque l'on double clique sur 3 images à gauche et qu'elles sont stockées à droite tout fonctionne comme prévu, puis lorsqu'on supprime toutes les images à droite, cela fonctionne bien, mais lorsque qu'on double clique sur une image à gauche, bien à droite il y a un espace vide suivit de l'image.

Cela semble être un problème de PosyImg pas revenu à =2.

Code : Tout sélectionner

          Case ScrollViewed()\BtnRemove ;{
             ; Release of all associated gadgets, the Panel last
             ; Libération de tous les gadgets associés, le Panel en dernier
             FreeGadget(ScrollViewed()\BtnOpen)
             FreeGadget(ScrollViewed()\BtnRemove)
             FreeGadget(ScrollViewed()\ViewImage)
             FreeGadget(ScrollViewed()\Panel)
             ; Deleting the item from the list / Suppression de l'élément dans la liste
             DeleteElement(ScrollViewed(),1) 
             ; After deleting the element, the display is adjusted so that there is no gap.
             ; The easiest way to do this is to resize all the PanelGadget()s in the list
             ; Après la suppression de l'élément on ajuste l'affichage pour qu'il n'y ait pas de trou.
             ; Pour cela le plus simple est de redimensionner tous les PanelGadget() de la liste

             PosyImg = 2 ; <- *** DEPLACEMENT ICI ***

             If ListIndex(ScrollViewed())<>-1
               ; PosyImg = 2 <- *** A SUPPRIMER ***
               For Pan = 0 To ListSize(ScrollViewed.ImageViewed())-1     
                 SelectElement(ScrollViewed(),Pan)         
                 ResizeGadget(ScrollViewed()\Panel,0,PosyImg, 200, 100) 
                 PosyImg = PosyImg + 102
               Next
             EndIf
             ;}
Bonne continuation.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Créer une galerie d'images simplement

Message par Jacobus »

Bonjour Itsy Bitsy,
merci pour ce retour et bien vu. :wink:
La correction que tu as apporté a résolu le problème :)
Je modifie le code initial en conséquence.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Répondre