Control.PointToScreen дает разные результаты - почему? - PullRequest
0 голосов
/ 27 мая 2009

У меня есть некоторые элементы управления Label, расположенные на элементах управления Panel в форме. Я хочу получить положение меток относительно источника формы, чтобы во время выполнения я мог скрыть панель и метки и нарисовать какой-то другой текст на их месте непосредственно в форме.

По сути, я делаю следующий расчет: получить абсолютную позицию на экране надписи с помощью Control.PointToScreen () и преобразовать ее обратно в относительную позицию с помощью Control.PointToClient (), поэтому либо:

Dim newloc As Point = Me.PointToClient(ctl.PointToScreen(Point.Empty))

или

Dim newloc As Point = Me.PointToClient(ctl.Parent.PointToScreen(ctl.Location))

Я обнаружил, что эти два метода иногда дают разные результаты - вывод моей новой точки из видимой области с отрицательными значениями! - но не смог определить почему. Я бы подумал, что они должны быть идентичными (и они в большинстве случаев).

Чтение документации не помогло в первый раз, но, возможно, я что-то пропустил ... В любом случае, я был бы благодарен за любую помощь, прежде чем я начну рвать на себе волосы.

Или, с другой стороны, есть ли лучший способ сделать это?

Редактировать: Пример результатов

Итак, вот реальный пример.

Метка 1 на {X = 4, Y = 6} на Panel1; Отметьте 2 на {X = 163, Y = 6} на том же родительском элементе, Panel1. Очевидно, я ожидаю разные X-позиции, но Y должен быть одинаковым для обоих.

Когда я запускаю проект,

ctl.PointToScreen(Point.Empty)
и
ctl.Parent.PointToScreen(ctl.Location)
дают мне одинаковое расположение экрана для Label1 в {X = 959, Y = 119} (абсолютные значения здесь, конечно, могут варьироваться, в зависимости от положения сама форма) и, следовательно, правильное расположение относительно формы при применении Me.PointToClient (при {X = 5, Y = 32}).

В следующих строках выполняются те же вычисления для Label2 (помните, тот же Parent, то же значение Y в родительском элементе (6)), но результаты полностью выключены: ctl.Parent.PointToScreen () дает мне {X = 1114, Y = 63}. X почти правильный (959-4 + 163 = 1118), но Y далеко не тот 119, который я получил для Label1. И тогда ctl.PointToScreen () дает мне {X = 166, Y = 29} - переведенный обратно в координаты формы (Me.PointToClient) {X = -784, Y = -2}.

Эти числа рассчитываются и печатаются в окне отладки непосредственно друг за другом, ничего не перемещая ... Безумие.

Хорошо, это становится довольно грязно, но я все еще надеюсь, что у кого-то есть простое объяснение. Спасибо!

Ответы [ 2 ]

3 голосов
/ 27 мая 2009

ОК, я нашел решение.

Мне случалось вызывать Control.PointToScreen до создания элемента управления: Control.IsHandleCreated = False.

Если я обеспечу, чтобы элемент управления создавался первым (Control.CreateControl), оба метода работают одинаково хорошо.

Причина, по которой у меня были разные результаты при последующих вызовах, заключается в том, что первый вызов Control.PointToScreen также вызывает создание элемента управления (и, следовательно, его родительского элемента и любых других элементов управления, расположенных на родительском элементе), что означает, что второй выполняется успешно.

Ну, я рад, что покончил с этим: -)

0 голосов
/ 27 мая 2009

Я думаю, что это сон. :) Вместо:

ctl.PointToScreen (Point.Empty)

ctl.Parent.PointToScreen (ctl.Location)

попробовать:

ctl.PointToScreen (Point.Empty)

ctl.PointToScreen (ctl.Location) // Примечание №. Родитель!

Вместо этого вы увидите разницу в координатах х / у.

Кроме того, попробуйте использовать Control.TopLevelControl или Control.FindForm (), чтобы получить крайнюю форму при выполнении математики PointToScreen.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...