2010-01-01 7 views
0

Je suis en train de programmer un jeu de cartes, quand je faisais la partie visuelle j'avais du mal à déplacer la carte dans un panneau d'un endroit à un autre, l'image clignote et bouge partout quand j'essaie de déplace le.Problème avec le Picturebox en mouvement

C'est mon code .....

public partial class Form1 : Form 
{ 
    bool clicked = false; 
    public Form1() 
    { 
     InitializeComponent(); 
     pictureBox1.ImageLocation = @"c:\kingHearts.png"; 
     pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 

    } 

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     clicked = true; 
    } 

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (clicked) 
      pictureBox1.Location = e.Location; 
    } 

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
    { 
     clicked = false; 

    } 
} 

Alors quel est le problème, tout le monde peut aider plz ....

Répondre

2

Un modèle très typique pour déplacer par cliquer-glisser pour les objets ui à l'exécution, et qui fonctionne lorsque le contrôle est sur une forme, ou dans un récipient comme un panneau:

private bool pb_mouseIsDown; 
private int oX; 
private int oY; 

private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    pb_mouseIsDown = true; 
    oX = e.X; 
    oY = e.Y; 
} 

private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
{ 
    pb_mouseIsDown = false; 
} 

private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (pb_mouseIsDown) 
    { 
     pictureBox1.Left += e.X - oX; 
     pictureBox1.Top += e.Y - oY; 
    } 
} 

Remarque: ... au moment du design: si vous définissez les gestionnaires d'événements pour MouseUp, MouseDown et MouseMove alors que le contrôle est sur un formulaire (le parent du contrôle est le formulaire), puis coupez et collez-le dans un conteneur, comme un Panel: vous aurez rétabli la liaison/liaison entre le contrôle et les événements MouseDown, MouseUp et MouseMove dans l'EDI pour que cela fonctionne.

+0

Thanx BillW cela fonctionne. mais j'ai encore un pense, si je veux ancrer la carte à un autre panneau sur realeas j'ai utilisé ce qui suit mais je manque la condition ...? private void pictureBox1_MouseUp (expéditeur d'objet, MouseEventArgs e) { if() // Quelle est la condition doit être 'contain' !! { pictureBox1.Left = panneau1.Gauche; pictureBox1.Top = panel1.Top; } } – Waleedoo

+0

@Waleedoo, Lorsque la souris se lève, après le déplacement d'une "carte", seule la "carte" reçoit un mouvement de souris: vous devez écrire du code pour tester quelle "fente de carte" "s'insérer". Utilisez la méthode 'InterSectsWith' de la classe Rectangle pour vérifier le chevauchement: if (pictureBox1.Bounds.IntersectsWith (panel1.Bounds)) {// match trouvé} Une stratégie typique: make a List : faire un 'foreach sur cette liste pour trouver quel conteneur de cartes il devrait "s'enclencher": si aucune correspondance: remettre la carte dans sa position d'origine. "Snap" à un match est simple: il suffit de définir les limites de la carte aux limites du "slot" correspondant. – BillW

0

e.Location renvoie l'emplacement de la souris par rapport à la PictureBox . Vous devez indiquer PointToClient(pictureBox1.PointToScreen(e.Location)) pour obtenir l'emplacement par rapport au formulaire.

+0

partiellement le problème est résolu, mais chaque fois que je clique sur l'image et déplacez-le la souris conserve dans le coin supérieur gauche de l'image .. y at-il une solution à ce problème ... ??? – Waleedoo

0

Pour le problème clignotant, vous pouvez définir this.DoubleBuffered sur true. Mais déplacer PictureBox ou un autre contrôle est inefficace, mieux serait d'écrire du code de dessin dans l'événement pictureBox1.Paint ou d'utiliser quelque chose de plus rapide comme WPF, DirectX ou OpenGL. Je ne sais pas quels effets voulez-vous accomplir, si tout est statique et vous n'avez pas de grandes pièces mobiles, alors la solution actuelle est assez bonne.