Question en Csharp

ETUDINF - 6 avril 2013 à 18:59
Whismeril Messages postés 19034 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 - 12 avril 2013 à 21:21
salut comment je peux dessiner une ligne entre deux TextBox ou deux labels lors de la deuxième clic quand je clique sur le premier puis sur le deuxième le flèche se dessine s
            
                

13 réponses

salut comment je peux dessiner une ligne entre deux TextBox ou deux labels lors de la deuxième clic quand je clique sur le premier puis sur le deuxième le flèche se dessine aide svp

                
0
Whismeril Messages postés 19034 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 656
6 avril 2013 à 20:07
Bonsoir,

pour que cela arrive après avoir clické sur les deux textbox, il faut te servir des événements Click.

Ensuite il y a DrawLine comme décrit




Whismeril
0
OK merci bien j’essaierai à faire ça
0
ça marche pas il y a affichage de plusieurs lignes au lieu de deux

                
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19034 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 656
7 avril 2013 à 00:49
Il faudrait que tu postes le code que tu as écrit pour qu'on puisse voir ou ça bogue.


Whismeril
0
mon code est le suivant il est exécutable amis le problème que je veux dessiner deux lignes seulement car je déplace les textBox sous forme d'un triangle (1 en haut et 2 en bas ) une ligne entre le premier textBox et le deuxième en cliquant sur le premier puis sur le deuxième ensuite une autre ligne entre le premier et le troisième en cliquant aussi sur le premier puis sur le deuxième mais ça marche pas aide svp. merci d'avance
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace drag
{
    public partial class Form1 : Form
    {
        private bool _dragging = false;
        private Point _curLoc = new Point(-1, -1);
        TextBox []t=new TextBox[100];
        Button bt = new Button();
        GraphicsPath line;

        public Form1()
        {
            InitializeComponent();
            line = new GraphicsPath();
            bt.Location = new Point(200, 200);
            bt.Text = "click";
            bt.Click += new EventHandler(bt_Click);
            this.Controls.Add(bt);
        }
        void creationLabel(int nb,String []name)
        {
            for (int i = 0; i < nb; i++)
            {
                TextBox l = new TextBox();
                t[i] = l;
                l.Text = name[i];                




                t[i].BackColor = Color.Black;
                t[i].MouseDown += new MouseEventHandler(l_MouseDown);
                t[i].MouseMove += new MouseEventHandler(l_MouseMove);
                t[i].MouseUp += new MouseEventHandler(l_MouseUp);
                t[i].MouseClick += new MouseEventHandler(l_MouseClick);

                this.Controls.Add(l);
            }
        }
        void bt_Click(object sender, EventArgs e)
        {
            String []names= new String[10];
            names[0] = "I";
            names[1] = "eat";
            names[2] = "apple";
            creationLabel(3,names);
        }

        private void l_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                _dragging = true;
                _curLoc = new Point(-e.X, -e.Y);
                ((TextBox)sender).BackColor = Color.Black;
                ((TextBox)sender).BringToFront();
            }
        }
        private void l_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                richTextBox1.Text = "[I] --> X: "+t[0].Location.X + " Y: " + t[0].Location.Y+" [eat] --> X"+t[1].Location.X+" Y: "+t[1].Location.Y;
                line.AddLine(new Point(t[0].Location.X, t[0].Location.Y), new Point(t[1].Location.X, t[1].Location.Y));
                
            }
        }

        private void l_MouseMove(object sender, MouseEventArgs e)
        {
            if (_dragging)
            {
                Point mousePos = this.PointToClient(Control.MousePosition);
                mousePos.Offset(_curLoc.X, _curLoc.Y);                
                ((TextBox)sender).Location = mousePos;
            }
        }

        private void l_MouseUp(object sender, MouseEventArgs e)
        {
            _dragging = false;
            ((TextBox)sender).BackColor = Color.White;
        }

        private void button2_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {

        }
        protected override void OnPaint(PaintEventArgs e)
        {            
            base.OnPaint(e);
            e.Graphics.DrawPath(Pens.Black, line);

            if (_dragging)
               
                {
                line.AddLine(new Point(407, 80), new Point(331, 80));
              
            }

            {
                    line.AddLine(new Point(407, 80), new Point(410, 90));
                
                }


            
        }

        
    }
}
0
s'il vous plait j'ai besoin de votre aide
0
Whismeril Messages postés 19034 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 656
10 avril 2013 à 08:38
Bonjour, je ne comprends pas trop ce que tu veux faire.

