Domanda

Sto sviluppando una applicazione per windows mobile (Compact Framework 2.0).Ha un windows form con un controllo PictureBox.

Voglio spostare l'immagine della PictureBox, ma non so come fare, quindi ho scelto di spostare il foro di controllo PictureBox.

Per farlo io uso questo evento:

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

Ma quando sposto il controllo PictureBox lampeggia e si muove ogni dove.

Che cosa sto facendo di sbagliato?

È stato utile?

Soluzione

Il e.X e e.Y sono relativi alla casella di immagine (ad esempio, se il mouse è in alto a sinistra della casella di immagine, che è 0,0).

I valori di imagenMapa.Left e imagenMapa.Top sono relative alla forma (o qualsiasi controllo contiene imagenMapa)

Se si tenta di mescolare valori da questi due sistemi senza conversione, si sta andando ad ottenere salti (come si sta vedendo).

Sei probabilmente meglio convertire la posizione del mouse per lo stesso sistema di coordinate utilizzato dalla cosa che contiene la casella di immagine.

Si potrebbe utilizzare imagenMapa.PointToScreen per ottenere il mouse coordinate in coordinate dello schermo (o Cursor.Position per ottenere la posizione direttamente), e yourForm.PointToClient per farli tornare nelle coordinate della forma.

Si noti che a seconda delle esigenze, si potrebbe realizzare "in movimento un'immagine all'interno di un controllo" sovrascrivendo / gestione della Paint evento di un controllo e disegnare l'immagine di voi stessi. Se avete fatto questo, si potrebbe tenere tutto nelle coordinate PictureBox, dal momento che questi sono probabilmente quello che si usa quando hai chiamato graphicsObject.DrawImage .

Altri suggerimenti

codice vero e proprio (Richiede .NET Framework 3.5 e oltre, non so se questo è disponibile in 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 & e.Y è nello spazio di coordinate della pictureBox, imagenMapa.Left & imagenMapa.Top è nello spazio di coordinate del modulo. : -)

Inoltre, non dimenticare di impostare il modulo a doppio buffer, che potrebbe aiutare con il tremolio, ma per il posizionamento attuale di esso, mi piace Daniel L's suggerimento

Abbracciare la matematica!

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

Rapida spiegazione:Si ottiene la differenza tra le posizioni del mouse e si applicano per l'oggetto che si desidera spostare.

Esempio:Se il vecchio mouse X posizione 382, e il nuovo è 385, quindi la differenza è di -3.Se i controlli attuale posizione X è 10, allora 10 - (-3) = 13

Perché:Funziona per niente, ed è molto più conveniente che costantemente la conversione di coordinate avanti e indietro.

In realtà quello che hai fatto è corretta. Ma ti ha dato la proprietà MouseSpostato al picturebox. Si dovrebbe dare quella struttura al Form (sfondo).

es:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
  imagenMapa.Left = e.X;
  imagenMapa.Top = e.Y;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top