Mettre en évidence dans "Frame" utilisé comme bouton de commande

Bonjour à tous!

Je vais tenter d'être le plus clair possible et n'hésitez pas s'il vous manque de précision.

J'essaie de mettre en évidence des Frame, ce qui veut dire que quand je passe la souris (MouseMove) sur le Frame, celui-ci change de couleur; ce qui fonctionne très bien avec les codes que j'ai fait. Toutefois, il y a deux Label dans chacun des Frame, alors quand je passe ma souris sur les Frame il détecte en réalité les Label qui sont à l'intérieur ce qui cause la problématique que le code ne se déclenche pas... J'ai tenté alors de déclencher la même chose avec un MouseMove, mais sur les Label, sans succès.

Il faut comprendre que le but n'est pas non plus de créer un évènement pour chaque Frame et chaque Label puisqu'au final il n'y aura pas que ceux présenté dans le fichier que je vous joint. En ayant un code comme je l'ai fait en associant les Frame et les Label par des Tag, je viens à faire quelque chose d'universelle qui va grandement faciliter le travail future, mais également de beaucoup alléger le Classeur en terme de donné.

Existe-t-il une manière de déclenche un event avec un MouseMove sur les Label que je pourrais mettre un Tag, mais qui change la couleur du Frame dans lequel ils sont uniquement? J'ai tenté franchement pendant des jours, je suis donc venu vous voir.

Je vous joint bien entendu le classeur Excel que j'ai réduit au minimum pour mieux mettre en évidence où sont les codes ainsi que le UserForm. Merci pour votre aide!

8dev-test.xlsm (106.58 Ko)

Bonjour,

Ton exposé n'est pas très clair : Il y a des évènement MouseMove sur des Labels ET sur les Frames.

Quand tu passes la souris sur l'un en réalité tu déclenches plutôt une "Entrée" puis quand tu vas sur un autre tu déclenches d'abord une "Sortie avant de faire une nouvelle "Entrée;" Donc dans le cas des Frames puisque les Labels sont des "Enfants" pour "Entrer" dans l'un ça passe forcément par un passage par la Frame "parent."

Pour éviter cet inconvénient on peut disposer souvent entre la Frame Parent et ses enfants un autre objet (p.e. Image) invisible et neutre (invisible parce que de la même couleur que la Frame) qui évite l'effet de Sortie puisque tu ne repasses plus par la Frame ainsi tu peux naviguer entre les différents Label.

Dans la Démo j'ai l'aisser subsister la bordure de la Frame Image.

Nota : Si tes Frames ne débordent pas largement les évènements "Entrées / Sorties" ne sont pas très fiables (au même titre que MouseMove !) Parfois, si tu vas trop vite avec la souris tu peux très bien barbouiller tes contrôles de manière incohérente.

Ainsi sur ma démo en insistant un peu si on diminue la largeur des Frames en ne laissant que des bordures minimes , on arriverait à allumer les Label 2, 12, 3 ou 4 en même temps. Alors qu'en théorie ce n'est pas prévu...

De la même manière plusieurs label ne fonctionnent pas dans ta démo si tu passes par leur hauteur qui est trop petite.

Par contre si tu passes par "en-dessous" de ce même label (leur longueur) alors l'Entrée est détectée...

2framecedl.xlsm (17.45 Ko)

A+

Bonjour à tous,

Pourquoi ne pas utiliser des labels tout simplement ?

Voici une classe qui peut être facilement modifiable pour faire cela.

Et un petit exemple en fichier joint :

NB: La propriété Tag du label doit contenir le type de bouton Exemple : Type:=Command pour un bouton de commande, Type:=Menu pour un bouton de menu, et Type:=Link pour un lien.

Bonjour à vous deux!

Merci pour votre aide!

Oui je suis d'accord avec Jean-Paul ça serait beaucoup plus simple si c'était seulement des Labels, toutefois avec un Label mettre une image à l'intérieur plus du texte ça devient vite affreux visuellement et ça devient ardue de commencer à agencer le tout. C'est pour cette raison que j'ai fini par utiliser des Frames et j'ai séparé le texte de l'icone dans des Labels.

Et je comprends ton approche galopin01, je pense que ça devient vite très compliqué d'ajuster tous les contrôles avec des images à l'arrière.

Voici ce que je faisais avant que je découvre les tages et qui fonctionnait très bien, les "bouton" était fait de la même manière soit un Frame avec à l'intérieur un Label pour l'image de l'icone et un Label pour le texte :

Private Sub Frame6_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

Frame6.BackColor = RGB(255, 225, 225)

End Sub

Private Sub Frame6_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

    On Error Resume Next

    Dim I As Interger

    For I = 1 To 7
        If Controls("Frame" & I).BackColor = RGB(250, 250, 250) Then

        Else
            Controls("Frame" & I).BackColor = RGB(250, 250, 250)

        End If
    Next I  

    If Frame6.BackColor = RGB(240, 240, 240) Then

    Else
        Frame6.BackColor = RGB(240, 240, 240)

    End If