Au lieu de poster le formulaire entier, merci de ne mettre que la partie qui te pose problème et de bien commenter de façon à ce que l'on puisse voir tes attentes.


Whismeril
0
OK je veux savoir comment je peux dessiner une ligne entre deux textbox en cliquant sur le premier puis sur le deuxième et ça ce fait après le drag and drop de cette dernière
 protected override void OnPaint(PaintEventArgs e)
        {            
            base.OnPaint(e);
            e.Graphics.DrawPath(Pens.Black, line);

            if (_dragging)
               
                {
                line.AddLine(new Point(407, 80), new Point(331, 80));
              
            }

            {
                    line.AddLine(new Point(407, 80), new Point(410, 90));
                
                }
0
Whismeril Messages postés 19034 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 656
10 avril 2013 à 13:04
OK, alors pourquoi mettre ce code dans l'événement OnPaint du formulaire?
Il faut que ce soit dans l'événement Click des textbox, je te l'ai déjà écrit plus haut d'ailleurs.

Ensuite la méthode telle que tu l'a écrite fera une ligne entre new Point(407, 80), new Point(331, 80), et ce quelque soit la position de tes textbox.

Il te faut écrire une méthode, qui enregistre le coordonnées du premier textbox clické, puis au deuxième click tarce un trait à partir des coordonnées enrigistrées jusqu'à celle du textbox.
Une fois le trait tracé, il faut vider l'enregistrement pour le prochain trait.


Whismeril
0
mais aussi ça marche pas
0
même si j'ai une méthode, qui enregistre le coordonnées du premier textbox clické
0
Whismeril Messages postés 19034 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 mai 2024 656
12 avril 2013 à 21:21
Bon

j'ai commencé par écrire une classe pour gérer les coordonnées
    class maLigne
    {

        /// <summary>
        /// Classe gérant les coordonnees pour dessiner une ligne
        /// </summary>
        public maLigne()
        {
            Origine = new Point(-1,-1);//valeurs par défaut
            Fin = new Point(-1,-1);
        }

        public Point Origine { get; set; }
        public Point Fin { get; set; }

        /// <summary>
        /// Retourne si la ligne est prête à être dessinée
        /// </summary>
        public bool Pret
        {
            get { return !BesoinOrigine && (Fin.X != -1) && (Fin.Y != -1); }
        }

        /// <summary>
        /// Retourne si la ligne a besoin de definir son origine
        /// </summary>
        public bool BesoinOrigine
        {
            get { return (Origine.X -1) && (Origine.Y -1); }
        }

        /// <summary>
        /// Décalle la fin de la ligne précédente vers l'origine de la suivante
        /// </summary>
        public void Decalle()
        {
            Origine = Fin;
            Fin = new Point(-1,-1);
        }
    }



dans mon forumulaire, j'ai déclarer une maLigne
maLigne ligne = new maLigne();


jai viré ce que tu as mis dans le MouseClick et réécrit le MouseUp comme suit:
 private void l_MouseUp(object sender, MouseEventArgs e)
        {
            timer1.Enabled = false;
            _dragging = false;

            TextBox maTextBox = (TextBox)sender;

            maTextBox.BackColor = Color.White;

            if (ligne.BesoinOrigine) ligne.Origine = new Point(maTextBox.Left, maTextBox.Top);//le point d'origine n'est pas défini, alors on le crée
                
            else//le point d'origine est défini, alors je trace ma ligne
            {
                ligne.Fin = new Point(maTextBox.Left, maTextBox.Top);
                
                this.Refresh();//je force le formulaire à se redessiner, comme la ligne est prête elle sera ajoutée

                ligne.Decalle();//je décale pour la ligne suivante

                this.Refresh();//la ligne n'apparait pas mais je refait refresh pour qu'elle s'affcihe

            }

        }


et enfin le OnPaint comme suit
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            e.Graphics.DrawPath(Pens.Black, line);

            if (ligne.Pret) line.AddLine(ligne.Origine, ligne.Fin);//si la ligne est prête je l'ajoute

        }


Ça ne me parait pas très propre de faire un refresh pour pouvoir ajouter la ligne, mais ça marche pour les 2 premiers traits.
Pour le 3eme, il faut recliquer sur la première TextBox

Whismeril
0
Rejoignez-nous