Является ли это C#/Windows Forms?
Ручное масштабирование - это боль в шее. Реально единственный способ полностью предотвратить любые серьезные ошибки округления в течение длительного срока службы формы - сохранить исходные местоположения и размеры каждого элемента управления, который вы изменяете/изменяете размер, и сделать весь код изменения/изменения размера относительно исходной позиции в отличие от текущей позиции.
Вы будете в конечном итоге с некоторыми fugliness, как это:
public class Form1
{
private Size originalFormSize;
private List<Control> controlsToResize = new List<Control>();
private List<Point> originalLocations;
private List<Size> originalSizes;
public Form1()
{
InitializeComponent();
SaveOriginalSizes();
}
private void SaveOriginalSizes()
{
originalFormSize = Size;
controlsToResize.Add(panel1);
controlsToResize.Add(panel2);
...
originalLocations = new List<Point>(controlsToResize.Count);
originalSizes = new List<Size>(controlsToResize.Count);
foreach (Control c in controlsToResize)
{
originalLocations.Add(c.Location);
originalSizes.Add(c.Size);
}
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
float scaleX = (float)originalFormSize.Width/Size.Width;
float scaleY = (float)originalFormSize.Height/Size.Height;
for (int i = 0; i < controlsToResize.Count; i++)
{
Control c = controlsToResize[i];
UpdatePosition(c, originalLocations[i], scaleX, scaleY);
UpdateSize(c, originalSizes[i], scaleX, scaleY);
}
}
}
... Где, очевидно, вы должны реализовать UpdatePosition
и UpdateSize
методы по своему усмотрению - Я предполагаю, что у вас уже есть какие-то реализации.
Честно говоря, это ужасно ужасно. Я хотел бы настоятельно рекомендовать, что вместо того, чтобы пытаться сделать что-либо из этого, вы пересмотрите любые требования/ограничения дизайна, препятствующие использованию свойств и Dock
. За все свои годы я не думаю, что когда-либо слышал о законной причине не использовать ни эти, ни макеты TableLayoutPanel
/FlowLayoutPanel
или и то, и другое. Это способ для работы с макетами в WinForms; все остальное - неуклюжий хак.
Hi Aaronaught, Спасибо за ваш ответ. Я могу понять, что использование якоря и док-станции - самый простой способ, но не может использовать одно и то же :( В любом случае, я попытаюсь сохранить начальные позиции элементов управления и вычислить их по этим позициям. знайте результаты, как только я это реализую. –