Dunque... scrivendo la risposta alla tua domanda mi sono accorto che il codice poteva essere semplificato, eliminando la variabile moving e l'evento MouseUp:
codice:
Private old_x As Single, old_y As Single
Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
old_x = X
old_y = Y
End If
End Sub
Private Sub Image1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
Image1.Left = Image1.Left + (X - old_x)
Image1.Top = Image1.Top + (Y - old_y)
End If
End Sub
e ora provo a spiegartelo. Va detto che le coordinate X e Y che vengono passate come argomento dagli eventi qui utilizzati sono relative e non assolute, si tratta quindi di valori relativi all'angolo in alto a sinistra del controllo Image1 (questo spiega in parte perchè la tua soluzione iniziale non funziona).
1. quando l'utente preme il pulsante sx del mouse vengono memorizzate le coordinate X e Y correnti.
2. quando l'utente muove il mouse, viene calcolata la nuova posizione di Image1. Per capire meglio il calcolo, lo scompongo così:
codice:
Private Sub Image1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim delta_x As Single
Dim delta_y As Single
If Button = 1 Then
delta_x = X - old_x
delta_y = Y - old_y
Image1.Left = Image1.Left + delta_x
Image1.Top = Image1.Top + delta_y
End If
End Sub
Calcolo per prima cosa il delta_x, cioè la differenza tra X e il vecchio valore di X. Ottengo come risultato un valore che è positivo se l'utente ha spostato il mouse a destra, negativo nel caso contrario. Il discorso è lo stesso per delta_y, che sarà positivo se il mouse si è spostato in basso.
A questo punto calcolo la nuova posizione di Image1, sommando alla posizione corrente delta_x e delta_y.
Spero di essere stato abbastanza chiaro!