Afficher/Cacher Control sur Mouse Events

Signaler
Messages postés
51
Date d'inscription
jeudi 2 juin 2011
Statut
Membre
Dernière intervention
1 août 2012
-
Messages postés
51
Date d'inscription
jeudi 2 juin 2011
Statut
Membre
Dernière intervention
1 août 2012
-
Je suis désespéré...

Est-il aussi difficile de cacher/afficher un control quand on pointe la souris dessus que je ne trouve aucune info sur le net????

Je cherche à afficher une "Bubble bar" quand je pointe ma souris dans sa zone (à ce moment le control doit être invisible) et cacher quand ma souris quitte le control...

Help please!

Merci d'avance

23 réponses

Messages postés
51
Date d'inscription
jeudi 2 juin 2011
Statut
Membre
Dernière intervention
1 août 2012

Pour appronfondir ma question: Comment soulever un MouseEnter sur un control invisible?

Bonjour,

Tu peux te servir de l'événement MouseMove du formulaire.
La classe Rectangle permet de vérifier le résultat (un rectangle) de l'intersection de deux rectangles (celui du curseur et de ton contrôle).
Cela donne :
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    If Rectangle.Intersect(New Rectangle(e.X, e.Y, 1, 1), PictureBox1.Bounds) <> Rectangle.Empty Then
        PictureBox1.Visible = True
    Else
        PictureBox1.Visible = False
    End If
End Sub
Messages postés
51
Date d'inscription
jeudi 2 juin 2011
Statut
Membre
Dernière intervention
1 août 2012

Merci pour la réponse.

J'ai déjà essayé d'utiliser l'événement "Mouse Move" mais étant donné que ma forme est remplie de controls, l'événement n'est pas soulevé...

C'est que tu n'as pas testé ma solution alors.
Tant pis...
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Bonjour (et un salut à banana32),
Une chose m'apparait évidente :
Lorsque le fameux contrôle est invisible, c'est bien le Form, que tu survoles, non ? ===>> et son évènement MouseMove intervient alors.
Sauf si un autre contrôle a pris la place du contrôle rendu invisible. Et si tel est le cas : utilise donc le MouseMove de ce second contrôle.
Et si vraiment tout est à ce point rempli comme un oeuf (et par des substitutions divers, en plus) : rien ne devrait t'empêcher de faire ce que je ferais en VB6 : un Frame transparent d'un côté, des coordonnées de l'autre, ... ert l'évènement MouseMove du Frame. M'étonnerait beaucoup que tu ne puisses avoir l'équivalent avec VB.Net
Bien que (mais cela me regarde peu) ton "truc" laisse deviner des défauts majeurs de conception. Il n'est pas normal d'en arriver à de telles acrobaties?.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
51
Date d'inscription
jeudi 2 juin 2011
Statut
Membre
Dernière intervention
1 août 2012

.... Je l'ai testé à l'instant.. Et l'événement n'est pas soulevé. J'ai copié/collé ton code, j'ai remplaçé PictureBox1 par mon control mais rien n'y fait.

Mais merci pour ton aide.
Messages postés
51
Date d'inscription
jeudi 2 juin 2011
Statut
Membre
Dernière intervention
1 août 2012

@ ucfoutu:

Merci pour la réponse mais on est pas là pour juger les gens je crois... Une acrobatie??? Rien me paraît plus simple comme concept que d'afficher/cacher un control en le pointant avec la souris...

Si toi Monsieur le concepteur a une meilleure idée pour faire ça merci de le faire savoir plutôt que de perdre du temps à laisser des message inutiles (celà me regarde surement peu...)

Désolé mais j'ai beaucoup plus la logique "assembleur", ce genre de language m'inspire très peu.

Un grand bonjour à ucfoutu pour commencer

Tu peux aussi abonner tes contrôles au même événement.

Pour l'exemple ci-dessous, j'ai placé 2 picturebox (n°2 et n°3) derrière le n°1.

Public Class Form1
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        AddHandler PictureBox2.MouseMove, AddressOf MonMouvement
        AddHandler PictureBox3.MouseMove, AddressOf MonMouvement
    End Sub

    Private Sub MonMouvement(ByVal sender As Object, ByVal e As MouseEventArgs)
        Dim MonPictureBox As PictureBox = DirectCast(sender, PictureBox)
        If Rectangle.Intersect(New Rectangle(e.X + MonPictureBox.Left, e.Y + MonPictureBox.Top, 1, 1), PictureBox1.Bounds) <> Rectangle.Empty Then
            PictureBox1.Visible = True
        Else
            PictureBox1.Visible = False
        End If
    End Sub

End Class
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Si toi Monsieur le concepteur a une meilleure idée pour faire ça

