IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Dessiner une droite en cliquant avec la souris


Sujet :

VB.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 80
    Points
    80
    Par défaut Dessiner une droite en cliquant avec la souris
    Bonjour , je chercher à dessiner une droite sur un control chart .(ce control chart est intégré dans un control tabpage)
    Dans mon application j'aie également un control toolStripBar avec 4 boutons .

    1 de ses 4 boutons ici le 2 ème doit lancer la fonction "Dessine droite avec la souris" .(Avec le bouton qui prend un aspect enfonce au premier point et relaché à la saisie du second point) .

    Voici ou j'en suis , j'aie un peu de mal à coordoner tous les différents évènements entre eux .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     Private premierptclique As Point 
        Private ThePen As New System.Drawing.Pen(Color.Red) 
     
        Private Sub Chart1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Chart1.MouseDown
     
     
            Dim NewPoint As New Point(e.X, e.Y)   'e fait partis des paramètres de Chart1_Mousedown
            'e fournis les COORDONNEES DE LA SOURIS
            premierptclique = NewPoint
     
        End Sub
     
        Private Sub Chart1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Chart1.MouseClick
            'If Chart1.Capture Then
            'End If
     
            Dim secondpointclique As New Point(e.X, e.Y)
            Dim NewGraphic As Graphics = Chart1.CreateGraphics()
            NewGraphic.DrawLine(ThePen, premierptclique, secondpointclique)
     
        End Sub
     
     
        Private Sub Chart1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Chart1.Click
     
        End Sub
        Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click
     
        End Sub
     
        Private Sub ToolStripButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton2.Click
     
            ToolStripButton2.Checked = False   'je cherche l'aspect bouton enfoncé
            ToolStripButton2.CheckOnClick = True 'je cherche l'aspect bouton enfoncé et je ne constate rien de particulier
            MsgBox("Pour voir uniquement")
     
     
        End Sub
     
        End Sub

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    Bonjour aA189
    Dessiner une droite ,un line ,un polyline ou un polygone tout se fait dans MouseDown simplement.
    Click gauche premier point,......Click gauche 2eme point,Click gauche point suivant .......,Click droit dernier point.
    Un Boolean se rappelle si la gauche a ete presse precedement.
    Il faut simplement suivre les mouvements de la souris user
    code exemple pour un WinForm(tu remplace par Chart)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    Imports System.Drawing.Drawing2D
    Public Class Form2
     
        Dim g As Graphics
        Dim ptCourant As Point = New Point(0, 0)
        Dim ptPrecedent As Point = New Point(0, 0)
        Dim boolOnDessine As Boolean = False
        Public Sub New()
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            'Tient compte du redimensionnement de la forme
            Me.ResizeRedraw = True
            g = Graphics.FromHwnd(Me.Handle)
            '  Met Couleur Fond=Blanc.
            g.Clear(Color.White)
     
     
        End Sub
        ' Code pour dessine segment de ligne suivant
        Private Sub Form2_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
     
            'Bouton  Souris presse?
            Dim BoutonPresse As MouseButtons = e.Button
            If BoutonPresse = Windows.Forms.MouseButtons.Left Then ' Gauche demarre le dessin
                boolOnDessine = True
                ptCourant = e.Location
            ElseIf BoutonPresse = Windows.Forms.MouseButtons.Right Then ' Droit arrete le dessin
                boolOnDessine = False
            End If
            ' Si Bouton  Gauche Presse =>Dessiner
            If boolOnDessine Then
                ' Ce n'est pas la premiere fois que souris a ete clique
                ' dessine le line
                If ptPrecedent.X <> 0 And ptPrecedent.Y <> 0 Then
                    g.DrawLine(New Pen(Color.Black, 2.0), ptPrecedent, ptCourant)
                    ptPrecedent = ptCourant
     
                Else  ' C'est la permiere fois memorise le point courant comme precedent
                    ptPrecedent = ptCourant
                End If
            Else             'Si Bouton  Droit =>Fin du dessin
                'Reset ptPrecedent
                ptPrecedent = New Point(0, 0)
            End If
        End Sub
    Bon dessin................

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    Dans les logiciels de dessin quand tu traces une droite, tu maintiens le clique souris et tu traces ta droite.

    En utilisant le mouseDown pour définir l'origine et MouseUp pour définir l'extrémité de la droite.

    Je testerai et je posterai un morceau de code

    ++

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 80
    Points
    80
    Par défaut
    Donc l'évènement mouse_down réagit bien avec 2 défauts
    1/La ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.DrawLine(New Pen(Color.Black, 2.0), ptPrecedent, ptCourant)
    est éxecutée sans faute mais elle n'apparait pas à l'écran .Il doit manquer
    une méthode .repaint au quelque chose comme ça

    2/Le 2ème inconvénient est que l'évènement se déclenche tout le temps à
    chaque clic de souris .Or cet évènement ne doit être actif que lorsque je clique
    sur le bouton n° 2 de ma barre d'outils

    Par la suite j'aurais d'autres fonctions de dessins à base d'évènement mouse_down , il ne faut pas qu'elle s'emmêlent les unes les autres .(et j'aie déjà un réglage de zoom qu'il faudra probablement que j'anesthésie temporairement)

  5. #5
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    Bonjour aA189
    c'est pas le paint qui manque.Il faut lire avec attention comme j'ai lu ton post.
    Il n ' y a aucun defaut .
    Tu voudrais que je fasse tout le travail à ta place.
    J' ai mentionne qu'il faut remplacer Me (le form) par ton controle Chart ce que tu n'as pas fait.
    Quant au ToolStripMenuItem tu n' as qu' a le gerer come tout le reste.
    voici le code mache:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    Imports System.Drawing.Drawing2D
    Public Class frmMsChart
        Dim g As Graphics
        Dim ptCourant As Point = New Point(0, 0)
        Dim ptPrecedent As Point = New Point(0, 0)
        Dim boolOnDessine As Boolean = False
        Sub New()
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            Me.ResizeRedraw = True
            g = Graphics.FromHwnd(Me.Chart1.Handle)
            '  Met Couleur Fond=Blanc.
            g.Clear(Color.White)
     
        End Sub
        ' Code pour dessine segment de ligne suivant
        Private Sub Chart1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Chart1.MouseDown
            'Bouton  Souris presse?
            If Me.DrawPolylineToolStripMenuItem.CheckState = CheckState.Unchecked Then Exit Sub
            Dim BoutonPresse As MouseButtons = e.Button
            If BoutonPresse = Windows.Forms.MouseButtons.Left Then ' Gauche demarre le dessin
                boolOnDessine = True
                ptCourant = e.Location
            ElseIf BoutonPresse = Windows.Forms.MouseButtons.Right Then ' Droit arrete le dessin
                boolOnDessine = False
            End If
            ' Si Bouton  Gauche Presse =>Dessiner
            If boolOnDessine Then
                ' Ce n'est pas la premiere fois que souris a ete clique
                ' dessine le line
                If ptPrecedent.X <> 0 And ptPrecedent.Y <> 0 Then
                    g.DrawLine(New Pen(Color.Black, 2.0), ptPrecedent, ptCourant)
                    ptPrecedent = ptCourant
     
                Else  ' C'est la permiere fois memorise le point courant comme precedent
                    ptPrecedent = ptCourant
                End If
            Else             'Si Bouton  Droit =>Fin du dessin
                'Reset ptPrecedent
                ptPrecedent = New Point(0, 0)
     
            End If
        End Sub
     
        Private Sub DrawPolylineToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DrawPolylineToolStripMenuItem.Click
            Me.DrawPolylineToolStripMenuItem.Checked = Not Me.DrawPolylineToolStripMenuItem.Checked
        End Sub
    End Class
    bon code..............

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 80
    Points
    80
    Par défaut
    Ok Mabrouki ...
    Maintenant j'aie vue une solution pour gérer le toolstripmenu .
    Cependant ,j'aie l'impression que cela fonctionne uniquement pour un chart déposé directement sur un control form .

    Or mon Chart est incorporé de la façon suivante

    J'aie un control form avec dessus un TableLayoutPanel qui contient un tabpage et enfin 1 des tabpage contient mon chart .

    J'aie resimplifier le code pour y voir plus clair .(J'arrive à dessiner quelques droites mais pas en intégrant les controls les un dans les autres)
    Quand à remplacer le Me par le Chart , je ne comprend pas vraiment ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    Imports System.Drawing
     
    Public Class Form1
     
        Inherits System.Windows.Forms.Form
        Private PreviousPoint As Point ' Dernier point de la souris
        Private ThePen As New System.Drawing.Pen(Color.Red) 'Un Pen pour dessiner.
     
        Dim g As Graphics
        Dim ptCourant As Point = New Point(0, 0)
        Dim ptPrecedent As Point = New Point(0, 0)
        Dim boolOnDessine As Boolean = False
     
        Sub New()
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            Me.ResizeRedraw = True
            g = Graphics.FromHwnd(Me.Chart1.Handle)
     
            '  Met Couleur Fond=Bleu.
            g.Clear(Color.Blue)
     
        End Sub
     
     
        Private Sub Chart1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
     
            ptCourant = e.Location
     
            If ptPrecedent.X <> 0 And ptPrecedent.Y <> 0 Then
                g.DrawLine(ThePen, ptPrecedent, ptCourant)
                ptPrecedent = ptCourant
     
            Else  ' C'est la permiere fois memorise le point courant comme precedent
                ptPrecedent = ptCourant
            End If
     
        End Sub
     
        Private Sub TableLayoutPanel1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TableLayoutPanel1.MouseDown
            'ptCourant = e.Location
     
            'If ptPrecedent.X <> 0 And ptPrecedent.Y <> 0 Then
            '    g.DrawLine(ThePen, ptPrecedent, ptCourant)
            '    ptPrecedent = ptCourant
     
            'Else  ' C'est la permiere fois memorise le point courant comme precedent
            '    ptPrecedent = ptCourant
            'End If
     
        End Sub
     
    End Class

  7. #7
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    Bonjour aA189
    Le fait que le control MsChart soit contenu dans un TabControl lequel est contenu dans un TableLayoutPanel lequel .....pourrait etre lui meme dans un StackPanel.... positionne dans un WinForm n'empeche le mschart de fonctionner parfaitement.
    Ne soit pas effraye par ca c'est concu justement pour ca......
    Je t'envoie ci-joint le projet winform avec ,pour t'en convaincre , MsChart dans un TabPage1 d'un TabControl1 contenu dans un TableLayoutPanel1 contenu dans un WinForm.
    Quant à remplacer Me par Me.MsChart.Handle je parle de cette ligne neccessaire pour peindre sur MsChart et non le Form:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       g = Graphics.FromHwnd(Me.Chart1.Handle)
    car dans le premier post il y avait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      g = Graphics.FromHwnd(Me.Handle)
    pj:fichier projet winform zip
    bon code....................

  8. #8
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    Rebonjour aA189
    excuse-moi pour le fichier zip que je t'envoie maintenant en ci-joint.Une deconnexion m'as fait rater l'envoi.
    bonne soiree........

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 80
    Points
    80
    Par défaut
    Salut !

    Voici ,j’obtiens un message d’erreur dans le fichier frmMsChart.designer .vb en ouvrant ton fichier .

    Erreur 3 Type 'System.Windows.Forms.DataVisualization.Charting.Chart' non défini. C:\Documents and Settings\a\Mes documents\Visual Studio 2010\Projects\DessinPolylines\frmMsChart.Designer.vb 39 33 WinAppPolylines
    Si j’ouvre le fichier frmMsChart.vb , je constate que les controls ont « sautés » alors qu’ils sont codés dans le frmMsChart.designer .vb

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      Friend WithEvents MenuStrip1 As System.Windows.Forms.MenuStrip
        Friend WithEvents PolyLineToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
        Friend WithEvents DrawPolylineToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
        Friend WithEvents TabControl1 As System.Windows.Forms.TabControl
        Friend WithEvents TabPage1 As System.Windows.Forms.TabPage
     
     Friend WithEvents Chart1 As System.Windows.Forms.DataVisualization.Charting.Chart
      ‘ICI message d’erreur   
    ‘System.Windows.Forms.DataVisualization.Charting.Chart non défini
     
    Friend WithEvents TabPage2 As System.Windows.Forms.TabPage
    Ensuite j’aie 2 avertissements

    Avertissement 1 impossible de résoudre la référence primaire "System.Windows.Forms.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", qui est un assembly framework, dans le framework actuellement ciblé. ".NETFramework,Version=v4.0". Pour résoudre ce problème, supprimez la référence "System.Windows.Forms.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" ou reciblez votre application vers une version de framework qui contient "System.Windows.Forms.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35". WinAppPolylines

    Avertissement 2 Le composant référencé 'System.Windows.Forms.DataVisualization' est introuvable.
    NB : j’utilise l’IDE Microsoft Visual Basic 2010 express .
    En gros je pense que ce qui marche avec le control chart sous 2009 ne marche plus sous 2010 .Sous 2008 le control chart n’est pas présent dans la boite à outils , sous 2009 je ne sais pas probablement que non , par contre sous 2010 le control Chart n’a pas à être chargé .(Peut-être un début d’explication aux messages d ‘erreurs recontrés)

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 80
    Points
    80
    Par défaut
    Pour ci-dessus les messages d'erreur sont incompréhensibles .A présent le fichier fonctionne mais je ne sais pas pourquoi .

    De même j'aie du recommencer mon projet à zéro en commençant par la macro dessine droite (J'aie du refaire tous mes réglages et ma présentation)
    Par contre à present cela dessine sur mon Chart incorporé dans 1 tabpage .
    Les difficultés que je rencontre sont probablement dus à mes copier-collés
    successifs et à une mauvaise utilisation de l'IDE .

    Pour l'instant le resultat est un peu étrange à l'écran et interagit un peu avec ma fonction zoom .Mais le principe y est .Cela dessine une droite .

    Merci à toi Mabrouki , cela m'a permis de démarrer .
    Toutefois , je suis loin d'être arrivé car j'anticipe une technique de serialisation
    pour enregister mes lignes + probablement une macro pour retranformer les coordonnées pixel en coordonnées selon la nature de mes axes

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 23/07/2013, 03h08
  2. Dessiner une droite avec Cairo
    Par Gamall dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 31/10/2009, 09h23
  3. Détecter les modifications faites dans une zone de texte avec la souris
    Par nosferapti dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 24/09/2009, 09h48
  4. Réponses: 3
    Dernier message: 19/05/2009, 15h32
  5. Faire glisser une image trop grande avec la souris
    Par avogadro dans le forum Général JavaScript
    Réponses: 25
    Dernier message: 28/07/2006, 16h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo