Drag n drop icone

adsana Messages postés 42 Date d'inscription dimanche 22 février 2009 Statut Membre Dernière intervention 24 septembre 2009 - 28 avril 2009 à 23:08
adsana Messages postés 42 Date d'inscription dimanche 22 février 2009 Statut Membre Dernière intervention 24 septembre 2009 - 3 mai 2009 à 10:47
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

cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
1 mai 2009 à 12:52
Bonjour,

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

C# is amazing, enjoy it!
0
adsana Messages postés 42 Date d'inscription dimanche 22 février 2009 Statut Membre Dernière intervention 24 septembre 2009
1 mai 2009 à 12:59
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();
        }]
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
1 mai 2009 à 17:16
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!
0
adsana Messages postés 42 Date d'inscription dimanche 22 février 2009 Statut Membre Dernière intervention 24 septembre 2009
1 mai 2009 à 17:39
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
0

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

Posez votre question
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
1 mai 2009 à 17:54
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!
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
1 mai 2009 à 18:06
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!
0
adsana Messages postés 42 Date d'inscription dimanche 22 février 2009 Statut Membre Dernière intervention 24 septembre 2009
1 mai 2009 à 18:14
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
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
1 mai 2009 à 19:07
Il n'y a pas de raison.

Fais voir ton code .

C# is amazing, enjoy it!
0
adsana Messages postés 42 Date d'inscription dimanche 22 février 2009 Statut Membre Dernière intervention 24 septembre 2009
1 mai 2009 à 19:17
bonjour
 cava ca marché j'ai trouvé la faute
merci bien
0
adsana Messages postés 42 Date d'inscription dimanche 22 février 2009 Statut Membre Dernière intervention 24 septembre 2009
3 mai 2009 à 01:06
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);
            }
               
            }
            
        }
]
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
3 mai 2009 à 09:08
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!
0
adsana Messages postés 42 Date d'inscription dimanche 22 février 2009 Statut Membre Dernière intervention 24 septembre 2009
3 mai 2009 à 10:47
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
0
Rejoignez-nous