Drag n drop icone

Signaler
Messages postés
42
Date d'inscription
dimanche 22 février 2009
Statut
Membre
Dernière intervention
24 septembre 2009
-
Messages postés
42
Date d'inscription
dimanche 22 février 2009
Statut
Membre
Dernière intervention
24 septembre 2009
-
salut
je cherche à implanter un code permettant  d'afficher une icône sur un picturebox en cliquant sur un bouton et d'appliquer ensuite les fonctionnalitées de drag n drop sur cette icone ,le problème c que à chaque foi que je clique sur le bouton il maffiche le meme icone(un seul) et non pas une à chque clic.

12 réponses

Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
30
Bonjour,

Difficile de te répondre sans voir le bout de code qui genere l'icone.

C# is amazing, enjoy it!
Messages postés
42
Date d'inscription
dimanche 22 février 2009
Statut
Membre
Dernière intervention
24 septembre 2009

bonjour
grace à ce code j'ai réussi à afficher l'icone suite à chaque clic, il me reste  d'affecter les evenements du drag and drop pour l'icone affichée
merci
[int Num_PicBxs = 1;
        private void button1_Click(object sender, EventArgs e)
        {
            PictureBox p = new PictureBox();
            p.Location = new Point((Num_PicBxs*50)+20,+20);
            p.Size = new Size(50, 50);
            p.Image = Image.FromFile("d:\\laptop.ico");
            panel1.Controls.Add(p);
           Num_PicBxs++;
            p.Show();
        }]
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
30
Bonjour,

Veux-tu reelement utiliser un Drag-Drop, ou un déplacement ?

un Drag-Drop c'est quand on veut passer un control d'un control à un autre,
si c'est dans le même panel que tu veux déplacer ton icone il suffit de récuperer les évenements MouseXXXX et de déplacer la PictureBox;
ex:

bool  moving=
false;
Point  origin=
new  Point();

private  void  pictureBox1_MouseDown(
object sender,  System.Windows.Forms.MouseEventArgs  e)
{
   moving=
true;
   origin=
new Point(e.X,e.Y);
}

private 
void  pictureBox1_MouseUp(
object  sender,  System.Windows.Forms.MouseEventArgs  e)
{
   moving=
false;
}

private 
void  pictureBox1_MouseMove(
object  sender,  System.Windows.Forms.MouseEventArgs  e)
{

   if (moving)
   {

      pictureBox1.Left - = origin.X-e.X;
      pictureBox1.Top - = origin.Y-e.Y;
   }
}

C# is amazing, enjoy it!
Messages postés
42
Date d'inscription
dimanche 22 février 2009
Statut
Membre
Dernière intervention
24 septembre 2009

bonjour
oui c vrai en fait il s'agit du deplacement,merci commem pour votre reponse mais mon probleme reside le plus dans la manière de récuperer le nom du picturebox à laquelle je veux appliquer les evenements puisque la creation comme le montre mon code se fait au temps de l'exécution.
avez vous une idée?!
merci
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
30
Re,

Ce n'est pas très compliqué en C#.

D'abord lors de la création des picture boc, tu ajoute un handle pour les evenements MouseXXX,
tu ajoute le même pour toutes les PictureBox:

p.MouseUp += new  System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseUp);
p.MouseMove += new  System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseMove);
p.MouseDown += new  System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseDown);
ensuite tu renommes les méthodes de l'exemple précedent, et tu modifies la methode pictureBox_MouseMove pour recuperer la pictureBox ayant émis l'évenement.

bool  moving=false;
Point  origin=new  Point();
private  void  pictureBox_MouseDown (object  sender, System.Windows.Forms.MouseEventArgs  e)
{
moving =true;
origin= new Point(e.X,e.Y);
}
private  void  pictureBox_MouseUp (object  sender, System.Windows.Forms.MouseEventArgs  e)
{
   moving =false;
}
private  void  pictureBox_MouseMove(object  sender, System.Windows.Forms.MouseEventArgs  e)
{
   if (moving)
   {
      PictureBox pictureBox= sender as PictureBox;
      if (pictureBox  ! =  null)
      {
         pictureBox.Location=new  Point(e.X,e.Y);
         pictureBox.Left -= origin.X-e.X;
         pictureBox.Top -= origin.Y-e.Y;
      }
   }
}

