Позиционирование изображений в FormResize пропорционально - PullRequest
2 голосов
/ 01 октября 2010

У меня есть форма Delphi с TImages на нем.На самом деле, это «поддельный» рабочий стол с «значками» (TImages).

Когда пользователь изменяет размеры формы (например, масштабирует или увеличивает ее), значки на форме должны выровняться пропорционально.

Сейчас я делаю что-то подобное с изображениями:

ImageX.Left:=Round(ImageX.Left * (Width / OldWidth));
ImageX.Top:=Round(ImageX.Top * (Height / OldHeight));

Теперь все в порядке, пока я начинаю уменьшать максимизированную форму.

В этом случае крайние правые изображения частично обрезаются границей формы (они находятся вне клиентской области формы).

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

Есть идеи по улучшению алгоритма / исправления?

Спасибо!

1 Ответ

5 голосов
/ 01 октября 2010

Прежде всего, вы не можете иметь правильно масштабированный рабочий стол, когда вы только перемещаете изображения и не масштабируете их.Вы можете добиться большего успеха, переместив средние точки своих изображений, а не их верхний левый угол.Это все еще не будет идеально, но это будет работать лучше.Конечно, теперь изображения будут обрезаны по всем четырем сторонам, а не только снизу и справа, но по крайней мере это будет симметрично: -)

Во-вторых, вы получите накопительные ошибки округленияпоскольку вы постоянно переопределяете «исходные» значения (верхняя и левая координаты ImageX).Было бы лучше, если бы исходные значения были сохранены в какой-либо коллекции или массиве, и устанавливали новую позицию на основе исходного значения, а не предыдущего значения.

Примерно так:

ImageX.Left:=Round(ImageX_OriginalLeft * (Width / Original_Width));
...