2009-11-26 8 views
6

Ho una casella immagine impostata su AutoSize in modo che l'immagine lo costringa a crescere fino alle dimensioni dell'immagine.Come si può far scorrere programmaticamente un pannello per esporre la sua casella immagine AutoSized

La casella immagine si trova in un pannello con autoScroll = true, quindi le barre di scorrimento vengono visualizzate quando l'immagine è più grande del pannello.

Come è possibile scorrere a livello di programmazione il pannello mentre l'utente fa clic sulle immagini trascinate sull'immagine, riposizionando quindi l'immagine.

Ho provato a utilizzare l'evento MouseMove, catturando le ultime posizioni X e Y del mouse, calcolando quanto il mouse è stato spostato e regolato i valori di scorrimento verticale e orizzontale del pannello.

Il pulsante sposta l'immagine, ma salta dappertutto e scorre in modo imprevedibile.

Come posso ottenere questo risultato?

Ecco quello che ho tra le Gli eventi del mouse ...

private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (dragging) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      // move the image inverse to direction dragged 
      int horizontalChange = (e.X - startingX) * -1; 
      int newHorizontalPos = panel1.HorizontalScroll.Value + horizontalChange; 

      if (newHorizontalPos < panel1.HorizontalScroll.Minimum) 
      { 
       newHorizontalPos = panel1.HorizontalScroll.Minimum; 
       horizontalChange = 0; 
      } 

      if (newHorizontalPos > panel1.HorizontalScroll.Maximum) 
      { 
       newHorizontalPos = panel1.HorizontalScroll.Maximum; 
       horizontalChange = 0; 
      } 

      panel1.HorizontalScroll.Value = newHorizontalPos; 

      int verticalChange = (e.Y - startingY); 
      // move the image inverse to direction dragged 
      int newverticalPos = panel1.VerticalScroll.Value + verticalChange * -1; 

      if (newverticalPos < panel1.VerticalScroll.Minimum) 
      { 
       newverticalPos = panel1.VerticalScroll.Minimum; 
       verticalChange = 0; 
      } 

      if (newverticalPos > panel1.VerticalScroll.Maximum) 
      { 
       newverticalPos = panel1.VerticalScroll.Maximum; 
       verticalChange = 0; 
      } 

      panel1.VerticalScroll.Value = newverticalPos; 
     } 
    } 

    startingX = e.X; 
    startingY = e.Y; 
} 

È la mia logica sbagliata o è la mia comprensione della funzionalità di scorrimento del pannello sbagliato?

risposta

4

Credo che il tuo istinto sia corretto ma il tuo errore è tentare di regolare le barre di scorrimento invece di spostare la PictureBox all'interno del pannello scorrevole.

È necessario intercettare MouseMove e regolare la proprietà Posizione del PictureBox con il movimento delta delta: le barre di scorrimento dovrebbero aggiornarsi automaticamente per riflettere la nuova posizione dell'immagine al suo interno.

aggiornare il codice sarebbe simile tho seguente (non testato):

private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (dragging) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      int horizontalChange = (e.X - startingX) * -1; // move the image inverse to direction dragged 

      int verticalChange = (e.Y - startingY); 

      pictureBox1.Left += horizontalChange; 
      pictureBox1.Top += verticalChange; 
     } 
    } 

    startingX = e.X; 
    startingY = e.Y; 
} 

(Inoltre, sarei propenso a registrare il mouse di inizio e sedi PictureBox all'inizio del trascinamento e aggiornarli rispetto a questa posizione di partenza su ciascun evento MouseMove anziché apportare modifiche incrementali come il codice precedente (e il codice originale lo fa). La ragione è che se ci sono valori imprevisti, per qualsiasi motivo, questo causerà solo un effetto transitorio - il prossimo buon evento si correggerà automaticamente)

+0

Grazie. Sto lavorando con questo approccio. Il controllo del pannello non mostra le barre di scorrimento se si sposta la casella immagine fuori dai lati superiore o sinistro però :-( –

+0

Oh, è strano - dovrebbe davvero se si attiva lo scorrimento automatico. –

5

Si sta saltando perché l'atto o f scorrendo il pannello si elimina la posizione del mouse dalla quantità di scorrimento. È possibile ottenere la posizione "reale" del mouse (relativa a partire dall'angolo superiore sinistro del pannello) in questo modo:

Point realPos = new Point(e.X + panel1.AutoScrollPosition.X, 
    e.Y + panel1.AutoScrollPosition.Y); 

assumendo la 'proprietà Location casella di immagine è (0, 0). Il modo migliore per scorrere il pannello è impostare la proprietà AutoScrollPosition.

2

È possibile impostare AutoScrollPosition del pannello in evento MouseMove. Testato e funziona bene.

panel1.AutoScrollPosition = new Point(-panel1.AutoScrollPosition.X - e.X + startPoint.X, -panel1.AutoScrollPosition.Y - e.Y + startPoint.Y); 
Problemi correlati