End Sub

Le problème avec cette méthode est que je dois le faire pour l'ensemble des Frames ainsi que des Labels ce qui devient très ardu quand on a au final 50 Frame et donc 100 Label à coder. Le principe des Tag devenait alors très intéressant pour moi, mais voilà que je me bute à ce problème!

Je ne comprend pas bien ton besoin. Et je ne suis pas certain que tu maîtrises bien ta classe.

Je ne comprend pas non plus qu'on continue à utiliser des couleurs RGB (mais c'est une autre histoire...)

A mon avis tu n'as pas besoin de Frame pour ta relation avec les Labels il suffit de nommer astucieusement tes Frames "parents."

Le noms de leurs enfants doit suffire à identifier une "famille" ?

Si Frm01 à plusieurs en enfants ce sont Lbl011 à Lbl011n voire (LblXX1 à LblXXn si tu ne veux pas de relations...)

Si Frm02 à plusieurs en enfants ce sont Lbl021 à Lbl021n... et ainsi de suite.

Après la fonction MID(Lbl043,4,2) te permet d'identifier à coup sûr la famille 04 et le Lbl en cause.

Pour la suite comme je ne comprend pas trop l'utilité de ce va et vient de couleurs, je n'en dirai pas plus :

Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. Quand cela est vérifié le travail de programmation coule presque de source...

Si c'est juste pour mettre du texte sous une image dans un label, je ne vois pas le rapport avec tes couleurs et la Frame, au reste je trouve que si tu mets pas tout un roman dans tes labels c'est plutôt cool et facile à mettre en place ?

A+

Je comprends que ce soit difficile à comprendre, je vais donc joindre par un exemple dans le fichier joint.

Quand on ouvre le UserForm : "UF3A_Budget", on peut y voir les mêmes éléments soit un Frame avec des Label à l'intérieur. Quand on passe la souris dessus on voit que le Frame change de fond de couleur pour mettre en évidence comme nous sommes sur ce bouton comme n'importe qu'elle autre logiciel ou application. C'est donc ce que je voudrais reproduire, mais au lieu de devoir le faire pour chaque Label et Frame, j'avais essayé avec un Module Classe comme dans le premier exemple.

Entre temps, j'ai peut-être eu une piste d'idée que vous partage :

Private Sub RuActionLabel_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

On Error Resume Next

    Dim I As Integer

    For I = 1 To 10
        If RuActionLabel = Controls("Action_L" & I) Or Controls("Action_I" & I) Then
            Controls("Action_F" & I).BackColor = ThisWorkbook.Sheets("DATA_01").Range("TB_Perso[[#Headers],[Move-O]]").Offset(7, 0).Interior.Color
        End If
    Next I

End Sub

J'ai tenté de lui faire comprendre que si il était sur le Label dont le nom était "Action_L1" ou "Action_I1" alors changer la couleur du Frame nommé "Action_F1" avec un boucle. Bien entendu ça n'a pas fonctionné, mais c'était une piste que j'ai voulu explorer pour voir.

Bonjour à tous,

@CedL Avez-vous testé le petit exemple que j'ai fournis dans le précédant post ? Je ne crois pas.

Je pense que cela correspond exactement a ce qu'il vous faut.

Bonjour Jean-Paul,

Oui ça fonctionne très bien si c'est seulement des Label et je pourrais aisément faire le codage, toutefois le problème c'est le visuel. Si je mets une icone plus du texte ça devient esthétiquement difficile à regarder. C'est pourquoi dans le passé j'avais fait le virage en insérant un Frame et des Label à l'intérieur pour faciliter le visuel même si à cause de ça le codage devenait plus ardue...

À moins que j'ai mal compris ce que tu m'as envoyé et corrige moi si je me trompe?

Bonjour à tous,

Si je mets une icone plus du texte ça devient esthétiquement difficile à regarder.

Bon là j'avoue ne plus rien comprendre, dans l'exemple je j'ai fournis il y a des images du même type que ceux de votre exemple et je ne trouve pas que cela pique les yeux...

De plus la classe gère la propriété Enabled des contrôles, faire un test avec le bouton Désactiver.
La couleur de surbrillance peut-être changée...

Effectivement, après réflexion et quelque essaie de mon côté pour le côté visuel, je peux quand même bien m'en tirer avec uniquement des Label et travailler ma grosseur d'image. Ayant des boutons qui avait tous la même forme il a été facile au final de trouver la bonne dimension de base pour les icones et de faire un beau rendu au final!

Merci à vous tous, ça été très apprécié!

Rechercher des sujets similaires à "mettre evidence frame utilise comme bouton commande"