PureBasic

Forums PureBasic
Nous sommes le Lun 20/Mai/2013 18:53

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 13 messages ] 
Auteur Message
 Sujet du message: Agencement de code pour CanvasGadget ?
MessagePosté: Jeu 08/Mar/2012 18:58 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 5214
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:
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

_________________
.: Ar-S :. - Windows 8 x64 - Radeon HD 7870 - PB 5.11
LDV MULTIMEDIA : Assistance informatique Isère (38) Oyeu
PURE BASIC forum non officiel : Forum PB


Haut
 Profil  
 
 Sujet du message: Re: Agencement de code pour CanvasGadget ?
MessagePosté: Ven 09/Mar/2012 9:31 
Hors ligne

Inscription: Mer 14/Sep/2011 16:59
Messages: 334
Plutôt comme ça :

Code:

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.


Haut
 Profil  
 
 Sujet du message: Re: Agencement de code pour CanvasGadget ?
MessagePosté: Ven 09/Mar/2012 12:32 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 5214
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:

; 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

_________________
.: Ar-S :. - Windows 8 x64 - Radeon HD 7870 - PB 5.11
LDV MULTIMEDIA : Assistance informatique Isère (38) Oyeu
PURE BASIC forum non officiel : Forum PB


Haut
 Profil  
 
 Sujet du message: Re: Agencement de code pour CanvasGadget ?
MessagePosté: Ven 09/Mar/2012 17:44 
Hors ligne

Inscription: Mer 14/Sep/2011 16:59
Messages: 334
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:
; 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.


Haut
 Profil  
 
 Sujet du message: Re: Agencement de code pour CanvasGadget ?
MessagePosté: Sam 10/Mar/2012 18:55 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 5214
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.

_________________
.: Ar-S :. - Windows 8 x64 - Radeon HD 7870 - PB 5.11
LDV MULTIMEDIA : Assistance informatique Isère (38) Oyeu
PURE BASIC forum non officiel : Forum PB


Haut
 Profil  
 
 Sujet du message: Re: Agencement de code pour CanvasGadget ?
MessagePosté: Sam 10/Mar/2012 20:54 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 21/Mai/2005 17:50
Messages: 889
non mais je comprend pas pourquoi tu as mis la partie de code suivante :
Code:
           
          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 ;))


Haut
 Profil  
 
 Sujet du message: Re: Agencement de code pour CanvasGadget ?
MessagePosté: Sam 10/Mar/2012 21:00 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 21/Mai/2005 17:50
Messages: 889
très rapidement un code :

regarde les ligne 162 et le groupe à 169-192

Code:
; 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 ;))


Haut
 Profil  
 
 Sujet du message: Re: Agencement de code pour CanvasGadget ?
MessagePosté: Dim 11/Mar/2012 11:25 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 5214
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.

_________________
.: Ar-S :. - Windows 8 x64 - Radeon HD 7870 - PB 5.11
LDV MULTIMEDIA : Assistance informatique Isère (38) Oyeu
PURE BASIC forum non officiel : Forum PB


Haut
 Profil  
 
 Sujet du message: Re: Agencement de code pour CanvasGadget ?
MessagePosté: Dim 11/Mar/2012 13:49 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 21/Mai/2005 17:50
Messages: 889
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 ;))


Haut
 Profil  
 
 Sujet du message: Re: Agencement de code pour CanvasGadget ?
MessagePosté: Lun 12/Mar/2012 18:41 
Hors ligne

Inscription: Mer 14/Sep/2011 16:59
Messages: 334
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/viewtopic.php?f=27&t=46936

Mesa.


Haut
 Profil  
 
 Sujet du message: Re: Agencement de code pour CanvasGadget ?
MessagePosté: Lun 12/Mar/2012 19:30 
Hors ligne

Inscription: Mer 14/Sep/2011 16:59
Messages: 334
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.


Haut
 Profil  
 
 Sujet du message: Re: Agencement de code pour CanvasGadget ?
MessagePosté: Lun 12/Mar/2012 19:53 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 21/Mai/2005 17:50
Messages: 889
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:
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 ;))


Haut
 Profil  
 
 Sujet du message: Re: Agencement de code pour CanvasGadget ?
MessagePosté: Jeu 15/Mar/2012 10:30 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 4440
Localisation: Isere
Citation:
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


Haut
 Profil  
 
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 13 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Bing [Bot] et 0 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye