Double images sur un bouton par alternance

Bonjour,
Lorsqu'on désactive un bouton de commande contenant une image (Enable=False) l'image change d'aspect naturellement et n'est plus esthétiquement présentable.
Je voudrais plutôt que de faire appel à la propriété Enable utiliser Locked pour rendre le bouton inopérant simplement. Donc selon que le bouton soit Locked à true ou false je change l'image du bouton dynamiquement en mettant soit une image en couleur et la même en niveau de gris.
En l'absence de fichier de ressources et d'une fonction Listimage comme dans Visual Basic complet, comment puis-je gérer les deux images dans VBA.
La solution que j'envisage est la suivante : Placer deux contrôles images dans ma Form en les mettant visible = false puis d'utiliser selon le cas MonBouton.picture=MyCtrlImage1.picture et MonBouton.Image=MyCtrlImage2.picture.
Voyez-vous une autre méthode pour réaliser cela et éviter une superposition de contrôles images en fonction du nombre de boutons car 1 bouton nécessite 2 contrôles pictures, 4 pictures pour 2 boutons, 8 pictures pour 4 boutons, etc.

Merci d'avance

Bonjour,

A part la fonction visible= True ou false. des "forms" ou des "boutons".

Difficile de répondre sans voir le projet.

( Surtout si les images ne sont pas accessible sur un même chemin par les utilisateurs du fichier).

Bonsoir Xmenpl,
La solution que j'ai trouvée et qui fonctionne consiste à ajouter au projet le contrôle supplémentaire ListImage.

image

Cela fonctionne très bien mais le seul problème est que ce contrôle est un OCX (Mscomctl.ocx) contrairement aux autres contrôles standards de VBA sont dans une librairie FM20.dll dans le dossier système32 de Windows. Donc si le contrôle OCX n'est pas installé sur une machine, le composant ne fonctionnera pas. d'où le risque à ne pas passer par cette solution.

Il n'est pas nécessaire de faire appel à des ressources externes pour les images ; on peut les encapsuler dans le classeur.
Dans l'exemple ci-dessous, elles sont dans les contrôles Image2 et Image3 de la feuille hôte.

23exemple.xlsm (99.36 Ko)

bonjour le fil,

je vois que Optimix a peut-être vous donné la même résponse

22cheickna.xlsb (45.49 Ko)

EDIT : ce n'est pas 100% la même chose, mais l'idée est pareil (mais la methode "Optimix" est plus simple ).

Bonsoir @BsAlv et @Optimix,
Merci beaucoup pour votre aide. La solution d'Optimix correspond effectivement à la solution que j'avais annoncé dans mon message d'origine. Pour un bouton donnée il faut deux images cachées, pour N boutons il faut 2*N images. Pour ma part j'ai deux boutons donc 4 images. C'est jouable donc si le nombre de contrôles est limité comme mon cas. J'opte donc pour cette solution.
Je regarde également le code de BsAlv, un peu compliqué, mais comprendre la logique ne peut que m'enrichir.
Merci à vous

Bonsoir à vous trois, au forum !

En prenant l'idée de waard, que j'ai mis en application dans ArkaLouReeD, je vous propose le fichier joint :

22boutons-animes.xlsm (175.34 Ko)

Ci-dessous le code VBA :

Sub ClicBtn()
    Dim Btn As String, Coef As Integer
    ' on récupère le nom du bouton cliqué
    Btn = Application.Caller
    ' ici on dimensionne l'image "crapée" mais une fois définie il n'est plus besoin de le répéter
    ActiveSheet.Shapes(Btn).PictureFormat.Crop.PictureWidth = 600
    ' on scrolle de l'image à gauche de la bande à l'image à droite de la bande,
    ' sachant que le milieu de la bande correspond à la position 0, il suffit de tester si la position est négative pour savoir de quel côté
    ' on doit faire le scrol, c'est ce à quoi sert la variable Coef
    If ActiveSheet.Shapes(Btn).PictureFormat.Crop.PictureOffsetX < 0 Then Coef = 1 Else Coef = -1
    ' l'animation est faite avec 19 images moins une (celle de départ), on boucle donc 18 fois
    For i = 1 To 18
        ' à chaque rotation on décale la bande de l'image de 31.58 qui correspond à la largeur de chaque image : 600 / 19 = 31.58
        ActiveSheet.Shapes(Btn).PictureFormat.Crop.PictureOffsetX = ActiveSheet.Shapes(Btn).PictureFormat.Crop.PictureOffsetX + (31.58 * Coef)
        ' on lance la temporisation pour voir l'animation, sinon c'est trop rapide
        Temporisation
    Next i
