Declencher un événement MouseEnter [Résolu]

Messages postés
68
Date d'inscription
vendredi 28 octobre 2005
Dernière intervention
9 janvier 2011
- - Dernière réponse : cs_pingouin84k
Messages postés
68
Date d'inscription
vendredi 28 octobre 2005
Dernière intervention
9 janvier 2011
- 17 juil. 2009 à 11:01
Bonjour,

Pour une nouvelle application, je dessine plusieurs ligne sur une Form. J'aimerai que lorsque le curseur de la souris passe à proximité d'une ligne cette ligne apparaisse en surbrillance.

Comment je peux m'y prendre. Je pensais à créer une Class dans laquelle j'ajouterai l'événement MouseEnter et redessiner la ligne quand l'événement est déclenché. Le problème c'est comment déclencher l'événement quand la souris passe sur la ligne en question.

J'ai pas du tout l'habitude de jouer avec les événements, d'où ma question de petit noobie ;-)


Merci.
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
2859
Date d'inscription
mardi 15 avril 2003
Dernière intervention
26 novembre 2013
3
Merci
Salut,

Il faut concerver les coordonnées de cette ligne, lors de l'événement MouseMove du formulaire, par calcule, si e.X et e.Y se trouve dans la limite définis par un calcul, tu redessine ta ligne, idem dans le cas d'un éloignement.

@+ Mayzz.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 105 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Mayzz
Messages postés
68
Date d'inscription
vendredi 28 octobre 2005
Dernière intervention
9 janvier 2011
0
Merci
Ouai, j'avais pensé à ça. Mais ça risque d'être assez lent si j'ai 10 000 ligne affiché à l'écran.
Je disais que si on pouvait faire comme si chaque ligne se comporte comme un contrôle, lors du passage de la souris dessus ça déclenche un événement MouseEnter qui en modifie l'apparence. Mais apparemment c'est pas trop possible. :S
Commenter la réponse de cs_pingouin84k
Messages postés
2859
Date d'inscription
mardi 15 avril 2003
Dernière intervention
26 novembre 2013
0
Merci
Bien non justement, une ligne est une ligne, en gros elle change la couleurs des pixels de ton formulaire du point A au point B, elle ne peut pas plus posséder d'évenements qu'une ligne tracer sous paint.

"Mais ça risque d'être assez lent si j'ai 10 000 ligne affiché à l'écran." <= Que veux-tu dire par la ? Lent à coder ou lent à l'exécution ? Si c'est pour le codage tu n'auras pas à coder autant que tu auras de ligne à tracer rassure toi, un simple calcule selon la position du cusreur par rapport à un tableau ou une collection de points.Pour ce qui est de l'exécution après cela dépend du contexte dans lequel est utilisé ton code, comme tu ne précise pas je ne peux pas t'aider sur le sujet.

@+ Mayzz.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Commenter la réponse de Mayzz
Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Dernière intervention
5 avril 2013
0
Merci
Bonsoir,

J'adore la précision...
"plusieurs lignes ..."
1) je pense que tu veux parler de segments
2) tu ne dis nulle part si ces "lignes" sont uniquement horizontales, uniquement verticales ou, au contraire, peuvent avoir des coefficients angulaires !... (et le degré de difficulté et l'approche ne sont alors bien évidemment pas du tout les mêmes !)
Le précision des questions (une fois de plus) est ici indispensable...
Commenter la réponse de jmf0
Messages postés
68
Date d'inscription
vendredi 28 octobre 2005
Dernière intervention
9 janvier 2011
0
Merci
Désolé pour le manque de précision, j'essaie pourtant d'être exhaustif.

1) je pense que tu veux parler de segments