1) je t'ai donné deux méthodes, non ?
2) pour aller au-delà (concevoir), il faudrait connaître avec beaucoup plus der précision tous les tenants et aboutissants de ton appli. Nous n'en avons jusqu'à présent que ce que tu as bien voulu en exposer assez succinctement.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
51
Date d'inscription
jeudi 2 juin 2011
Statut
Membre
Dernière intervention
1 août 2012

Je crois comprendre le problème... Le control qui est derrière mon "BubbleBar" est un webbrowser (webkitbrowser très exactement)... Celui-ci ne soulève plus le mouse move dès qu'il contient une page web... Bizarre...

Il y à une solution barbare (que va encore critiquer ucfoutu ).
Celle d'un timer qui vient lire la position du curseur (voir Cursor.Position) et qui peut alors être écrite comme ça dans l'événement Tick (pas testé mais à modifier)
Il faudra surement ajouter ou retrancher quelque chose à la position X et Y du curseur pour que ça colle avec la position de ta 'bubblebar'.

If Rectangle.Intersect(New Rectangle(cursor.position.X, cursour.position.Y, 1, 1), PictureBox1.Bounds) <> Rectangle.Empty Then
        PictureBox1.Visible = True
    Else
        PictureBox1.Visible = False
    End If
Messages postés
51
Date d'inscription
jeudi 2 juin 2011
Statut
Membre
Dernière intervention
1 août 2012

C'est vrai que j'aurais pu un peu mieux expliquer mais je commençais à m'impatienter... En fait vous savez le bubble bar qui s'affiche en bas des pdf (pour adobe reader) avec les boutons "imprimer", "zoom", etc. quand on place la souris en bas de page.

Et bien je cherche à faire qqch du genre pour un webbrowser que j'ai dans mon appli. Quand je descend en bas de mon webbrowser avec la sourir, j'aimerais que la bubble bar s'affiche et disparaîsse quand la souris s'éloigne.

Je vais peut-être dans la mauvaise direction pour obtenir ceci... Mais pour moi ça me paraissait être la solution la plus simple à la base, juste avec des mouse events...

Je vais voir pour essayer ta solution "banana32", meme si elle est barbare

J'ai aussi essayé de mettre un panel pour contenir ma bubble bar (pour soulever le mouse move) mais là même réglé sur transparent, le panel reste visible puisqu'il cache le contenu qui se trouve derrière (logique)...

Merci à vous deux

Dans ce cas, pourquoi ne pas ajouter ta bubblebar directement dans ton webbrowser :
Dim pct As PictureBox New PictureBox With {.Name "pct", .Bounds = New Rectangle(10, 10, 200, 150), .Visible = True, .BackColor = Color.Red}
WebBrowser1.Controls.Add(pct)
DirectCast(WebBrowser1.Controls.Item("pct"), PictureBox).Show()
End Sub

Et Hide() pour cacher bien entendu ;)
Messages postés
51
Date d'inscription
jeudi 2 juin 2011
Statut
Membre
Dernière intervention
1 août 2012

Oui ma bubblebar est déjà ajoutée dans le webbrowser. Mais pour appeler show/hide ou visible = true/false j'utilise les events de la souris. Mais ces derniers ne fonctionnent pas sur le webkitbrowser

Mais il te faut rajouter un abonnement à l'événement MouseMove :

Dim pct As PictureBox New PictureBox With {.Name "pct", .Bounds = New Rectangle(10, 10, 200, 150), .Visible = True, .BackColor = Color.Red}
'rajout de l'abonnement à l'événement
AddHandler pct.MouseMove, AddressOf MonMouvement
WebBrowser1.Controls.Add(pct)
DirectCast(WebBrowser1.Controls.Item("pct"), PictureBox).Show()
WebBrowser1.Navigate("http://vbfrance.com")


Et la sub appelée :
Private Sub MonMouvement(ByVal sender As Object, ByVal e As MouseEventArgs)
     MessageBox.Show("deplacement souris détecté")
End Sub
Messages postés
51
Date d'inscription
jeudi 2 juin 2011
Statut
Membre
Dernière intervention
1 août 2012

Oui la sub est appelée pour autant que la bubblebar soit visible non? Si je veux qu'elle disparaisse quand j'éloigne la souris en utilisant un mouse_leave par exemple, je cache la bubblebar mais ensuite l'événement mouse_move ou mouse_enter ne fonctionne plus puisque le focus ne peut pas être crée sur un élément "invisible". Est-ce que je me trompe?

Oui, tu as raison.
Il te reste donc la solution du timer et Cursor.Position en dernier recours.
Messages postés
51
Date d'inscription
jeudi 2 juin 2011
Statut
Membre
Dernière intervention
1 août 2012

C'est bizarre ça para6it pourtant si simple à la base...

Merci pour ton aide banana32

Si ton contrôle 'exotique' fonctionnait correctement, tu n'en serais pas là