6
votes

PictureBox Mouseener / Mouseleave Événements Pas Tir

Créer un nouveau formulaire avec trois boîtes d'image. Ce code est destiné à dessiner une bordure lorsque la souris entre dans la zone d'image et retirez-la quand elle part. Il est incompatible dans les résultats. Parfois, il dessine / supprime la frontière, parfois ce n'est pas le cas. Ce code n'est pas complexe. Utilisation de VS 2012.

Private Sub PictureBox_MouseEnter(sender As Object, e As EventArgs) _
    Handles PictureBox1.MouseEnter, PictureBox2.MouseEnter, PictureBox3.MouseEnter
    Dim pb As PictureBox = DirectCast(sender, PictureBox)
    pb.BorderStyle = BorderStyle.FixedSingle
    ' Debug.WriteLine("E " & pb.Name)
End Sub

Private Sub PictureBox_MouseLeave(sender As Object, e As EventArgs) _
    Handles PictureBox1.MouseLeave, PictureBox2.MouseLeave, PictureBox3.MouseLeave

    Dim pb As PictureBox = DirectCast(sender, PictureBox)
    pb.BorderStyle = BorderStyle.None
    ' Debug.WriteLine("X " & pb.Name)
End Sub


12 commentaires

Est-ce que votre Imagesbox Les commandes ont-elles des contrôles d'enfants en eux?


Non, ils ne pas. Nouveau formulaire, ajoutez trois boîtes d'images et le code ci-dessus.


Quelle plate-forme; Winforms, WPF?


Ok, je peux le reproduire, bien que cela ne ressemble à mouseleave ne tire parfois pas. Étrange.


La plate-forme est Winforms.


@Ekoostikmartin - Donc ce n'est pas seulement moi? J'ai des solutions de contournement de kludgy mais je veux comprendre pourquoi cela se produit.


Si vous déconnectez les déclarations de débogage, vous verrez que les deux événements semblent être manqués parfois.


Changer la propriété BordersTyle a trop d'effets secondaires, la fenêtre natale est détruite et recréée. Ce qui le fait oublier que la souris soit entrée. Vous devrez choisir quelque chose d'autre pour indiquer l'état. Vous pouvez facilement peindre quelque chose de similaire.


La solution peut être peindre les bordures vous-même. C'est encore mieux mais moins pratique.


@Hanspassant - c'est l'aspect «parfois» de cela qui me concerne.


J'ai essayé cela avec une seule zone d'image et en déplaçant lentement la souris de la boîte d'images, le code échoue également.


Si vous faites entrer, supprimez la bordure et laissez tracer la frontière qui semble fonctionner.


3 Réponses :


1
votes

Je pourrais aussi reproduire le problème. Donc, en développant sur les commentaires ci-dessus sur «Dessinez autre chose» au lieu d'utiliser la propriété Picturebox, laissez-moi vous suggérer cette approche rapide et sale:

  • Utilisez un objet Rectangleshape, celui fourni par le VisualBasic Powerpack 3.0 addon. Il suffit de mettre l'un de ceux-ci dans la même forme que votre imagebox est dans, et faites-la invisible (visible = false). P> li>

  • Le code est également facile: p>

    Public Class Form1
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.RectangleShape1.Location = New Point(Me.PictureBox1.Left - 1, Me.PictureBox1.Top - 1)
            Me.RectangleShape1.Size = New Size(Me.PictureBox1.Width + 1, Me.PictureBox1.Height + 1)
        End Sub
    
        Private Sub PictureBox1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseEnter
            Me.RectangleShape1.Visible = True
        End Sub
        Private Sub PictureBox1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseLeave
            Me.RectangleShape1.Visible = False
        End Sub
    End Class
    


5 commentaires

L'OP ne semble pas vouloir le faire d'une autre manière parce que c'est un peu facile, il y a des moyens de faire avec des graphiques. Le problème est de savoir comment le faire en basculant la bordure. J'ai testé avec 1 piclebox et cela fonctionne bien mais avec 3 photopographies, il y a quelque chose d'étrange, peut-être expliqué par Hans Passant.


@Kingking comme mentionné dans les commentaires ci-dessus, je sais qu'il y a des solutions de contournement. Je voulais savoir pourquoi. Dans la documentation pour la Borderstyle, aucun effet secondaire n'est mentionné. Pourquoi cela fonctionne-t-il jamais si les événements sont perdus quand ", la fenêtre natale est détruite et recréée."


@Kalanag - Si les événements ne sont pas tirés, ce qui ressemble à ce qui se passe, alors cela ne fonctionnera pas.


@dbasnett, mais la chose est, alors que j'ai vu des événements manqués à l'aide de la Borderstyle comme vous, je n'avais pas un seul événement manqué à l'aide du rectangleshape ... pas même lors de la déplacement de la souris une vitesse élevée entre 3 photopographies: il Toujours a travaillé pour moi. La seule différence est que si vous utilisez 3 photopographies, vous avez besoin de 3 gestionnaires d'événements distincts, pas une grosse affaire ...


@Kalanag - Cela semble réellement arriver lorsque vous déplacez la souris lentement hors de la boîte d'image, plus souvent à grande vitesse. Comme je l'ai dit que mon problème est que ce n'est pas cohérent.



0
votes

Besoin d'aide de votre événement de formulaire Mouseener. XXX


0 commentaires

0
votes

J'ai suivi l'idée de Kalanag en mettant ma photo à l'intérieur d'un panneau et géralisait l'événement sur la pcturebox en faisant comme ceci xxx

J'ai changé la taille du contrôle, car sinon, la photeurebox continue de scintiller le moment. La souris planant les frontières comme le curseur est entrant et laissant indéfiniment car les frontières changent la taille de la commande.

fonctionne comme un charme!


0 commentaires