2009-05-07 16 views
5

Tengo un control cuyo elemento principal es ScrollableControl. ¿Cómo encuentro la parte del control que es realmente visible para el usuario? Ambos son rectangulares: no hay negocios graciosos con Regions.¿Cómo encuentro la parte visible de un control?

+1

¿Por qué quieres saber? Por lo general, es mejor explicar lo que finalmente estás tratando de lograr; a menudo, alguien puede tener una idea que no responde a su pregunta específica, pero obtiene el resultado que deseaba. –

Respuesta

3

AutoScrollPosition representa la ubicación del rectángulo de visualización del control desplazable. Los valores de coordenadas X e Y recuperados son negativos si el control se desplazó desde su posición inicial (0,0). Cuando establezca esta propiedad, siempre debe asignar valores X e Y positivos para establecer la posición de desplazamiento relativa a la posición de inicio. Por ejemplo, si tiene una barra de desplazamiento horizontal y establece x e y a 200, mueve el desplazamiento 200 píxeles hacia la derecha; si luego configura x e y a 100, el desplazamiento aparece para saltar 100 píxeles hacia la izquierda, porque lo está configurando a 100 píxeles de distancia de la posición de inicio. En el primer caso, AutoScrollPosition devuelve {-200, 0}; en el segundo caso, devuelve {-100,0}.

Fuente: MSDN: ScrollableControl.AutoScrollPosition Property

10

Creo que el método GetVisibleRectangle escribí a continuación es lo que estaba solicitando. carreras sucesivas de este con desplazamiento produjo el siguiente resultado como el control se desplaza:

  • {X = 0, Y = 0, Anchura = 0, Altura = 0} - button4 se desplaza fuera de la vista. Tenga en cuenta que el valor aquí es Rectangle.Empty.
  • {X = 211, Y = 36, Ancho = 25, Altura = 13} - Se desplazó el botón 4 para que la esquina superior izquierda fuera visible
  • {X = 161, Y = 36, Ancho = 75, Altura = 13 } - button4 se desplaza por lo que la mitad superior y la anchura entera fue visible
  • {X = 161, y = 26, anchura = 75, Altura = 23} - button4 se desplaza a ser totalmente visible

Nota cómo además de los cambios de Ancho y Altura que la X, Y también cambió con el desplazamiento.

Fuente:

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

¡Excelente! Solo tengo una sugerencia, use 'child.Bounds.IntersectsWith (sc.ClientRectangle)' si solo quiere saber si el niño está en el "área de visualización" del control. – Cipi

Cuestiones relacionadas