C# Получают позицию управления по форме

Можно искать файл непосредственно. Например:

>>> f = open("csv.txt")
>>> c = csv.reader(f)
>>> for row in c: print row
['1', '2', '3']
['4', '5', '6']
>>> f.seek(0)
>>> for row in c: print row   # again
['1', '2', '3']
['4', '5', '6']
65
задан Sean Hanley 4 November 2009 в 17:38
поделиться

4 ответа

Я обычно комбинирую PointToScreen и PointToClient :

Point locationOnForm = control.FindForm().PointToClient(
    control.Parent.PointToScreen(control.Location));
89
ответ дан 24 November 2019 в 15:24
поделиться

Вы можете пройти через родителей, отмечая их положение в их родителях, пока не вы прибыть в форму.

Изменить: Что-то вроде (непроверено):

public Point GetPositionInForm(Control ctrl)
{
   Point p = ctrl.Location;
   Control parent = ctrl.Parent;
   while (! (parent is Form))
   {
      p.Offset(parent.Location.X, parent.Location.Y);
      parent = parent.Parent;
   }
   return p;
}
6
ответ дан 24 November 2019 в 15:24
поделиться

Вы можете использовать метод controls PointToScreen , чтобы получить абсолютное положение относительно экрана.

Вы можете использовать метод Forms PointToScreen и с помощью элементарных математических вычислений получить позицию элемента управления.

11
ответ дан 24 November 2019 в 15:24
поделиться

В моем тестировании решения Ганса Кестинга и Фредрика Мерка дали одинаковый ответ. Но:

Я обнаружил интересное несоответствие в ответе, используя методы Раджа Мора и Ханса Кестинга, и подумал, что поделюсь. Спасибо обоим за их помощь; Не могу поверить, что такой метод не встроен в фреймворк.

Обратите внимание, что Радж не писал код, и поэтому моя реализация могла отличаться от того, что он имел в виду.

Разница, которую я обнаружил, заключалась в том, что метод Раджа Мора часто был на два пикселя больше (как по оси X, так и по оси Y), чем метод от Ханса Кестинга. Я еще не определил, почему это происходит. Я почти уверен, что это как-то связано с тем фактом, что, кажется, есть двухпиксельная граница вокруг содержимого формы Windows (например, внутри самых внешних границ формы). В моем тестировании, которое, конечно, не было исчерпывающим, я встречал его только на вложенных элементах управления. Однако не все вложенные элементы управления демонстрируют это. Например, у меня есть TextBox внутри GroupBox, который демонстрирует несоответствие, а Button внутри того же GroupBox - нет. Я не могу объяснить почему.

Обратите внимание, что когда ответы эквивалентны, они считают, что точка (0, 0) находится внутри границы содержимого, о которой я упоминал выше. Поэтому я считаю, что буду считать решения Ханса Кестинга и Фредрика Мёрка правильными, но не думаю, что буду доверять реализованному мной решению Раджа Мора.

Мне также было интересно, какой именно код написал бы Радж Мор, поскольку он дал идею, но не предоставил код. Я не полностью понимал метод PointToScreen (), пока не прочитал этот пост: http://social.msdn.microsoft.com/Forums/en-US/netfxcompact/thread/aa91d4d8-e106-48d1-8e8a- 59579e14f495

Вот мой метод тестирования. Обратите внимание, что «Метод 1», упомянутый в комментариях, немного отличается от метода Ханса Кестинга.

private Point GetLocationRelativeToForm(Control c)
{
  // Method 1: walk up the control tree
  Point controlLocationRelativeToForm1 = new Point();
  Control currentControl = c;
  while (currentControl.Parent != null)
  {
    controlLocationRelativeToForm1.Offset(currentControl.Left, currentControl.Top);
    currentControl = currentControl.Parent;
  }

  // Method 2: determine absolute position on screen of control and form, and calculate difference
  Point controlScreenPoint = c.PointToScreen(Point.Empty);
  Point formScreenPoint = PointToScreen(Point.Empty);
  Point controlLocationRelativeToForm2 = controlScreenPoint - new Size(formScreenPoint);

  // Method 3: combine PointToScreen() and PointToClient()
  Point locationOnForm = c.FindForm().PointToClient(c.Parent.PointToScreen(c.Location));

  // Theoretically they should be the same
  Debug.Assert(controlLocationRelativeToForm1 == controlLocationRelativeToForm2);
  Debug.Assert(locationOnForm == controlLocationRelativeToForm1);
  Debug.Assert(locationOnForm == controlLocationRelativeToForm2);

  return controlLocationRelativeToForm1;
}
1
ответ дан 24 November 2019 в 15:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: