Frage

Ich entwickle eine App für Windows Mobile (Compact Framework 2.0). Es hat eine WinForms mit einem PictureBox.

Ich mag das Bild des PictureBox bewegen, aber ich weiß nicht, wie es zu tun, so wählen, um ich das Loch PictureBox zu bewegen.

Um es zu tun, verwende ich diese Veranstaltung:

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

Aber wenn ich die PictureBox bewegen es blinkt und bewegt sich allenthalben.

Was mache ich falsch?

War es hilfreich?

Lösung

Die e.X und e.Y das Bildfeld relativ sind (zum Beispiel, wenn die Maus in der oberen linken Ecke des Bildfeldes ist, das ist 0,0).

Die Werte für imagenMapa.Left und imagenMapa.Top die Form bezüglich (oder was immer Steuerelement enthält imagenMapa)

Wenn Sie versuchen, Werte ohne Konvertierung von diesen beiden Systemen zu mischen, Sie gehen Sprünge (wie Sie sehen).

Sie sind wahrscheinlich besser dran, die Mausposition auf das gleiche System Umwandlung koordinieren, von dem, was verwendet wird, die das Bildfeld enthält.

könnten Sie imagenMapa.PointToScreen koordiniert die Maus zu erhalten (oder Cursor.Position die Position direkt) zu bekommen, und yourForm.PointToClient , um sie wieder in der Form Koordinaten.

Beachten Sie, dass je nach Ihren Bedürfnissen, können Sie „Bewegen eines Bildes innerhalb einer Kontrolle“ durch zwingende / Umgang mit der graphicsObject.DrawImage .

Andere Tipps

Die tatsächliche-Code (Erfordert .NET Framework 3.5 und darüber hinaus nicht sicher, ob dies im Compact Framework verfügbar ist) ...

// 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 & E.Y ist im Koordinatenraum des PictureBox, imagenMapa.Left & imagenMapa.Top ist in dem Raum des Formulars koordinieren. : -)

Auch vergessen Sie nicht das Formular zu setzen gepuffert zu verdoppeln, die mit dem Flackern helfen können, aber für die tatsächliche Positionierung davon, Ich mag Daniel L's Vorschlag

Umarmungs Mathe!

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

Kurze Erklärung: Sie erhalten die Differenz aus den Mauspositionen und es auf das Objekt, das Sie verschieben möchten.

Beispiel: Wenn die alte Maus X-Position ist 382 und die neue ist 385, dann wird die Differenz -3 ist. Wenn die Kontrollen aktuelle X-Position 10 ist dann 10 - (-3) = 13

Warum: Es funktioniert für alles, und ist viel billiger als ständig Koordinaten hin und her zu konvertieren.

Eigentlich, was Sie getan haben, ist richtig. Aber Sie gab die Mousemove-Eigenschaft auf den picturebox. Sie sollten diese Eigenschaft auf die Form geben (im Hintergrund).

ex:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
  imagenMapa.Left = e.X;
  imagenMapa.Top = e.Y;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top