Agencement de code pour CanvasGadget ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Agencement de code pour CanvasGadget ?

Message par Ar-S »

Salut,
Est-ce que quelqu'un pourrait mettre un exemple concret et simple de l'agencement du code pour utiliser un CanvasGadget, pour ce qui concerne les evenements de la boucle principale ?
- Fenêtre : #WIN
- CanvasGadget : #CANVAS (créé avec les flag #PB_Canvas_ClipMouse|#PB_Canvas_Keyboard)
- Racourcis clavier : AddKeyboardShortcut(#WIN, #PB_Shortcut_Escape, #CANVAS_ESC )
- #CANVAS_ESC = 100

Est-ce que cet agencement est le bon ?
Pouvez vous le compléter avec la gestion des flèches.

Code : Tout sélectionner

Repeat
  Delay(1)
  Select WindowEvent()
    Case #PB_Event_Gadget
      
      Select EventGadget()
        Case #CANVAS ; Le canvasgadget
          
          MouseCx = GetGadgetAttribute(#CANVAS, #PB_Canvas_MouseX)
          MouseCy = GetGadgetAttribute(#CANVAS, #PB_Canvas_Mousey)
          
          Select EventType() 
              
            Case #PB_EventType_LeftButtonDown 
              Debug "Clique gauche "
              
          EndSelect
          
          
          Select #PB_Canvas_Key 
            Case #CANVAS_ESC
              quite = 1
          EndSelect
          
      EndSelect
      
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #WIN
          CloseWindow(#WIN)
          Break
      EndSelect
  EndSelect
Until quite = 1
Merci
~~~~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
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Agencement de code pour CanvasGadget ?

Message par Mesa »

Plutôt comme ça :

Code : Tout sélectionner


Enumeration
  #WIN
  #canvas
EndEnumeration


OpenWindow(#WIN, 0, 0, 460, 400, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(#Canvas, 10, 10, 380, 380, #PB_Canvas_ClipMouse|#PB_Canvas_Keyboard)


Repeat
  ;Delay(1)
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      
      Select EventGadget()
        Case #CANVAS ; Le canvasgadget
          
          MouseCx = GetGadgetAttribute(#CANVAS, #PB_Canvas_MouseX)
          MouseCy = GetGadgetAttribute(#CANVAS, #PB_Canvas_MouseY)
          
          Select EventType()
              
            Case #PB_EventType_LeftButtonDown
              Debug "Clique gauche "
              
            Case #PB_EventType_KeyUp
              quitte=GetGadgetAttribute(#CANVAS, #PB_Canvas_Key)
              ;Debug quitte
              If quitte=27;27 = esc
                quit=1
              EndIf
          EndSelect
          
      EndSelect
      
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #WIN
          CloseWindow(#WIN)
          Break
      EndSelect
  EndSelect
Until quit = 1
Mesa.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Agencement de code pour CanvasGadget ?

Message par Ar-S »

Merci Mesa.

J'espère que la doc fr sera traduite en français dans la version 4.61 finale...
Ce serait sympa aussi que pour un tel gadget, plusieurs exemples soient donnés. Faire défiler des images chargées précédemment, un petit 'slideshow' par exemple (c'est ce que j'essaye de faire depuis 2 jours sans succès).
Je sais ô combien faire une doc n'est pas aisée et je salue le boulot de Fantesie Software mais PB étant destiné à tous les programmeurs (débutant et avancés), un plus gros effort serait appréciable. Un exemple concret pour chaque fonction (voir chaque Flag) devrait être mis en place. Cela fait maintenant plusieurs années que je possède et pratique du PB. Je ne suis pas un "codeur dans l'âme" mais je m'accroche.
Je ne pense pas non plus être plus con qu'un autre pour comprendre une doc et c'est souvent que certains exemples ne sont pas assez parlant (en ce qui me concerne). Pour finir sur une note plus fun, je tiens tout de même à redire que je trouve PB formidable, et c'est sans doute de ne pas arriver à l'exploiter plein pot qui me frustre.

Pour en revenir à du code, voilà ou j'en suis.

But du programme :
- Afficher une image dans le canvas, à chaque clique gauche, l'image scroll laissant place à l'image suivante.

Or seule la 1ere image est affichée, et elle scroll uniquement lorsque je bouge la souris. Et vous verrez que l'image se répète, ça fait un affichage tout moisi. (pour le test mon répertoire ne comprend que 4 images).

Merci pour votre aide.

Code : Tout sélectionner


; SlideShow Ar-S

UseJPEGImageDecoder()
UsePNGImageDecoder()

UseJPEGImageEncoder()
UsePNGImageEncoder()

Enumeration 100
  #WIN
  #CANVAS
  #REPIMAGE
EndEnumeration

; **************************************************** 
;-                  INITIALISATION
; ****************************************************

;- CHEMIN A MODIFIER -
Global ImgPath.s = "E:\MULTIMEDIA\PUREBASIC\4.40\Album_photo\" ;PathRequester("Repertoire",path$)
;---------------------

Global path$ = GetCurrentDirectory()
Global NewList Fichier.s()
Global LargSP, HautSP, NbrSprite, NbrFichiers, imgX
#COULFOND = $F0DFD9
quite = 0

LargSP = 1680 
HautSP = 1050

If InitSprite() = 0 Or InitKeyboard()=0 Or InitMouse()=0 Or InitSprite3D()=0
  MessageRequester("Error","Error DirectX",0)
EndIf
ExamineDesktops()
; xmax = DesktopWidth(0)
; ymax = DesktopHeight(0)
#CANVAS_ESC = 27 ; 27 = escape


; **************************************************** 
;-                 PROCEDURES
; ****************************************************

Procedure OpenFullScreenCanvas(Fenetre_num, Canvas_num, Titre_Fenetre.s)
  LS.i = DesktopWidth(0) ; GetSystemMetrics_(#SM_CXSCREEN)
  HS.i = DesktopHeight(0) ; GetSystemMetrics_(#SM_CYSCREEN)
  
  If OpenWindow(Fenetre_num, #PB_Ignore, #PB_Ignore, LS, HS, Titre_Fenetre, #PB_Window_BorderLess|#PB_Window_ScreenCentered)
    CanvasGadget(Canvas_num, 0, 0, LS, HS, #PB_Canvas_ClipMouse|#PB_Canvas_Keyboard )
    AddKeyboardShortcut(Fenetre_num, #PB_Shortcut_Escape, #CANVAS_ESC )
    ProcedureReturn 1
    
  Else
    
    ProcedureReturn 0
  EndIf
EndProcedure

; **************************************************** 
;-                 STRUCTURE
; ****************************************************


Structure Pic
  L.i
  h.i
  X.i
  Y.i
;  Rot.i
  Vit.i
EndStructure

NbrSprite = 0 : NbrFichiers = 0 : Position = 0



; **************************************************** 
;-            CREATION LISTE IMAGES
; ****************************************************

ExamineDirectory(#REPIMAGE, ImgPath,"*.jpg")
  
While NextDirectoryEntry(#REPIMAGE)
  If DirectoryEntryType(#REPIMAGE) = #PB_DirectoryEntry_File
    AddElement(Fichier())
    Fichier() = ImgPath + DirectoryEntryName(#REPIMAGE)
    NbrFichiers + 1
  EndIf
  
  Debug Fichier()
  
Wend
FinishDirectory(#REPIMAGE)

NbrSprite = NbrFichiers - 1
Global Dim SP.Pic(NbrSprite)


; **************************************************** 
;-              OUVERTURE FENETRE
; ****************************************************

Lancement = OpenFullScreenCanvas(#WIN, #CANVAS, "test")
If Lancement = 0
  Debug "Erreur"
  End
EndIf

; **************************************************** 
;-             CHARGEMENT DES IMAGES
; ****************************************************

For NumIMG = 0 To NbrSprite
  
  LoadImage(NumIMG, Fichier())
  Debug "NumIMG : " + Str(NumIMG) + " " + Fichier() ;-TEST NumIMG
  
  Largeur = ImageWidth(NumIMG)
  Hauteur = ImageHeight(NumIMG)
  
  If Largeur > Hauteur
    NewL = LargSP
    NewH = NewL * Hauteur / Largeur
    
  ElseIf Hauteur > Largeur
    NewH = HautSP
    NewL = NewH * Largeur / Hauteur
    
  ElseIf Hauteur = Largeur
    NewL = LargSP
    NewH = HautSP
  EndIf

  SP(NumIMG)\L = NewL
  SP(NumIMG)\h = NewH
  SP(NumIMG)\X = LS
  SP(NumIMG)\Y = 0
  SP(NumIMG)\Vit = 10
   
  Debug "L : "+ Str(SP(NumIMG)\L) ;-TEST L
  Debug "Position X : " + Str(Position)

  ResizeImage(NumIMG, SP(NumIMG)\L, SP(NumIMG)\h)
  
Next


; **************************************************** 
;-           BOUCLE
; ****************************************************

NumIMG = 0
Repeat
  Delay(1)
  Debug "NumIMG : "+Str(NumIMG)
  Debug "imageId : "+ Str(ImageID(NumIMG))
  
  MouseCx = GetGadgetAttribute(#CANVAS, #PB_Canvas_MouseX)
  MouseCy = GetGadgetAttribute(#CANVAS, #PB_Canvas_Mousey)
  
  StartDrawing(CanvasOutput(#CANVAS))
     DrawImage(ImageID(NumIMG), SP(NumIMG)\X, SP(NumIMG)\Y , SP(NumIMG)\L, SP(NumIMG)\h)  
    ;DrawImage(ImageID(NumIMG), MouseCx - (SP(NumIMG)\L / 2) , MouseCy - (SP(NumIMG)\h / 2) , SP(NumIMG)\L, SP(NumIMG)\h)  
  StopDrawing()
  
  SP(NumIMG)\X - SP(NumIMG)\Vit
    
  Event = WaitWindowEvent()
  

  
  If Event = #PB_Event_Gadget
    
    Select EventGadget()
        
      Case #CANVAS ; Le canvasgadget
        
        
        
        ; SP(NumIMG)\X - SP(NumIMG)\Vit
        ; If SP(NumIMG)\X > 0
        ; SP(NumIMG)\X = 0
        ; EndIf
        
        Select EventType() 
            
          Case #PB_EventType_LeftButtonDown 
            Debug "Clique gauche => NbrSprite : " + Str(NbrSprite)
            
            NumIMG + 1
            
            If NumIMG > NbrSprite
              NumIMG = 0
            EndIf
           
            
          Case #PB_EventType_rightButtonDown   
            For i = 0 To NbrDeSprite
              FreeImage(i)
            Next
            quite = 1
            
          Case #PB_EventType_KeyUp 
            quitte = GetGadgetAttribute(#CANVAS, #PB_Canvas_Key) 
            ;Debug quitte 
            If quitte = #CANVAS_ESC
              quite=1 
            EndIf 

        EndSelect
        
        
    EndSelect
    
    If Event = EventWindow()
      CloseWindow(#WIN)
      Break
    EndIf
    
EndIf
    
Until quite = 1
~~~~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
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Agencement de code pour CanvasGadget ?

Message par Mesa »

C'est presque bon, la touche esc ne fonctionne pas et je ne vois pas pourquoi.
Avec beaucoup de photos le chargement est trop long alors il faudrait revoir la boucle pour charger les photos par lot de 5 par exemple.
Je pense que c'est une bonne base, à améliorer.

Code : Tout sélectionner

; SlideShow Ar-S

UseJPEGImageDecoder()
UsePNGImageDecoder()

UseJPEGImageEncoder()
UsePNGImageEncoder()

Enumeration 100
  #WIN
  #CANVAS
  #REPIMAGE
EndEnumeration

; ****************************************************
;-                  INITIALISATION
; ****************************************************

;- CHEMIN A MODIFIER -
Global ImgPath.s = "F:\" ;PathRequester("Repertoire",path$)
;---------------------

Global path$ = GetCurrentDirectory()
Global NewList Fichier.s()
Global LargSP, HautSP, NbrSprite, NbrFichiers, imgX
#COULFOND = $F0DFD9
quite = 0

LargSP = 1680
HautSP = 1050

; If InitSprite() = 0 Or InitKeyboard()=0 Or InitMouse()=0 Or InitSprite3D()=0
;   MessageRequester("Error","Error DirectX",0)
; EndIf
ExamineDesktops()
; xmax = DesktopWidth(0)
; ymax = DesktopHeight(0)
#CANVAS_ESC = 27 ; 27 = escape
Global LS,HS

; ****************************************************
;-                 PROCEDURES
; ****************************************************

Procedure OpenFullScreenCanvas(Fenetre_num, Canvas_num, Titre_Fenetre.s)
  LS = DesktopWidth(0) ; GetSystemMetrics_(#SM_CXSCREEN)
  HS = DesktopHeight(0) ; GetSystemMetrics_(#SM_CYSCREEN)
  
  If OpenWindow(#WIN, #PB_Ignore, #PB_Ignore, LS, HS, Titre_Fenetre, #PB_Window_BorderLess|#PB_Window_ScreenCentered)
    CanvasGadget(#CANVAS, 0, 0, LS, HS, #PB_Canvas_ClipMouse|#PB_Canvas_Keyboard )
    ;AddKeyboardShortcut(#WIN, #PB_Shortcut_Escape, #CANVAS_ESC )
    ProcedureReturn 1
    
  Else
    
    ProcedureReturn 0
  EndIf
EndProcedure

; ****************************************************
;-                 STRUCTURE
; ****************************************************


Structure Pic
  L.i
  h.i
  X.i
  Y.i
  ;  Rot.i
  Vit.i
EndStructure

NbrSprite = 0 : NbrFichiers = 0 : Position = 0



; ****************************************************
;-            CREATION LISTE IMAGES
; ****************************************************

ExamineDirectory(#REPIMAGE, ImgPath,"*.jpg")

While NextDirectoryEntry(#REPIMAGE)
  If DirectoryEntryType(#REPIMAGE) = #PB_DirectoryEntry_File
    AddElement(Fichier())
    Fichier() = ImgPath + DirectoryEntryName(#REPIMAGE)
    NbrFichiers + 1
  EndIf
  
  Debug Fichier()
  
Wend
FinishDirectory(#REPIMAGE)

NbrSprite = NbrFichiers - 1
Global Dim SP.Pic(NbrSprite)


; ****************************************************
;-              OUVERTURE FENETRE
; ****************************************************

Lancement = OpenFullScreenCanvas(#WIN, #CANVAS, "test")
If Lancement = 0
  Debug "Erreur"
  End
EndIf

; ****************************************************
;-             CHARGEMENT DES IMAGES
; ****************************************************
NumIMG = 0
ForEach fichier()
;For NumIMG = 0 To 4;NbrSprite
  
  LoadImage(NumIMG, Fichier())
  Debug "NumIMG : " + Str(NumIMG) + " " + Fichier() ;-TEST NumIMG
  
  Largeur = ImageWidth(NumIMG)
  Hauteur = ImageHeight(NumIMG)
  
  If Largeur > Hauteur
    NewL = LargSP
    NewH = NewL * Hauteur / Largeur
    
  ElseIf Hauteur > Largeur
    NewH = HautSP
    NewL = NewH * Largeur / Hauteur
    
  ElseIf Hauteur = Largeur
    NewL = LargSP
    NewH = HautSP
  EndIf
  
  SP(NumIMG)\L = NewL
  SP(NumIMG)\h = NewH
  SP(NumIMG)\X = LS
  SP(NumIMG)\Y = 0
  SP(NumIMG)\Vit = 10
  
  ;Debug "L : "+ Str(SP(NumIMG)\L) ;-TEST L
  ;Debug "Position X : " + Str(Position)
  
  ResizeImage(NumIMG, SP(NumIMG)\L, SP(NumIMG)\h)
  NumIMG +1
  
;   If NumIMG>5
;     Break
;     EndIf
Next

Global max=NumIMG-1

; ****************************************************
;-           BOUCLE
; ****************************************************
cumul=0
NumIMG = 0
Repeat
  ;Delay(1)
  ;Event = WaitWindowEvent()
  ;If Event = #PB_Event_Gadget
  Select WaitWindowEvent(200)
    Case #PB_Event_Gadget
    Select EventGadget()
      Case #CANVAS ; Le canvasgadget
        
        
        
        ; SP(NumIMG)\X - SP(NumIMG)\Vit
        ; If SP(NumIMG)\X > 0
        ; SP(NumIMG)\X = 0
        ; EndIf
        
        Select EventType()
            
            Case #PB_EventType_KeyUp
            quitte = GetGadgetAttribute(#CANVAS, #PB_Canvas_Key)
            ;Debug quitte
            If quitte = #CANVAS_ESC
              quite=1
            EndIf
            
            
          Case #PB_EventType_MouseMove
            ;Debug "NumIMG : "+Str(NumIMG)
            ;Debug "imageId : "+ Str(ImageID(NumIMG))
            If NumIMG>max
              End
            EndIf
              
            MouseCx = GetGadgetAttribute(#CANVAS, #PB_Canvas_MouseX)
            MouseCy = GetGadgetAttribute(#CANVAS, #PB_Canvas_MouseY)
            
            StartDrawing(CanvasOutput(#CANVAS))
            DrawImage(ImageID(NumIMG), SP(NumIMG)\X, SP(NumIMG)\Y , SP(NumIMG)\L, SP(NumIMG)\h) 
            ;DrawImage(ImageID(NumIMG), MouseCx - (SP(NumIMG)\L / 2) , MouseCy - (SP(NumIMG)\h / 2) , SP(NumIMG)\L, SP(NumIMG)\h) 
            ;Debug SP(NumIMG)\X
            StopDrawing()
            
            SP(NumIMG)\X - SP(NumIMG)\Vit
            cumul + SP(NumIMG)\Vit
;             Debug cumul
;             Debug SP(NumIMG)\L
            
            If cumul>SP(NumIMG)\L
              NumIMG+1
              cumul=0
              EndIf
            
          Case #PB_EventType_LeftButtonDown
            Debug "Clique gauche => NbrSprite : " + Str(NbrSprite)
            
            NumIMG + 1
            
            
            If NumIMG > NbrSprite
              NumIMG = 0
            EndIf
                      
            
          Case #PB_EventType_RightButtonDown   
            For i = 0 To NbrDeSprite
              FreeImage(i)
            Next
            quite = 1
            
          
            
        EndSelect
        
        
    EndSelect
    
    If Event = EventWindow()
      CloseWindow(#WIN)
      Break
    EndIf

  ;EndIf
   EndSelect
Until quite = 1
Mesa.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Agencement de code pour CanvasGadget ?

Message par Ar-S »

Ok merci Mesa, effectivement ça tenait pas à grand chose. Ce n'est pas encore le resultat escompté mais au moins toutes les images apparaissent et ça fait déjà plaisir :D.
Pour le ESC effectivement c'est étrange. J'obterai pour un raccourcis clavier classique.
~~~~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
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Agencement de code pour CanvasGadget ?

Message par graph100 »

non mais je comprend pas pourquoi tu as mis la partie de code suivante :

Code : Tout sélectionner

           
          Case #PB_EventType_MouseMove
en plus tu dessines dans ce case ci !! c'est nimp (excuse moi ^^ ).

Regarde l'exemple de mon ImageSlideGadget() dans l'archive de mon projet.
J'ai un indice pour toi : le mot clé de ton problème est : Timer !! (AMHA)
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Agencement de code pour CanvasGadget ?

Message par graph100 »

très rapidement un code :

regarde les ligne 162 et le groupe à 169-192

Code : Tout sélectionner

; SlideShow Ar-S

UseJPEGImageDecoder()
UsePNGImageDecoder()

UseJPEGImageEncoder()
UsePNGImageEncoder()

Enumeration 100
	#WIN
	#CANVAS
	#REPIMAGE
EndEnumeration

; ****************************************************
;-                  INITIALISATION
; ****************************************************

;- CHEMIN A MODIFIER -
Global ImgPath.s = "F:\" ;PathRequester("Repertoire",path$)
;---------------------

Global path$ = GetCurrentDirectory()
Global NewList Fichier.s()
Global LargSP, HautSP, NbrSprite, NbrFichiers, imgX
#COULFOND = $F0DFD9
quite = 0

LargSP = 1680
HautSP = 1050

; If InitSprite() = 0 Or InitKeyboard()=0 Or InitMouse()=0 Or InitSprite3D()=0
;   MessageRequester("Error","Error DirectX",0)
; EndIf
ExamineDesktops()
; xmax = DesktopWidth(0)
; ymax = DesktopHeight(0)
#CANVAS_ESC = 27 ; 27 = escape
Global LS,HS

; ****************************************************
;-                 PROCEDURES
; ****************************************************

Procedure OpenFullScreenCanvas(Fenetre_num, Canvas_num, Titre_Fenetre.s)
	LS = DesktopWidth(0) ; GetSystemMetrics_(#SM_CXSCREEN)
	HS = DesktopHeight(0) ; GetSystemMetrics_(#SM_CYSCREEN)
	
	If OpenWindow(#WIN, #PB_Ignore, #PB_Ignore, LS, HS, Titre_Fenetre, #PB_Window_BorderLess|#PB_Window_ScreenCentered)
		CanvasGadget(#CANVAS, 0, 0, LS, HS, #PB_Canvas_ClipMouse|#PB_Canvas_Keyboard )
		;AddKeyboardShortcut(#WIN, #PB_Shortcut_Escape, #CANVAS_ESC )
		ProcedureReturn 1
		
	Else
		
		ProcedureReturn 0
	EndIf
EndProcedure

; ****************************************************
;-                 STRUCTURE
; ****************************************************


Structure Pic
	L.i
	h.i
	X.i
	Y.i
	;  Rot.i
	Vit.i
EndStructure

NbrSprite = 0 : NbrFichiers = 0 : Position = 0



; ****************************************************
;-            CREATION LISTE IMAGES
; ****************************************************

ExamineDirectory(#REPIMAGE, ImgPath,"*.jpg")

While NextDirectoryEntry(#REPIMAGE)
	If DirectoryEntryType(#REPIMAGE) = #PB_DirectoryEntry_File
		AddElement(Fichier())
		Fichier() = ImgPath + DirectoryEntryName(#REPIMAGE)
		NbrFichiers + 1
	EndIf
	
	Debug Fichier()
	
Wend
FinishDirectory(#REPIMAGE)

NbrSprite = NbrFichiers - 1
Global Dim SP.Pic(NbrSprite)


; ****************************************************
;-              OUVERTURE FENETRE
; ****************************************************

Lancement = OpenFullScreenCanvas(#WIN, #CANVAS, "test")
If Lancement = 0
	Debug "Erreur"
	End
EndIf

; ****************************************************
;-             CHARGEMENT DES IMAGES
; ****************************************************
NumIMG = 0
ForEach fichier()
	;For NumIMG = 0 To 4;NbrSprite
	
	LoadImage(NumIMG, Fichier())
	Debug "NumIMG : " + Str(NumIMG) + " " + Fichier() ;-TEST NumIMG
	
	Largeur = ImageWidth(NumIMG)
	Hauteur = ImageHeight(NumIMG)
	
	If Largeur > Hauteur
		NewL = LargSP
		NewH = NewL * Hauteur / Largeur
		
	ElseIf Hauteur > Largeur
		NewH = HautSP
		NewL = NewH * Largeur / Hauteur
		
	ElseIf Hauteur = Largeur
		NewL = LargSP
		NewH = HautSP
	EndIf
	
	SP(NumIMG)\L = NewL
	SP(NumIMG)\h = NewH
	SP(NumIMG)\X = LS
	SP(NumIMG)\Y = 0
	SP(NumIMG)\Vit = 10
	
	;Debug "L : "+ Str(SP(NumIMG)\L) ;-TEST L
	;Debug "Position X : " + Str(Position)
	
	ResizeImage(NumIMG, SP(NumIMG)\L, SP(NumIMG)\h)
	NumIMG +1
	
	;   If NumIMG>5
	;     Break
	;     EndIf
Next

Global max=NumIMG-1

; ****************************************************
;-           BOUCLE
; ****************************************************
cumul=0
NumIMG = 0


AddWindowTimer(#WIN, 106, 25)

Repeat
	;Delay(1)
	;Event = WaitWindowEvent()
	;If Event = #PB_Event_Gadget
	Select WaitWindowEvent(200)
		Case #PB_Event_Timer
			
			If NumIMG>max
				End
			EndIf
			
			MouseCx = GetGadgetAttribute(#CANVAS, #PB_Canvas_MouseX)
			MouseCy = GetGadgetAttribute(#CANVAS, #PB_Canvas_MouseY)
			
			StartDrawing(CanvasOutput(#CANVAS))
			DrawImage(ImageID(NumIMG), SP(NumIMG)\X, SP(NumIMG)\Y , SP(NumIMG)\L, SP(NumIMG)\h)
			;DrawImage(ImageID(NumIMG), MouseCx - (SP(NumIMG)\L / 2) , MouseCy - (SP(NumIMG)\h / 2) , SP(NumIMG)\L, SP(NumIMG)\h)
			;Debug SP(NumIMG)\X
			StopDrawing()
			
			SP(NumIMG)\X - SP(NumIMG)\Vit
			cumul + SP(NumIMG)\Vit
			;             Debug cumul
			;             Debug SP(NumIMG)\L
			
			If cumul>SP(NumIMG)\L
				NumIMG+1
				cumul=0
			EndIf
			
			
			
		Case #PB_Event_Gadget
			Select EventGadget()
				Case #CANVAS ; Le canvasgadget
					
					
					
					; SP(NumIMG)\X - SP(NumIMG)\Vit
					; If SP(NumIMG)\X > 0
					; SP(NumIMG)\X = 0
					; EndIf
					
					Select EventType()
							
						Case #PB_EventType_KeyUp
							quitte = GetGadgetAttribute(#CANVAS, #PB_Canvas_Key)
							;Debug quitte
							If quitte = #CANVAS_ESC
								quite=1
							EndIf
							
							
							
						Case #PB_EventType_LeftButtonDown
							Debug "Clique gauche => NbrSprite : " + Str(NbrSprite)
							
							NumIMG + 1
							
							
							If NumIMG > NbrSprite
								NumIMG = 0
							EndIf
							
							
						Case #PB_EventType_RightButtonDown   
							For i = 0 To NbrDeSprite
								FreeImage(i)
							Next
							quite = 1
							
							
							
					EndSelect
					
					
			EndSelect
			
			If Event = EventWindow()
				CloseWindow(#WIN)
				Break
			EndIf
			
			;EndIf
	EndSelect
Until quite = 1
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Agencement de code pour CanvasGadget ?

Message par Ar-S »

Effectivement un timer est pratique pour un défilement auto.
Merci à vous. Par contre je suis surpris par l'effet de saccade lors du scroll des images.
~~~~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
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Agencement de code pour CanvasGadget ?

Message par graph100 »

les timers ne sont pas super précis. De plus il faut regarder le temps que met la boucle de dessin par rapport à la valeur du timer.

Peut etre utiliser un thread avec une autre méthode pour le temps ?? (mais faire attention aux delais()
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Agencement de code pour CanvasGadget ?

Message par Mesa »

Il n'était pas question de timer. Tel qu'il est, ce timer ne permet pas d'interagir avec la souris sur le canvas ce qui ne sert absolument à rien dans notre cas, à part le défilement automatique en effet. A moins que... plus tard ...

Bref, on peut utiliser le #PB_EventType_MouseWheel à la place du #PB_EventType_MouseMove mais bonjour la tendinite ;))
Ce que l'on cherche à faire, c'est à se familiariser avec ce gadget, de le prendre en main car c'est un gadget qui reste prometteur voir ici http://www.purebasic.fr/english/viewtop ... 27&t=46936

Mesa.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Agencement de code pour CanvasGadget ?

Message par Mesa »

Pour faire fonctionner la touche esc, il faut que le focus soit sur le canvas.
Il suffit d'ajouter avant la boucle (le repeat ligne 160) : SetActiveGadget(#CANVAS).

Mesa.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Agencement de code pour CanvasGadget ?

Message par graph100 »

effectivement, ou bien cliquer sur le gadget.

Il y a une autre possibilité, c'est d'utiliser le flag mouse_enter (vous le chercherez dans l'aide ^^) pour mettre le gadget actif lorsque la souris entre dedans.

Ensuite pour répondre j'ai lu et essayé de comprendre le but du programme. Pour faire ce qu'il a demandé, il faut passer par les timers (ahma) mais ensuite, pour une s'entrainer à maitriser les canvas, alors faire des trucs avec les différents flags est possible. Du genre revenir à l'image précédente, suivante, ou bien autre chose ?

enfin si vous voulez du code pour traiter les events sur les canvas :

Code : Tout sélectionner

Procedure ICG_CanvasButton_ProcessEvent(*obj.ICG_CanvasButton, event_type) ; procedure traitant les events pour les CanvasButton
	
	Select event_type
		Case  #PB_EventType_LeftButtonDown  
			*obj\Selected ! 1
			*obj\State = #CG_CanvasButton_State_Pressed
			*obj\_Function\RenderGadget()
			
		Case #PB_EventType_MouseEnter, #PB_EventType_LeftButtonUp
			If *obj\Selected
				*obj\State = #CG_CanvasButton_State_HoverSelected
			Else
				*obj\State = #CG_CanvasButton_State_HoverUnSelected
			EndIf
			*obj\_Function\RenderGadget()
			
		Case #PB_EventType_MouseLeave
			If *obj\Selected
				*obj\State = #CG_CanvasButton_State_Selected
			Else
				*obj\State = #CG_CanvasButton_State_Normal
			EndIf
			*obj\_Function\RenderGadget()
			
	EndSelect
	
	If *obj\Selected = 1 And *obj\Flag & #CG_CanvasButton_Toggle = 0
		*obj\Selected = 0
		*obj\_Function\RenderGadget()
	EndIf
	
	If *obj\State > 1
		ProcedureReturn *obj\State
	EndIf
EndProcedure

c'est ma procedure pour gérer les events du canvasbutton de mon projet.
Si ca n'est pas assez compliqué, jetez donc un coup d'oeil sur celle du texteditor() :mrgreen:
la y a du clavier, de la souris, des click, à foison, bref, de quoi faire votre bonheur ! en plus l'exemple fonctionne ^^
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Agencement de code pour CanvasGadget ?

Message par Kwai chang caine »

Est-ce que quelqu'un pourrait mettre un exemple concret et simple de l'agencement du code pour utiliser un CanvasGadget, pour ce qui concerne les evenements de la boucle principale ?
Je viens de tomber sur ça, je crois que vous avez eu la même idée, peut etre ça pourra t'aider :wink:
http://www.purebasic.fr/english/viewtop ... 69#p376569
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre