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

Windows Forms Discussion :

dessiner un trait dans une listBox?


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 68
    Points : 33
    Points
    33
    Par défaut dessiner un trait dans une listBox?
    Bonjour

    j'aimerai dessiner une ligne dans une listBox pour séparer deux item mais je n'y arrive pas
    Quelqu'un peut il me mettre sur la voie?
    merci d'avance

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 172
    Points : 25 112
    Points
    25 112
    Par défaut
    euh, ca semble pas évident
    avec listbox.creategraphics.drawline, tu peux tracer une ligne

    mais si tu veux que tes elements soient séparés par des lignes, je peux qu'il faut heriter de listbox et overrider la sub qui dessine un élément et faire le trait

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 68
    Points : 33
    Points
    33
    Par défaut
    en fait cest pas tous les items c'est dans le cas d'un drag and move...au mouseMouve sur la listbox je souhaite déplacer un trait horizontal indiquant ou sera inséré l'index au mouseUp de la souris...
    il faut donc que dans le MouseMouve je puisse efacer l'ancien trait pour retracer le nouver (enfin un drag and drop quoi)
    Help me please

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 68
    Points : 33
    Points
    33
    Par défaut
    en fait dans le MouseMove de ma listebox j'ai ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
                    P1.X = 0;
                    P1.Y = e.Y;
                    P2.X = listBox1.Width;
                    P2.Y = e.Y;
     
     
     
                    Pen crayon = new Pen(Color.Black,1);
                    Graphics dessin = listBox1.CreateGraphics();
                    dessin.DrawLine(crayon, P1, P2);
                    listBox1.Invalidate();
    le trait ne suis pas bien la souris ca ressemble à un problème de raffraichissement

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 68
    Points : 33
    Points
    33
    Par défaut
    quelqu'un a t il un exemple de drag and drop dans une listbox

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 172
    Points : 25 112
    Points
    25 112
    Par défaut
    pour le drag and drop, y a des exemples sur le forum ou dans l'aide de vs
    ca commence par un .DoDragDrop(item)

    ensuite pour déssiner le trait, tu peux selon x et y faire un trait, puis si le trait doit etre autrepart tu fais listbox.Refresh puis retrace du trait

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 68
    Points : 33
    Points
    33
    Par défaut
    oui le listbox.refresh marche mais le problème c'est que je n'efface pas le trait précedemment créé ca devient donc vite plein de trait dans la listbox

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 172
    Points : 25 112
    Points
    25 112
    Par défaut
    quand je disais listbox.refresh c'était pour effacer le trait
    tu dis que ca marche et que ca efface pas le trait alors ca marche pas ...

    essaye listbox.invalidate
    ou listbox.creategraphics.clear(white) puis listbox.refresh

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 68
    Points : 33
    Points
    33
    Par défaut
    il sont ou les exemples sur le forum je les trouve pas

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 68
    Points : 33
    Points
    33
    Par défaut
    listbox.creategraphics.clear(white) ca marche pas ca efface meme le texte

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 68
    Points : 33
    Points
    33
    Par défaut
    je renouvelle mon post je n'arrive pas a trouver d'exmple me permettant de faire du drag and drop dans une listbox..
    en fait j'y arrive (un peut a l'artisanale je pense...on fait comme on peut) mais je n'arrive pas à avoir le trait dans la liste box au déplacement de la souris permettant d'indiquer où sera positionné l'item au relachement de la souris..
    merci d'avance

  12. #12
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 88
    Points : 99
    Points
    99
    Par défaut
    Bonjour,

    Oulà.
    Pour faire ce que tu veux, tu as besoins d'implémenter :
    1 > L'événement DrawItem du contrôle ListBox.
    2 > L'évenement DragOver du contrôle ListBox.

    Dans le 2, tu détermine l'items de ton contrôle sur lequel pointe ta souris.
    Dans le 1, tu redessinne tous tes items. c'est pas très compliqué avec l'objet Graphics. Et tu dessine ton trait dans l'item pointé déterminer par le 2.

    Voilà, @ +

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 68
    Points : 33
    Points
    33
    Par défaut
    mais j'ai essayé mais je tombe jamais dans le drawitem

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Salut,

    j'ai une source qui trainait sur mon ordi et que faisait ce que tu voulais, à noter cependant qu'il y a surement moyen d'optimiser tout ca, je l'avais un peu ecrit à la va-vite.

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
        public partial class Form1 : Form
        {
            private class TransportBox
            {
                object m_o;
                public object Objet
                {
                    get { return m_o; }
                }
     
                public TransportBox(object o)
                {
                    m_o = o;
                }
            }
     
            Rectangle m_dragRectangle;
            int m_selectedIndex;
     
            public Form1()
            {
                InitializeComponent();
                this.listBox1.DragOver += new DragEventHandler(listBox1_DragOver);
                this.listBox1.DragDrop += new DragEventHandler(listBox1_DragDrop);
                this.listBox1.MouseMove += new MouseEventHandler(listBox1_MouseMove);
                this.listBox1.MouseDown += new MouseEventHandler(listBox1_MouseDown);
                this.listBox1.MouseUp += new MouseEventHandler(listBox1_MouseUp);
                m_selectedIndex = -1;
     
                for (int i = 0; i < 5; i++)
                {
                    listBox1.Items.Add(i);
                }
            }
     
            void listBox1_MouseDown(object sender, MouseEventArgs e)
            {
                if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
                {
                    m_dragRectangle = new Rectangle(
                        new Point(e.X - (SystemInformation.DragSize.Width / 2), e.Y - (SystemInformation.DragSize.Height / 2)),
                        SystemInformation.DragSize);
                }
            }
     
            void listBox1_MouseUp(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    m_dragRectangle = Rectangle.Empty;
                }
            }
     
            void listBox1_MouseMove(object sender, MouseEventArgs e)
            {
                if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
                {
                    int index = listBox1.IndexFromPoint(e.Location);
                    if (m_dragRectangle != Rectangle.Empty && !m_dragRectangle.Contains(e.Location) && index != ListBox.NoMatches)
                    {
                        TransportBox trans = new TransportBox(listBox1.Items[index]);
                        DragDropEffects finalEffect = listBox1.DoDragDrop(trans, DragDropEffects.Move);
                    }
                }
            }
     
     
            void listBox1_DragOver(object sender, DragEventArgs e)
            {
                int index = listBox1.IndexFromPoint(listBox1.PointToClient(new Point(e.X, e.Y)));
                if (index != ListBox.NoMatches)
                {
                    if (m_selectedIndex != index)
                    {
                        m_selectedIndex = index;
                        Refresh();
                    }
                    Rectangle rect = listBox1.GetItemRectangle(index);
                    using (Graphics g = listBox1.CreateGraphics())
                    {
                        Pen p = new Pen(Brushes.Black, 2);
                        g.DrawLine(p, rect.Location, rect.Location + new Size(rect.Width, 0));
                    }
                    e.Effect = DragDropEffects.Move;
                }
                else
                    e.Effect = DragDropEffects.None;
            }
     
            void listBox1_DragDrop(object sender, DragEventArgs e)
            {
                int index = listBox1.IndexFromPoint(listBox1.PointToClient(new Point(e.X, e.Y)));
                if (index != ListBox.NoMatches && e.Effect == DragDropEffects.Move)
                {
                    TransportBox trans = e.Data.GetData(typeof(TransportBox)) as TransportBox;
                    if (trans != null)
                    {
                        object o = trans.Objet;
                        if (o != null)
                        {
                            this.listBox1.Items.Remove(o);
                            this.listBox1.Items.Insert(index, o);
                        }
                    }
                }
            }
        }
    Je pense que ca fait ceux que tu souhaites (trace une ligne à l'emplacement d'insertion).

    Si tu te poses la question de pourquoi la classe TransportBox, c'est du a certaines limitations de IDataObject.GetData(Type) qui ne supporte pas l'heritage (genre pouvoir coller un System.Object ne marche pas, ou alors j'ai jamais compris comment faire).

    Bon courage.

  15. #15
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 88
    Points : 99
    Points
    99
    Par défaut
    mais j'ai essayé mais je tombe jamais dans le drawitem
    Il existe une propriété DrawMode à modifier pour que tu passe dans le drawitem.

Discussions similaires

  1. recherche dans une listbox
    Par micknic dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 23/02/2005, 21h39
  2. Clique droit dans une ListBox
    Par LoicH dans le forum C++Builder
    Réponses: 5
    Dernier message: 07/02/2005, 22h50
  3. [debutant] supprimer elements dans une listbox
    Par F.F. dans le forum C++Builder
    Réponses: 8
    Dernier message: 02/07/2004, 11h38
  4. [WIN32]tabulation dans une listbox
    Par stoluup dans le forum MFC
    Réponses: 2
    Dernier message: 09/06/2004, 10h11
  5. Icône a coté du texte dans une ListBox
    Par joce3000 dans le forum C++Builder
    Réponses: 6
    Dernier message: 05/12/2003, 02h25

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