2009-05-07 12 views
5

Ho un controllo il cui genitore è un ScrollableControl. Come faccio a trovare la parte del controllo che è effettivamente visibile all'utente? Entrambi sono rettangolari - non ci sono affari divertenti con le regioni.Come si trova la parte visibile di un controllo?

+1

Perché vuoi sapere? Di solito è meglio spiegare ciò che alla fine stai cercando di realizzare; spesso qualcuno potrebbe avere un'idea che non risponde alla tua domanda specifica ma ti ottiene il risultato che volevi. –

risposta

3

AutoScrollPosition rappresenta la posizione del rettangolo di visualizzazione del controllo scorrevole. I valori delle coordinate X e Y recuperati sono negativi se il controllo si è allontanato dalla posizione iniziale (0,0). Quando si imposta questa proprietà, è necessario assegnare sempre i valori X e Y positivi per impostare la posizione di scorrimento relativa alla posizione iniziale. Ad esempio, se si dispone di una barra di scorrimento orizzontale e si imposta x e y su 200, si sposta lo scorrimento di 200 pixel a destra; se quindi si imposta xey su 100, la scroll sembra saltare a sinistra di 100 pixel, perché la si sta impostando a 100 pixel di distanza dalla posizione di partenza. Nel primo caso, AutoScrollPosition restituisce {-200, 0}; nel secondo caso, restituisce {-100,0}.

Fonte: MSDN: ScrollableControl.AutoScrollPosition Property

10

Credo che il metodo GetVisibleRectangle che ho scritto qui di seguito è quello che richiede. corse successive di questo con scrolling ha prodotto il seguente output come il controllo è stato fatto scorrere:

  • {X = 0, Y = 0, Larghezza = 0, Height = 0} - button4 è stato fatto scorrere fuori dal campo visivo. Si noti che il valore qui è Rectangle.Empty.
  • {X = 211, Y = 36, Larghezza = 25, Altezza = 13} - il pulsante4 è stato fatto scorrere in modo da rendere visibile l'angolo superiore sinistro
  • {X = 161, Y = 36, Larghezza = 75, Altezza = 13 } - Button4 è stato fatto scorrere in modo che la metà superiore e tutta la larghezza era visibile
  • {X = 161, Y = 26, larghezza = 75, altezza = 23} - Button4 è stato fatto scorrere per essere interamente visibile

si noti come oltre alle modifiche di Larghezza e Altezza, anche la X, Y è cambiata con lo scorrimento.

Fonte:

private void button1_Click(object sender, EventArgs e) 
{ 
    Rectangle r = GetVisibleRectangle(this.panel1, button4); 
    System.Diagnostics.Trace.WriteLine(r.ToString()); 
} 

public static Rectangle GetVisibleRectangle(ScrollableControl sc, Control child) 
{ 
    Rectangle work = child.Bounds; 
    work.Intersect(sc.ClientRectangle); 
    return work; 
} 
+0

Eccellente! Ho solo un suggerimento, usa 'child.Bounds.IntersectsWith (sc.ClientRectangle)' se vuoi solo sapere che il bambino è nella "area di visualizzazione" del controllo. – Cipi

Problemi correlati