Question

Je développe une application pour Windows Mobile (Compact Framework 2.0).Il a un WinForms avec un PictureBox.

Je souhaite déplacer l'image du PictureBox mais je ne sais pas comment faire donc je choisis de déplacer le trou PictureBox.

Pour ce faire, j'utilise cet événement :

private void imagenMapa_MouseMove(object sender, MouseEventArgs e)
{
      imagenMapa.Left = e.X;
      imagenMapa.Top = e.Y;
      this.Refresh();
}

Mais lorsque je déplace la PictureBox, elle clignote et se déplace partout.

Qu'est-ce que je fais de mal ?

Était-ce utile?

La solution

Le e.X et e.Y sont liés à la zone d'image (par exemple, si la souris se trouve dans le coin supérieur gauche de la zone d'image, qui est 0,0).

Les valeurs de imagenMapa.Left et imagenMapa.Top sont liés à la forme (ou tout autre contrôle contient imagenMapa)

Si vous essayez de mélanger les valeurs de ces deux systèmes sans conversion, vous allez obtenir des sauts (comme vous voyez).

Vous êtes probablement mieux de convertir la position de la souris sur le même système de coordonnées utilisé par la chose qui contient la zone d'image.

Vous pouvez utiliser imagenMapa.PointToScreen pour obtenir les coordonnées de la souris en coordonnées d'écran (ou Cursor.Position pour obtenir la position directement), et yourForm.PointToClient pour les récupérer dans les coordonnées du formulaire.

Notez que selon vos besoins, vous pouvez accomplir « déplacer une image dans un contrôle » en remplaçant / la manipulation événement Paint d'un contrôle et en tirant l'image vous-même. Si vous avez fait cela, vous pouvez tout garder les coordonnées PictureBox, puisque ce sont probablement ce que vous utilisez quand vous avez appelé graphicsObject.DrawImage .

Autres conseils

code actuel (nécessite .NET Framework 3.5 et au-delà, pas sûr si cela est disponible dans le Compact Framework) ...

// Global Variables
private int _xPos;
private int _yPos;
private bool _dragging;

// Register mouse events
pictureBox.MouseUp += (sender, args) =>
{
    var c = sender as PictureBox;
    if (null == c) return;
    _dragging = false;
};

pictureBox.MouseDown += (sender, args) =>
{
    if (args.Button != MouseButtons.Left) return;
    _dragging = true;
    _xPos = args.X;
    _yPos = args.Y;
};

pictureBox.MouseMove += (sender, args) =>
{
    var c = sender as PictureBox;
    if (!_dragging || null == c) return;
    c.Top = args.Y + c.Top - _yPos;
    c.Left = args.X + c.Left - _xPos;
};

e.X et E.Y est dans l'espace de coordonnées PictureBox, imagenMapa.Left & imagenMapa.Top est dans l'espace de coordonnées du formulaire. : -)

Aussi ne pas oublier de mettre votre forme à double buffer, qui pourrait aider à la vacillante, mais pour le positionnement réel de celui-ci, j'aime la suggestion de Daniel L'

Adoptez les mathématiques !

control.Left = control.Left - (_lastMousePos.X - currentMousePos.X);
control.Top = control.Top - (_lastMousePos.Y - currentMousePos.Y);

Explication rapide :Vous obtenez la différence des positions de la souris et l'appliquez à l'objet que vous souhaitez déplacer.

Exemple:Si l’ancienne position X de la souris est 382 et la nouvelle 385, alors la différence est de -3.Si la position X actuelle des commandes est 10, alors 10 - (-3) = 13

Pourquoi:Cela fonctionne pour tout et coûte beaucoup moins cher que de convertir constamment les coordonnées dans les deux sens.

En fait ce que vous avez fait est correct. Mais vous avez donné la propriété MouseMove au picturebox. Vous devez donner cette propriété au formulaire (arrière-plan).

ex:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
  imagenMapa.Left = e.X;
  imagenMapa.Top = e.Y;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top