C# is amazing, enjoy it!
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
30
Au fait, si un Drag-Drop t'interresse, voici comment faire.


 


Dans l'evenement MousMove du pictureBox, remplace le deplacement par l'initialisation du drag:









private

 


void

  pictureBox_MouseMove(


object

  sender, System.Windows.Forms.MouseEventArgs  e)
{



   if

(moving)
   {
      PictureBox pictureBox=sender 


as

  PictureBox;



      if

(pictureBox  != 


null

)
      {
         pictureBox.DoDragDrop(pictureBox, DragDropEffects.All );



         //pictureBox.Location=new Point(e.X,e.Y);



         //pictureBox.Left-=origin.X-e.X;



         //pictureBox.Top-=origin.Y-e.Y;


      }
   }
}




Puis sur le control cible, celui qui va recevoir le drop, ajoute les hanlder d'evenments pour DragEnter et DragDrop, pense à autoriser le DragDrop (AllowDrop = ture)

dans les hanlder d'evenements tu pourra récuperer la picture Box:
ex:

private  
void  panel2_DragEnter(
object  sender, System.Windows.Forms.DragEventArgs  e)
{
   e.Effect=DragDropEffects.Copy;
}

private 
void  panel2_DragDrop(
object  sender, System.Windows.Forms.DragEventArgs  e)
{
   PictureBox  p  = (PictureBox)e.Data.GetData(
typeof( PictureBox));

   if (p!=
null)
   {
      Point clientPoint = panel2.PointToClient(
new  Point(e.X, e.Y)); 
      PictureBox clone =
new  PictureBox();
      clone.Size = p.Size;
      clone.Image = p.Image;
      clone.Location =
new  Point(clientPoint.X-clone.Width/2,clientPoint.Y-clone.Height/2);   
      panel2.Controls.Add(clone);
      clone.Show();
   }
}

Dans l'exemple je fais une copie, on peut aussi utiliser le pointeur du control d'origine pour eviter la copie,
pour un déplacement il faudra enlever la picture box d'origine, cela se fait au retour de l'appel a DoDragDrop(...).

Bon code.
C# is amazing, enjoy it!
Messages postés
42
Date d'inscription
dimanche 22 février 2009
Statut
Membre
Dernière intervention
24 septembre 2009

merci vrmt pour votre aide et votre patience sauf que lors du test du 1er code concernant le deplacement il s'avère que dès que je déplace mon picturebox cette dernière se disparaisse!!!!
c du à quoi ca?
merci
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
30
Il n'y a pas de raison.

Fais voir ton code .

C# is amazing, enjoy it!
Messages postés
42
Date d'inscription
dimanche 22 février 2009
Statut
Membre
Dernière intervention
24 septembre 2009

bonjour
 cava ca marché j'ai trouvé la faute
merci bien
Messages postés
42
Date d'inscription
dimanche 22 février 2009
Statut
Membre
Dernière intervention
24 septembre 2009

salut

en appliquant ce code j'ai constaté qu'il me renvoit des coordonnées erronés!!
je c pa d'ou vient le pproblème?

[
private void pictureBox_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
           
             if (isDragging)
            {PictureBox pictureBox = sender as PictureBox;
            if (pictureBox != null)
            {
                pictureBox.Top = pictureBox.Top + (e.Y - currentY);
                pictureBox.Left = pictureBox.Left + (e.X - currentX);
            }
               
            }
            
        }
]
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
30
Bonjour,

que veux-tu dire par des coordonnées érronées ?
Si currentX et currentY sont les cooredonnées du click cela devrait fonctionner.

utilise le debugger pour afficher les valeurs des differentes variables, tu devrais trouver ce qui ne va pas.

C# is amazing, enjoy it!
Messages postés
42
Date d'inscription
dimanche 22 février 2009
Statut
Membre
Dernière intervention
24 septembre 2009

bonjour

en fait j'ai affiché les coordonnées(currentX,currentY) en deplacant mon picturebox,en faisant des translations,ses coordonnées ne correspondent pas à ce que doivent etre.
concernant le debugger,j'ai pas bien saisi comment ca se fait.
merci