Ça fait une différence en maths, mais en programmation, je ne crois pas que quelque chose d'infiniment long (une ligne) ait un sens. Ou alors segment et ligne ont une définition particulière en programmation que je ne connais pas (je veux bien qu'on m'apprenne). Donc pour répondre à la question, il s'agit bien de segment (au sens mathématique du terme.


2) tu ne dis nulle part si ces "lignes" sont uniquement horizontales, uniquement verticales ou, au contraire, peuvent avoir des coefficients angulaires !... (et le degré de difficulté et l'approche ne sont alors bien évidemment pas du tout les mêmes !)


Effectivement j'avais oublié de préciser... Il s'agit de ligne dans n'importe quel sens avec n'importe quel angle, quant à la difficulté mathématique, elle passe en second plan pour moi. La distance d'un point (le curseur) à un segment est calculé par le produit scalaire de la normale au segment avec le vecteur définit par le curseur et l'un des extrémités du segment (une des méthodes).


Que veux-tu dire par la ? Lent à coder ou lent à l'exécution ?


Je parle de lent à l'exécution. Lent à coder c'est pas un problème (sauf si on code pour coder), mais moi je code pour faire un programme, et je souhaite qu'il soit rapide à l'exécution.
Concernant le contexte il s'agit d'un mailleur, j'ai une forme quelconque et elle doit être découpé en plusieurs segments ça peut aller de quelques dizaines pour des géométries simples à plusieurs milliers pour des plus complexes. Et pour une meilleur interface je souhaite afficher en surbrillance (puis pouvoir faire des sélections, etc) les segments proches du curseur.


Bien non justement, une ligne est une ligne, en gros elle change la couleurs des pixels de ton formulaire du point A au point B, elle ne peut pas plus posséder d'évenements qu'une ligne tracer sous paint.


Je suis d'accord sur ce point. Mais comme je suis débutant, je voulais savoir s'il n'y avait pas possibilité qu'une ligne (ou un contrôle dont l'apparence serait une ligne) se comporte comme un contrôle. J'ai penser à créer un contrôle personnaliser avec un fond transparent dont 2 des 4 coins seraient les extrémités du segment. Mais ça ne marche plus dés lors que deux segments se chevauchent.



Voilà en espérant avoir donné toutes les précisions possibles.
Merci déjà pour votre intérêt ;-)
Commenter la réponse de cs_pingouin84k
Messages postés
68
Date d'inscription
vendredi 28 octobre 2005
Dernière intervention
9 janvier 2011
0
Merci
Bon ok, je fait comme tu as proposé Mayzz... Finalement ça va plus vite que ce que je croyais ^^

Si quelqu'un veut essayer la démo que j'ai faite voici le code (à copier dans le code d'une Form, rien d'autre à ajouter) :

Imports System.Math


Public Class Form1


    Private ImageBuffer As Image
    Private DessinBuffer As Graphics

    Private PositionCurseur As Point


    Private Structure Segment

        Dim Extremite1 As PointF
        Dim Extremite2 As PointF

        ReadOnly Property Longueur() As Single
            Get
                Return Sqrt((Extremite2.X - Extremite1.X) ^ 2 + (Extremite2.Y - Extremite1.Y) ^ 2)
            End Get
        End Property
        ReadOnly Property VecteurTangent() As PointF
            Get
                Dim VecteurBrut As New PointF(Extremite2.X - Extremite1.X, Extremite2.Y - Extremite1.Y)
                Dim Norme As Single = Sqrt(VecteurBrut.X ^ 2 + VecteurBrut.Y ^ 2)

                Return New PointF(VecteurBrut.X / Norme, VecteurBrut.Y / Norme)
            End Get
        End Property
        ReadOnly Property VecteurNormal() As PointF
            Get
                Dim VecteurBrut As New PointF(Extremite2.Y - Extremite1.Y, -Extremite2.X + Extremite1.X)
                Dim Norme As Single = Sqrt(VecteurBrut.X ^ 2 + VecteurBrut.Y ^ 2)

                Return New PointF(VecteurBrut.X / Norme, VecteurBrut.Y / Norme)
            End Get
        End Property


        Public Sub DessineSegment(ByRef Graphique As Graphics, ByVal PositionCurseur As Point)


            'definit si le curseur est proche du segment
            Dim VecteurCurseur As PointF = New PointF(PositionCurseur.X - Extremite1.X, PositionCurseur.Y - Extremite1.Y)
            Dim ProdScalNormal As Single = (VecteurNormal.X * VecteurCurseur.X + VecteurNormal.Y * VecteurCurseur.Y)
            Dim ProdScalTangent As Single = (VecteurTangent.X * VecteurCurseur.X + VecteurTangent.Y * VecteurCurseur.Y)

            'test de proximité
            If Abs(ProdScalNormal) < 2 Then
                If ProdScalTangent > 0 And ProdScalTangent < Longueur Then

                    'peint la ligne en rouge
                    Graphique.DrawLine(New Pen(Color.Red, 3), Extremite1, Extremite2)

                Else

                    'peint la ligne en bleu
                    Graphique.DrawLine(Pens.Blue, Extremite1, Extremite2)

                End If

            Else

                'peint la ligne en bleu
                Graphique.DrawLine(Pens.Blue, Extremite1, Extremite2)

            End If

        End Sub


    End Structure
    Dim Segments As New List(Of Segment)

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'utilise le double buffering
        Me.DoubleBuffered = True
    End Sub



    Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick

        'nettoie la précédente liste
        Segments.Clear()

        Dim SegmentTemp As Segment

        'créer les lignes au hasard
        For NoLigne As Integer = 0 To 1000

            'creer les extremité au hasard sur le form
            SegmentTemp.Extremite1 = New PointF(Rnd() * Me.Width, Rnd() * Me.Height)
            SegmentTemp.Extremite2 = New PointF(Rnd() * Me.Width, Rnd() * Me.Height)

            'ajoute le nouveau segment dans la liste
            Segments.Add(SegmentTemp)

        Next

        'affiche le résultat
        Me.Refresh()

    End Sub
    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove

        'met dans une variable la position du cruseur sur la form
        PositionCurseur = e.Location

        'redessine les lignes
        Me.Refresh()

    End Sub
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint

        'dessine dans une image
        ImageBuffer = New Bitmap(Me.Width, Me.Height)
        DessinBuffer = Graphics.FromImage(ImageBuffer)

        'dessine chaque segment de la liste
        For Each Segment As Segment In Segments
            Segment.DessineSegment(DessinBuffer, PositionCurseur)
        Next

        'affiche le résultat
        e.Graphics.DrawImage(ImageBuffer, 0, 0)

    End Sub

End Class
Commenter la réponse de cs_pingouin84k

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.