2009-05-07 2 views
5

У меня есть элемент управления, чей родитель является ScrollableControl. Как найти часть элемента управления, который на самом деле отображается пользователю? Оба прямоугольные - в Регионе нет смешного дела.Как найти видимую часть элемента управления?

+1

Почему вы хотите знать? Обычно лучше объяснить, что вы в конечном итоге пытаетесь выполнить; часто у кого-то может возникнуть идея, которая не отвечает на ваш конкретный вопрос, но дает вам результат, который вы хотели. –

ответ

3

AutoScrollPosition представляет местоположение прямоугольника отображения прокручиваемого элемента управления. Полученные значения координат X и Y отрицательны, если элемент управления прокручивается от его исходного положения (0,0). Когда вы устанавливаете это свойство, вы всегда должны назначать положительные значения X и Y, чтобы установить положение прокрутки относительно начальной позиции. Например, если у вас есть горизонтальная полоса прокрутки и вы устанавливаете x и y на 200, вы перемещаете прокрутку 200 пикселей вправо; если вы затем установите x и y на 100, прокрутка появится, чтобы перейти налево на 100 пикселей, потому что вы устанавливаете его на 100 пикселей от начальной позиции. В первом случае AutoScrollPosition возвращает {-200, 0}; во втором случае он возвращает {-100,0}.

Источник: MSDN: ScrollableControl.AutoScrollPosition Property

10

Я думаю, что метод GetVisibleRectangle я написал ниже, что вы запрашиваете. Последовательные пробеги это с прокруткой дали следующие результаты, как контроль был прокручивается:

  • {Х = 0, Y = 0, ширина = 0, высота = 0} - Button4 был прокручивается вне поля зрения. Обратите внимание, что здесь значение Rectangle.Empty.
  • {X = 211, Y = 36, ширина = 25, высота = 13} - кнопка4 была прокручена, чтобы был вид сверху в верхнем левом углу
  • {X = 161, Y = 36, ширина = 75, высота = 13 } - Button4 был прокручивается так, чтобы верхняя половина и вся ширина была видна
  • {Х = 161, Y = 26, ширина = 75, высота = 23} - Button4 был прокручивается, чтобы быть полностью видимым

Обратите внимание, как в дополнение к изменениям ширины и высоты X и Y также изменяются при прокрутке.

Источник:

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

Отличный! У меня есть только одно предложение, используйте 'child.Bounds.IntersectsWith (sc.ClientRectangle)', если вы хотите знать только о ребенке в «области обзора» элемента управления. – Cipi

0

Следующая ссылка мощь помогает решить эту проблему http://www.trace-solution.com/2012/06/how-to-get-visibleviewable-area-of-user.html.

+1

Не могли бы вы добавить короткую выдержку, чтобы ответ по-прежнему был полезен, если ссылка умирает? –

+2

@ S.L.Barth По иронии судьбы, подобное * имеет * умер. Отличный пример. – Bob

+0

Было бы неплохо, если бы была выдержка .. :( – AnotherUser

Смежные вопросы