2009-05-07 13 views
5

Mam kontrolę, której rodzicem jest ScrollableControl. Jak znaleźć część kontrolki widoczną dla użytkownika? Oba są prostokątne - nie ma śmiesznych interesów z regionami.Jak znaleźć widoczną część kontrolki?

+1

Dlaczego chcesz wiedzieć? Zazwyczaj lepiej jest wyjaśnić, co ostatecznie próbujesz osiągnąć; często ktoś może mieć pomysł, który nie odpowiada na twoje konkretne pytanie, ale daje ci pożądany rezultat. –

Odpowiedz

3

AutoScrollPosition przedstawia położenie prostokąta wyświetlanego na przewijanym elemencie sterującym. Uzyskane wartości współrzędnych X i Y są ujemne, jeśli układ sterowania przewinął się z miejsca początkowego (0,0). Po ustawieniu tej właściwości zawsze należy przypisać dodatnie wartości X i Y, aby ustawić pozycję przewijania względem pozycji początkowej. Na przykład, jeśli masz poziomy pasek przewijania i ustawiasz xiy na 200, przesuwasz o 200 pikseli w prawo; jeśli następnie ustawisz xiy na 100, przewijanie pojawi się, aby przeskoczyć w lewo o 100 pikseli, ponieważ ustawiasz je w odległości 100 pikseli od pozycji początkowej. W pierwszym przypadku funkcja AutoScrollPosition zwraca wartość {-200, 0}; w drugim przypadku zwraca {-100,0}.

Źródło: MSDN: ScrollableControl.AutoScrollPosition Property

10

Myślę, że metoda GetVisibleRectangle napisałem poniżej jest czego zainteresowanie. Kolejne przebiegi to z przewijaniem uzyskano następujące wyniki jako kontrolny przewijane:

  • {X = 0, Y = 0, = 0, szerokość, wysokość = 0} - Button4 była przewijana z widoku. Zauważ, że ta wartość to Rectangle.Empty.
  • {X = 211, Y = 36, Szerokość = 25, Wysokość = 13} - przycisk 4 został przewinięty, więc widoczny był górny lewy róg
  • {X = 161, Y = 36, Szerokość = 75, Wysokość = 13 } - Button4 został przewinięty więc górna część oraz cały szerokość była widoczna
  • {X = 161, Y = 26, szerokość = 75, wysokość = 23} - Button4 został przewinięty być całkowicie widoczny

Uwaga jak oprócz zmian szerokości i wysokości zmieniono również X, Y za pomocą przewijania.

Źródło:

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

Doskonała! Mam tylko jedną sugestię, użyj 'child.Bounds.IntersectsWith (sc.ClientRectangle)' jeśli chcesz tylko wiedzieć, dziecko jest w "obszarze widoku" kontrolki. – Cipi

Powiązane problemy