2010-02-06 3 views
0

У меня есть требование изменить размеры всех элементов управления формы, когда меняет размер моей формы. К сожалению, из-за некоторых проблем я не могу использовать элемент управления контейнером или использовать свойство anchor/dock. Мне нужно делать все с помощью кода. Я могу изменить размеры элементов управления в соответствии с отношением, которое изменяет размер экрана. Выполняя это изменение размера, мне нужно вычислить новое положение всех элементов управления вместе с новым размером. Проблема заключается в вычислении этих новых точек. Я получаю новые значения в десятичном значении, и если я их закругляю, это вызывает проблемы и вычисляет неправильный размер и положение при каждом изменении размера моей формы. Я видел некоторые сторонние элементы управления для одной и той же задачи, но все они точно вычисляют позицию.Устранение ошибок округления при изменении размера элементов управления на Winform

Пожалуйста, помогите мне решить эту проблему. Заранее спасибо, Ashish Sharma

ответ

0

Является ли это 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; все остальное - неуклюжий хак.

+0

Hi Aaronaught, Спасибо за ваш ответ. Я могу понять, что использование якоря и док-станции - самый простой способ, но не может использовать одно и то же :( В любом случае, я попытаюсь сохранить начальные позиции элементов управления и вычислить их по этим позициям. знайте результаты, как только я это реализую. –

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