Images Rollover - méthode des portes coulissantes

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Images Rollover - méthode des portes coulissantes

Message par falsam »

Le rollover est une technique qui permet de changer une image par une autre image, lorsque le curseur de la souris passe sur celle-ci.

la technique employée dans ce code est la méthode des portes coulissantes que certains d'entres vous connaissent si vous exploitez cette technique dans le domaine du WebDesign.

le bouton survolé est composé de deux images. Une pour l'état normal et une autre image l'état survolé. on va les regrouper dans une seule et même image. Ici, par exemple, on crée une image de 200x24 px.

Image

Récupérez cette image depuis le lien ci-dessous et placez la dans le meme dossier que le code que je vous propose.

http://s242132022.onlinehome.fr/Downloa ... outon2.jpg (Clique bouton droit puis enregistrer le lien sous ...)

Code : Tout sélectionner

;Image Rollhover
;

;L'image est au format JPEG 
UseJPEGImageDecoder() 

;Un gadget est il survolé (Joli macro hein ?"
Macro GadgetHoverCheck(x, y, Gadget)
  (((Not x<GadgetX(Gadget)) & (Not y<GadgetY(Gadget))) &(Not x>=(GadgetX(Gadget)+GadgetWidth(Gadget))) & (Not y>=(GadgetY(Gadget)+GadgetHeight(gadget))))
EndMacro

Enumeration
  #MainForm
  
  #ButtonImage1 ;Bouton Image 1
  #ButtonImage2 ;Bouton Image 2
  #ButtonImage3 ;Bouton Image 2
  
  
  #ImageButtons  ;Image dans sa totalité
  #ImageState_Hover ;Image Survolé (Segment 0 longueur 100 Px sur une hauteur de 24 Px)
  #ImageState_Normal ;Image normal (Segment 100 longeur 200 Px sur une hauteur de 24Px)
EndEnumeration

;Position X, Y de la souris 
Global X.i, Y.i

;Chargement de l'image
LoadImage(#ImageButtons, "Bouton2.jpg")
GrabImage(#ImageButtons, #ImageState_Hover, 0,0,100,24)
GrabImage(#ImageButtons, #ImageState_Normal, 100,0,100,24)

;Affichage de notre fenetre 
Procedure MainFormShow()
  OpenWindow(#MainForm,0,0,500,300,"Bouton Image Rollover",#PB_Window_ScreenCentered |#PB_Window_SizeGadget | #PB_Window_SystemMenu)
  ImageGadget(#ButtonImage1,10,20,106,32,ImageID(#ImageState_Normal))
  ImageGadget(#ButtonImage2,120,20,106,32,ImageID(#ImageState_Normal))
  ImageGadget(#ButtonImage3,230,20,106,32,ImageID(#ImageState_Normal))
EndProcedure

;Il y a t'il un bouton survolé
Procedure GetButtonHover()
  SetGadgetState(#ButtonImage1,ImageID(#ImageState_Normal))
  SetGadgetState(#ButtonImage2,ImageID(#ImageState_Normal))
  SetGadgetState(#ButtonImage3,ImageID(#ImageState_Normal))
  
  If GadgetHoverCheck(X,Y,#ButtonImage1)
    SetGadgetState(#ButtonImage1,ImageID(#ImageState_Hover))
  EndIf
  
  If GadgetHoverCheck(X,Y,#ButtonImage2)
    SetGadgetState(#ButtonImage2,ImageID(#ImageState_Hover))
  EndIf
  
  If GadgetHoverCheck(X,Y,#ButtonImage3)
    SetGadgetState(#ButtonImage3,ImageID(#ImageState_Hover))
  EndIf
  
  EndProcedure

MainFormShow()

Repeat
  X=WindowMouseX(#mainform)
  Y=WindowMouseY(#mainform)
  GetButtonHover()
  
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()
          
        Case #ButtonImage1
          Debug "Bouton 1"
          
        Case #ButtonImage2
          Debug "Bouton 2"
              
        Case #ButtonImage3
          Debug "Bouton 3"
          
      EndSelect       

    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Warkering
Messages : 808
Inscription : ven. 08/janv./2010 1:14
Localisation : Québec, Canada

Re: Images Rollover - méthode des portes coulissantes

Message par Warkering »

Merci de partager le code, il est plus beau que celui que j'avais concocté! :wink:
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Images Rollover - méthode des portes coulissantes

Message par Guimauve »

Minuscule correction afin de virer les variables Globales et le double changement d'image des boutons.

Si non chapeau !

A+
Guimauve

Code : Tout sélectionner

;Image Rollhover
;
  
;L'image est au format JPEG 
UseJPEGImageDecoder() 
  
;Un gadget est il survolé (Joli macro hein ?"
Macro GadgetHoverCheck(x, y, Gadget)
  (((Not x<GadgetX(Gadget)) & (Not y<GadgetY(Gadget))) &(Not x>=(GadgetX(Gadget)+GadgetWidth(Gadget))) & (Not y>=(GadgetY(Gadget)+GadgetHeight(gadget))))
EndMacro
  
Enumeration
  
  #MainForm
  
  #ButtonImage1 ;Bouton Image 1
  #ButtonImage2 ;Bouton Image 2
  #ButtonImage3 ;Bouton Image 2
 
  #ImageButtons  ;Image dans sa totalité
  #ImageState_Hover ;Image Survolé (Segment 0 longueur 100 Px sur une hauteur de 24 Px)
  #ImageState_Normal ;Image normal (Segment 100 longeur 200 Px sur une hauteur de 24Px)
  
EndEnumeration
  
;Chargement de l'image
LoadImage(#ImageButtons, "Bouton2.jpg")
GrabImage(#ImageButtons, #ImageState_Hover, 0,0,100,24)
GrabImage(#ImageButtons, #ImageState_Normal, 100,0,100,24)
  
;Affichage de notre fenetre 
Procedure MainFormShow()
  OpenWindow(#MainForm,0,0,500,300,"Bouton Image Rollover",#PB_Window_ScreenCentered |#PB_Window_SizeGadget | #PB_Window_SystemMenu)
  ImageGadget(#ButtonImage1,10,20,106,32,ImageID(#ImageState_Normal))
  ImageGadget(#ButtonImage2,120,20,106,32,ImageID(#ImageState_Normal))
  ImageGadget(#ButtonImage3,230,20,106,32,ImageID(#ImageState_Normal))
EndProcedure
  
;Il y a t'il un bouton survolé
Procedure GetButtonHover()
  
  WinMouseX = WindowMouseX(#mainform)
  WinMouseY = WindowMouseY(#mainform)
  
  If GadgetHoverCheck(WinMouseX, WinMouseY, #ButtonImage1)
    SetGadgetState(#ButtonImage1, ImageID(#ImageState_Hover))
  Else 
    SetGadgetState(#ButtonImage1, ImageID(#ImageState_Normal))
  EndIf
  
  If GadgetHoverCheck(WinMouseX, WinMouseY, #ButtonImage2)
    SetGadgetState(#ButtonImage2, ImageID(#ImageState_Hover))
  Else 
    SetGadgetState(#ButtonImage2, ImageID(#ImageState_Normal))
  EndIf
  
  If GadgetHoverCheck(WinMouseX, WinMouseY, #ButtonImage3)
    SetGadgetState(#ButtonImage3, ImageID(#ImageState_Hover))
  Else 
    SetGadgetState(#ButtonImage3, ImageID(#ImageState_Normal))
  EndIf
  
  
EndProcedure
  
MainFormShow()
  
Repeat
  
  GetButtonHover()
  
  Select WaitWindowEvent()
      
    Case #PB_Event_Gadget
      
      Select EventGadget()
          
        Case #ButtonImage1
          Debug "Bouton 1"
          
        Case #ButtonImage2
          Debug "Bouton 2"
          
        Case #ButtonImage3
          Debug "Bouton 3"
          
      EndSelect       
      
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Images Rollover - méthode des portes coulissantes

Message par Ar-S »

Merci, excellent petit code.
~~~~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
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Images Rollover - méthode des portes coulissantes

Message par Guimauve »

Bonjour à tous,

Une autre mise à jour que j'avais faite et oublié de rediffuser, désolé.

Les changements :
  • - Réorganisation de la création du gadget.
  • - Stockage des informations dans un bloc mémoire, l'adresse est conservé dans le GadgetData de l'ImageGadget qui est utilisé comme base.
  • - Ajout d'une commande de libération des ressources à la fermeture de la fenêtre (voir les commentaires à la fin de l'exemple)
Un petit "Hint" en passant, il est possible de créer de jolis boutons sur le site : http://cooltext.com/
Bien entendu il faut utiliser UsePNGImageDecoder() mais bon ce n'est pas la fin du monde !

Édit : J'ai oublié de mentionner que l'image utilisée pour cet exemple est la même que celle du premier message. Je redonne le lien :

http://s242132022.onlinehome.fr/Downloa ... outon2.jpg

Image

A+
Guimauve

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; CODE GÉNÉRÉ AUTOMATIQUEMENT, NE PAS MODIFIER À
; MOINS D'AVOIR UNE RAISON TRÈS TRÈS VALABLE !!!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Code généré par : Dev-Type V3.126.612
; Nom du projet : RollOverButtonGadget
; Nom du fichier : RollOverButtonGadget.pb
; Version du fichier : 1.0.0
; Programmation : OK
; Programmé par : Falsam
; Modifié par : Guimauve
; Date : 13-03-2011
; Mise à jour : 04-02-2012
; Codé pour PureBasic V4.61
; Plateforme : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Enumeration 
  
  #ROLL_OVER_STATE_HOVER
  #ROLL_OVER_STATE_NORMAL
  #ROLL_OVER_STATE_MAX
  
EndEnumeration 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure <<<<<

Structure RollOverButton
  
  GadgetID.l
  GadgetHandle.l
  StateImage.l[#ROLL_OVER_STATE_MAX]
  
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs <<<<<

Macro GetRollOverButtonGadgetID(RollOverButtonA)
  
  RollOverButtonA\GadgetID
  
EndMacro

Macro GetRollOverButtonGadgetHandle(RollOverButtonA)
  
  RollOverButtonA\GadgetHandle
  
EndMacro

Macro GetRollOverButtonStateImage(RollOverButtonA, Index)
  
  RollOverButtonA\StateImage[Index]
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs <<<<<

Macro SetRollOverButtonGadgetID(RollOverButtonA, P_GadgetID)
  
  GetRollOverButtonGadgetID(RollOverButtonA) = P_GadgetID
  
EndMacro

Macro SetRollOverButtonGadgetHandle(RollOverButtonA, P_GadgetHandle)
  
  GetRollOverButtonGadgetHandle(RollOverButtonA) = P_GadgetHandle
  
EndMacro

Macro SetRollOverButtonStateImage(RollOverButtonA, Index, P_StateImage)
  
  GetRollOverButtonStateImage(RollOverButtonA, Index) = P_StateImage
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Reset <<<<<

Macro ResetRollOverButton(RollOverButtonA)
  
  SetRollOverButtonGadgetID(RollOverButtonA, 0)
  SetRollOverButtonGadgetHandle(RollOverButtonA, 0)
  
  For Index = 0 To #ROLL_OVER_STATE_MAX - 1
    
    If IsImage(GetRollOverButtonStateImage(RollOverButtonA, Index))
      FreeImage(GetRollOverButtonStateImage(RollOverButtonA, Index))
      SetRollOverButtonStateImage(RollOverButtonA, Index, 0)
    EndIf 
    
  Next

EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Le Constructeur <<<<<

Procedure.i CreateNewRollOverButton()

  *RollOverButtonA.RollOverButton = AllocateMemory(SizeOf(RollOverButton))

  If *RollOverButtonA = #Null
    MessageRequester("Fatal Error", "CreateNewRollOverButton() - Impossible to Allocate Memory !")
    End
  EndIf

  ProcedureReturn *RollOverButtonA
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code généré en : 00.002 secondes (45500.00 lignes/seconde) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Macro HoverGadgetCheck(x, y, Gadget)
  
  (((Not x < GadgetX(Gadget)) & (Not y < GadgetY(Gadget))) & (Not x >= (GadgetX(Gadget) + GadgetWidth(Gadget))) & (Not y >= (GadgetY(Gadget) + GadgetHeight(gadget))))
  
EndMacro

Procedure RollOverButtonGadget(GadgetID.l, x.l, y.l, FileName00.s, FileName01.s = "")
  
  *RollOverButtonA.RollOverButton = CreateNewRollOverButton()
  
  If *RollOverButtonA <> #Null
    
    If FileName01 = ""
      
      ImageHandle = LoadImage(#PB_Any, FileName00)
      
      Width = ImageWidth(ImageHandle) >> 1
      Height = ImageHeight(ImageHandle)
      
      SetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_HOVER, GrabImage(ImageHandle, #PB_Any, 0,0,Width, Height))
      SetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_NORMAL, GrabImage(ImageHandle, #PB_Any, Width,0,Width, Height))
      FreeImage(ImageHandle)
      
    Else 
      
      SetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_HOVER, LoadImage(#PB_Any, FileName01))
      SetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_NORMAL, LoadImage(#PB_Any, FileName00))
      
      Width = ImageWidth(GetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_HOVER))
      Height = ImageHeight(GetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_HOVER))
      
    EndIf 
    
    SetRollOverButtonGadgetID(*RollOverButtonA, GadgetID)
    SetRollOverButtonGadgetHandle(*RollOverButtonA, ImageGadget(GadgetID, x, y, Width, Height, ImageID(GetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_NORMAL))))
    
    If GadgetID <> #PB_Any
      SetGadgetData(GadgetID, *RollOverButtonA)
    Else
      SetGadgetData(GetRollOverButtonGadgetHandle(*RollOverButtonA), *RollOverButtonA)
    EndIf
   
  EndIf
  
  ProcedureReturn GetRollOverButtonGadgetHandle(*RollOverButtonA)
EndProcedure 

Procedure RollOverButtonImageSwitch(GadgetID, WinID)
  
  WinMouseX = WindowMouseX(WinID)
  WinMouseY = WindowMouseY(WinID)
  
  *RollOverButtonA.RollOverButton = GetGadgetData(GadgetID)
  
  If GetRollOverButtonGadgetID(*RollOverButtonA) <> #PB_Any

    If HoverGadgetCheck(WinMouseX, WinMouseY, GetRollOverButtonGadgetID(*RollOverButtonA))
      SetGadgetState(GetRollOverButtonGadgetID(*RollOverButtonA), ImageID(GetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_HOVER)))
    Else 
      SetGadgetState(GetRollOverButtonGadgetID(*RollOverButtonA), ImageID(GetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_NORMAL)))
    EndIf
    
  Else
  
    If HoverGadgetCheck(WinMouseX, WinMouseY, GetRollOverButtonGadgetHandle(*RollOverButtonA))
      SetGadgetState(GetRollOverButtonGadgetHandle(*RollOverButtonA), ImageID(GetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_HOVER)))
    Else 
      SetGadgetState(GetRollOverButtonGadgetHandle(*RollOverButtonA), ImageID(GetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_NORMAL)))
    EndIf
    
  EndIf 
  
EndProcedure 

Procedure FreeRollOverButtonGadget(GadgetID)
  
  *RollOverButtonA.RollOverButton = GetGadgetData(GadgetID)
  
  If *RollOverButtonA <> #Null
    
    ResetRollOverButton(*RollOverButtonA)
    FreeGadget(GadgetID)
    FreeMemory(*RollOverButtonA)
    
  EndIf
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< !!! ATTENTION - CODE D'ESSAI !!! <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Enumeration
  
  #MainForm
  
  #ButtonImage1 ;Bouton Image 1
  #ButtonImage2 ;Bouton Image 2
  #ButtonImage3 ;Bouton Image 2
  
EndEnumeration

UseJPEGImageDecoder() 

If OpenWindow(#MainForm,0,0,500,300,"Bouton Image Rollover",#PB_Window_ScreenCentered |#PB_Window_SizeGadget | #PB_Window_SystemMenu)
  
  RollOverButtonGadget(#ButtonImage1, 5, 5, "Bouton2.jpg")
  RollOverButtonGadget(#ButtonImage2, 5, 35, "Bouton2.jpg")
  RollOverButtonGadget(#ButtonImage3, 5, 65, "Bouton2.jpg")
  
EndIf 

Repeat
  
  RollOverButtonImageSwitch(#ButtonImage1, #MainForm)
  RollOverButtonImageSwitch(#ButtonImage2, #MainForm)
  RollOverButtonImageSwitch(#ButtonImage3, #MainForm)
  
  EventID = WaitWindowEvent()
  
  Select EventID
      
    Case #PB_Event_Menu
      
      Select EventMenu()
          
      EndSelect
      
    Case #PB_Event_Gadget
      
      Select EventGadget()
          
        Case #ButtonImage1
          Debug "Bouton 1"
          
        Case #ButtonImage2
          Debug "Bouton 2"
          
        Case #ButtonImage3
          Debug "Bouton 3 (Quitte le programme)"
          EventID = #PB_Event_CloseWindow
          
      EndSelect
      
  EndSelect
  
Until EventID = #PB_Event_CloseWindow

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Ces instructions sont nécessaire pour éviter une fuite mémoire.
; Dans le cas d'une utilisation dans une fenètre de requète par
; exemple. Dans le cas de la fenêtre principale c'est facultatif 
; ou encore pour les puristes.

FreeRollOverButtonGadget(#ButtonImage1)
FreeRollOverButtonGadget(#ButtonImage2)
FreeRollOverButtonGadget(#ButtonImage3)

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
Dernière modification par Guimauve le sam. 04/févr./2012 16:38, modifié 1 fois.
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Re: Images Rollover - méthode des portes coulissantes

Message par lepiaf31 »

Bon ce code est super mais petite question: à quoi ça sert ?

Parce que pour le web, cela a effectivement une utilité puisque pour charger une image il faut effectuer une requête pour chaque image, puis attendre la réception complète de l'image (qui peut être long si l'image est lourde) etc, et donc mettre 2 images en 1 permet d'économiser des requêtes et donc du temps de chargement de la page.
Mais dans une programme compilé, je ne comprends pas vraiment l'utilité, il vaut mieux charger directement 2 images plutôt que d'en charger une, la découper en deux et libérer la première ...
Non ?
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Images Rollover - méthode des portes coulissantes

Message par Guimauve »

Ça sert à avoir des boutons de forme et de couleur diverse dans un programme.
Mais dans un programme compilé, je ne comprends pas vraiment l'utilité, il vaut mieux charger directement 2 images plutôt que d'en charger une, la découper en deux et libérer la première ...
falsam pourrait peut-être répondre à cette question mieux que moi puisque c'est lui l'auteur original.

Un exemple plus concret semble s'imposer alors voici un exemple avec des boutons générés sur le site mentionné plus haut

http://pages.videotron.com/gsaumure/fil ... Gadget.zip

Et donne des nouvelles !

A+
Guimauve
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Images Rollover - méthode des portes coulissantes

Message par Ar-S »

J'ai un gros clipping de tes images et un joli freeze de la fenêtre sur ton dernier Zip Guimauve.
Sympa le site cooltext :)
~~~~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
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Images Rollover - méthode des portes coulissantes

Message par Guimauve »

Ar-S a écrit :J'ai un gros clipping de tes images et un joli freeze de la fenêtre sur ton dernier Zip Guimauve.
Sympa le site cooltext :)
Je suis au courant, cela été rapporté sur le forum anglais. Je ne comprends pas pourquoi le problème se produit. Dis moi avec les autres versions ça le fait aussi ?

Je viens de remettre en ligne une archive complète avec le code original de falsam plus 2 versions retravaillées, Sentez-vous libre de tester et signaler celle qui bogue.

Merci à l'avance.

A+
Guimauve
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Images Rollover - méthode des portes coulissantes

Message par Kwai chang caine »

Testé avec XP PRO SP3 et v4.51

RollOverGadget V0.pb = Nickel

RollOverGadget V1.pb et RollOverGadget V2.pb surcharge de la machine a 100%
Impossible d’arrêter le code avec l'IDE de PB, obligé de killer le process Pb_Compilation.exe avec le gestionnaire des taches 8O
Et les boutons vibrent un max
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Images Rollover - méthode des portes coulissantes

Message par Le Soldat Inconnu »

Heu, la macro n'est pas plus simple comme cela ?

Code : Tout sélectionner

; Un gadget est il survolé (Joli macro hein ?"
Macro GadgetHoverCheck(x, y, Gadget)
	(x >= GadgetX(Gadget) And y >= GadgetY(Gadget) And x < GadgetX(Gadget) + GadgetWidth(Gadget) And y < GadgetY(Gadget) + GadgetHeight(Gadget))
EndMacro
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

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

Re: Images Rollover - méthode des portes coulissantes

Message par Le Soldat Inconnu »

Bon, après avoir fait le ménage, cela fonctionne parfaitement pour la V2

J'ai supprimé :
- GadgetID (inutile)
- GadgetHandle (inutile)

J'ai ajouté :
- State (permet de mémoriser l'état actuel du bouton afin d'éviter de rafraichir l'image du bouton bêtement)

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; CODE GÉNÉRÉ AUTOMATIQUEMENT, NE PAS MODIFIER À
; MOINS D'AVOIR UNE RAISON TRÈS TRÈS VALABLE !!!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Code généré par : Dev-Type V3.126.612
; Nom du projet : RollOverButtonGadget
; Nom du fichier : RollOverButtonGadget.pb
; Version du fichier : 1.0.0
; Programmation : OK
; Programmé par : Falsam
; Modifié par : Guimauve
; Date : 13-03-2011
; Mise à jour : 04-02-2012
; Codé pour PureBasic V4.61
; Plateforme : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Notes

; Drawback, this gadget don't have a GadgetData
; anymore because the it's used to store
; information related to the Gadget.

; A little Hint, Image for button can be create
; freely on http://cooltext.com/

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Cet instruction est nécessaire pour éviter une fuite mémoire.
; Dans le cas d'une utilisation dans une fenètre de requète par
; exemple. Pour la fenêtre principale c'est facultatif ou encore
; pour les puristes.

; This instruction is necessary to avoid a memory leak. In the
; case of use in a query window for example. For the main window
; is optional, or for the purists.

; FreeRollOverButtonGadget(#Gadget)

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Enumeration
	
	#ROLL_OVER_STATE_HOVER
	#ROLL_OVER_STATE_NORMAL
	#ROLL_OVER_STATE_MAX
	
EndEnumeration

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure <<<<<

Structure RollOverButton
	
	StateImage.l[#ROLL_OVER_STATE_MAX]
	State.b
	
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs <<<<<

Macro GetRollOverButtonGadgetState(RollOverButtonA)
	
	RollOverButtonA\State
	
EndMacro

Macro GetRollOverButtonStateImage(RollOverButtonA, Index)
	
	RollOverButtonA\StateImage[Index]
	
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs <<<<<

Macro SetRollOverButtonGadgetState(RollOverButtonA, P_State)
	
	GetRollOverButtonGadgetState(RollOverButtonA) = P_State
	
EndMacro

Macro SetRollOverButtonStateImage(RollOverButtonA, Index, P_StateImage)
	
	GetRollOverButtonStateImage(RollOverButtonA, Index) = P_StateImage
	
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Reset <<<<<

Macro ResetRollOverButton(RollOverButtonA)
	
	SetRollOverButtonGadgetState(RollOverButtonA, #ROLL_OVER_STATE_NORMAL)
	
	For Index = 0 To #ROLL_OVER_STATE_MAX - 1
		
		If IsImage(GetRollOverButtonStateImage(RollOverButtonA, Index))
			FreeImage(GetRollOverButtonStateImage(RollOverButtonA, Index))
			SetRollOverButtonStateImage(RollOverButtonA, Index, 0)
		EndIf
		
	Next
	
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Le Constructeur <<<<<

Procedure.i CreateNewRollOverButton()
	
	*RollOverButtonA.RollOverButton = AllocateMemory(SizeOf(RollOverButton))
	
	If *RollOverButtonA = #Null
		MessageRequester("Fatal Error", "CreateNewRollOverButton() - Impossible to Allocate Memory !")
		End
	EndIf
	
	ProcedureReturn *RollOverButtonA
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code généré en : 00.002 secondes (45500.00 lignes/seconde) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Macro HoverGadgetCheck(x, y, Gadget)
	(x >= GadgetX(Gadget) And y >= GadgetY(Gadget) And x < GadgetX(Gadget) + GadgetWidth(Gadget) And y < GadgetY(Gadget) + GadgetHeight(Gadget))
EndMacro

Procedure RollOverButtonGadget(GadgetID.l, x.l, y.l, FileName00.s, FileName01.s = "")
	
	*RollOverButtonA.RollOverButton = CreateNewRollOverButton()
	
	If *RollOverButtonA <> #Null
		
		If FileName01 = ""
			
			ImageHandle = LoadImage(#PB_Any, FileName00)
			
			Width = ImageWidth(ImageHandle) >> 1
			Height = ImageHeight(ImageHandle)
			
			SetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_HOVER, GrabImage(ImageHandle, #PB_Any, 0, 0, Width, Height))
			SetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_NORMAL, GrabImage(ImageHandle, #PB_Any, Width, 0, Width, Height))
			FreeImage(ImageHandle)
			
		Else
			
			SetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_HOVER, LoadImage(#PB_Any, FileName01))
			SetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_NORMAL, LoadImage(#PB_Any, FileName00))
			
			Width = ImageWidth(GetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_HOVER))
			Height = ImageHeight(GetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_HOVER))
			
		EndIf
		
		GadgetHandle = ImageGadget(GadgetID, x, y, Width, Height, ImageID(GetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_NORMAL)))
		If GadgetID = #PB_Any
			GadgetID = GadgetHandle
		EndIf
		SetRollOverButtonGadgetState(*RollOverButtonA, #ROLL_OVER_STATE_NORMAL)
		
		SetGadgetData(GadgetID, *RollOverButtonA)
		
	EndIf
	
	ProcedureReturn GadgetHandle
EndProcedure

Procedure RollOverButtonImageSwitch(GadgetID, WinID)
	
	WinMouseX = WindowMouseX(WinID)
	WinMouseY = WindowMouseY(WinID)
	
	*RollOverButtonA.RollOverButton = GetGadgetData(GadgetID)
	If *RollOverButtonA <> 0
		
		If HoverGadgetCheck(WinMouseX, WinMouseY, GadgetID)
			If GetRollOverButtonGadgetState(*RollOverButtonA) <> #ROLL_OVER_STATE_HOVER
				SetGadgetState(GadgetID, ImageID(GetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_HOVER)))
				SetRollOverButtonGadgetState(*RollOverButtonA, #ROLL_OVER_STATE_HOVER)
			EndIf
		Else
			If GetRollOverButtonGadgetState(*RollOverButtonA) <> #ROLL_OVER_STATE_NORMAL
				SetGadgetState(GadgetID, ImageID(GetRollOverButtonStateImage(*RollOverButtonA, #ROLL_OVER_STATE_NORMAL)))
				SetRollOverButtonGadgetState(*RollOverButtonA, #ROLL_OVER_STATE_NORMAL)
			EndIf
		EndIf
	
EndIf
	
EndProcedure

Procedure FreeRollOverButtonGadget(GadgetID)
	
	*RollOverButtonA.RollOverButton = GetGadgetData(GadgetID)
	
	If *RollOverButtonA <> #Null
		
		ResetRollOverButton(*RollOverButtonA)
		FreeGadget(GadgetID)
		FreeMemory(*RollOverButtonA)
		
	EndIf
	
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< !!! ATTENTION - CODE D'ESSAI !!! <<<<<
; <<<<< !!!  WARNING  - TESTING CODE !!! <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Enumeration
	
	#MainForm
	
	#ButtonImage1 ; Bouton Image 1
	#ButtonImage2 ; Bouton Image 2
	#ButtonImage3 ; Bouton Image 2
	
EndEnumeration

UsePNGImageDecoder()

Macro GadgetDown(GadgetID, Gap = 0)
	
	GadgetY(GadgetID) + GadgetHeight(GadgetID) + Gap
	
EndMacro

If OpenWindow(#MainForm, 0, 0, 500, 300, "RollOverButtonGadget V2", #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_SystemMenu)
	
	RollOverButtonGadget(#ButtonImage1, 5, 5, "Screen Resolution - Normal.png", "Screen Resolution - MouseOver.png")
	RollOverButtonGadget(#ButtonImage2, 5, GadgetDown(#ButtonImage1), "Launch Demo - Normal.png", "Launch Demo - MouseOver.png")
	RollOverButtonGadget(#ButtonImage3, 5, GadgetDown(#ButtonImage2), "Quit - Normal.png", "Quit - MouseOver.png")
	
EndIf

Repeat
	
	RollOverButtonImageSwitch(#ButtonImage1, #MainForm)
	RollOverButtonImageSwitch(#ButtonImage2, #MainForm)
	RollOverButtonImageSwitch(#ButtonImage3, #MainForm)
	
	EventID = WaitWindowEvent()
	
	Select EventID
			
		Case #PB_Event_Menu
			
			Select EventMenu()
					
			EndSelect
			
		Case #PB_Event_Gadget
			
			Select EventGadget()
					
				Case #ButtonImage1
					Debug "Screen Resolution"
					
				Case #ButtonImage2
					Debug "Launch Demo"
					
				Case #ButtonImage3
					Debug "Quit"
					EventID = #PB_Event_CloseWindow
					
			EndSelect
			
	EndSelect
	
Until EventID = #PB_Event_CloseWindow

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Ces instructions sont nécessaire pour éviter une fuite mémoire.
; Dans le cas d'une utilisation dans une fenètre de requète par
; exemple. Pour la fenêtre principale c'est facultatif ou encore
; pour les puristes.

; These instructions are necessary to avoid a memory leak. In the
; case of use in a query window for example. For the main window
; is optional, or for the purists.

FreeRollOverButtonGadget(#ButtonImage1)
FreeRollOverButtonGadget(#ButtonImage2)
FreeRollOverButtonGadget(#ButtonImage3)

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
; IDE Options = PureBasic 4.61 Beta 1 (Linux - x64)
; CursorPosition = 253
; FirstLine = 232
; Folding = ---
; EnableXP
; CompileSourceDirectory
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Images Rollover - méthode des portes coulissantes

Message par Guimauve »

Bonjour à tous,

J'ai a peine eu le temps de revenir des courses que je vois que le problème est solutionné. Dommage j'ai réfléchi à la solution pour arriver bon 2e. Mais c'est la vie !

Je viens de mettre à jour l'archive, avec la version 3, c'est à dire avec les corrections apportées par Le Soldat Inconnu, plus quelques simplifications au passage.
Je redonne le lien même si n'a pas changé depuis : http://pages.videotron.com/gsaumure/fil ... Gadget.zip

A+
Guimauve
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Images Rollover - méthode des portes coulissantes

Message par Kwai chang caine »

Effectivement la V2 et V3 marche niquel ici, merci guimauve et soldat 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Images Rollover - méthode des portes coulissantes

Message par Guimauve »

J'ai peut-être trouvé le moyen de solutionner un autre problème avec un autre Gadget.

Je suis content de voir que ça fonctionne normalement maintenant.

A+
Guimauve
Répondre