End Sub

Sub Temporisation()
    ' ici pour l'animation on temporise à 0.01 seconde
    Dim Tempo As Double
    Tempo = Timer
    Do
        ' permet de rendre la main à l'utilisateur, évite qu'Excel se fige et en même temps permet la mise à jour de l'écran
        DoEvents
    ' on boucle "sur place" tant que le centième de seconde ne s'est pas écoulé
    Loop While Tempo + 0.01 > Timer
End Sub

Ici le lien du master class de waard sur le sujet : C'est ici !

Le principe : on charge une image, ici une bande horizontale avec 19 images pour créer une animation de bouton :

btn on off

et on "rogne" cette image afin d'en montrer qu'1/19ième, donc une seule image de la bande, ici soit celle de gauche, soit celle de droite en fonction du ON ou du OFF.

Avec une boucle, on incrémente ou décrémente la position de la bande d'image dans le rognage d'Excel, c'est ce qui fait l'animation.

Plusieurs boutons, il suffit de copier/coller le bouton créé, puis de le renommer afin qu'ils soient gérés individuellement avec l'instruction Application.Caller

Un autre avantage, c'est que l'on ne passe pas par des "contrôles ActiveX", ceci donne une meilleur compatibilité...

@ bientôt

LouReeD

@louReeD,

Et je suis certain que vous n'avez pas encore essayé ArkaLouReeD !

@ bientôt

LouReeD

@LouReeD, oui, cela se présnte bien, mais je pense que mon ordinateur est trop puissant pour ce jeu, tout se passe trop vite ...

Faut juste modifier la valeur de la Temporisation de jouabilité en fin de boucle principale...

Peut être devrais je mettre une sélection joueur afin que chacun puisse régler ceci à sa convenance.

@ bientôt

LouReeD

Bonsoir Cheikna, le Fil,

Voyez-vous une autre méthode pour réaliser cela et éviter une superposition de contrôles images en fonction du nombre de boutons car 1 bouton nécessite 2 contrôles pictures, 4 pictures pour 2 boutons, 8 pictures pour 4 boutons, etc.

On utilise un fond d'images qui représente toutes les images variées en négatif ou en gris. Donc une seule grande image est présente.

Par dessus ce fond d'images on place les boutons colorés qui peuvent être de différentes formes et tailles mais correspondant à celui du dessous. Il suffit de rendre visible ou non le bouton coloré pour qu'alternativement l'effet "On / Off" de chaque bouton s'effectue.

On peut produire d'autres effets que la couleur. Effet enfoncé, brisé, rétréci... Etc

Bonjour,

un petit passage pour donner d’autres solutions : bouton bascule ActiveX (ToggleButton) avec 2 images (qui ne doit pas poser de problème), autre proposition pour un roulement sur plus de 2 images avec plus de 2 affichages (images côte à côte) et avec 1 affichage (images superposées).

Bonsoir,

je remonte ce sujet car je viens de retrouver un fichier avec un système de bouton "on/off" où l'ajout se fait simplement et le code est simple "rouge/vert".

Le code VBA :

Sub LRD()
    With ActiveSheet.Shapes(Application.Caller).Fill.ForeColor
        If .RGB = RGB(255, 0, 0) Then Inter = 1
       .RGB = RGB(255 * (1 - Inter), 255 * Inter, 0)
    End With
    Call On_Off(ActiveSheet.Shapes(Application.Caller))
End Sub
Sub On_Off(Qui As Shape)
    With Qui
        If .Fill.ForeColor.RGB = RGB(0, 255, 0) Then
            .Glow.Color.RGB = RGB(0, 255, 0)
            .Glow.Transparency = 0.6
            .Glow.Radius = 18
        Else
            .Glow.Transparency = 1
            .Glow.Radius = 0
        End If
    End With
End Sub
Sub Init()
    Dim Sh As Shape
    For Each Sh In ActiveSheet.Shapes
        If Left(Sh.Name, 3) = "btn" Then Sh.Fill.ForeColor.RGB = RGB(255, 0, 0)
        Call On_Off(Sh)
    Next Sh
End Sub

Le fichier :

@ bientôt

LouReeD

Rechercher des sujets similaires à "double images bouton alternance"