在Winform上调整控件大小时解决舍入错误

时间:2010-02-06 15:48:10

标签: controls resize rounding

我需要在表单调整大小时调整表单上的所有控件。 不幸的是,由于一些问题,我不能使用任何容器控件或使用锚/坞属性。我需要使用代码完成所有事情。 我可以根据屏幕调整大小的比例调整控件的大小。在执行此调整大小时,我需要计算所有控件的新位置以及新的大小。问题是在计算这些新点时,我得到十进制的新值,如果我绕它们,那么每次调整表单大小时都会导致问题并计算错误的大小和位置。 我看到了相同任务的一些第三方控件,但它们都准确地计算了位置。

请帮我解决这个问题。 提前致谢, Ashish Sharma

1 个答案:

答案 0 :(得分:0)

这是C#/ Windows Forms吗?

手动缩放是一个痛苦的问题。实际上,完全防止表单长期生命周期中出现任何重大舍入错误的唯一方法是存储重新定位/调整大小的每个控件的原始位置和大小,并相对于原始位置进行所有重新定位/调整大小的代码与当前的立场相反。

你最终会有这样的琐事:

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);
        }
    }
}

......显然你必须自己实施UpdatePositionUpdateSize方法 - 我假设你已经有了某种实现方式。

老实说,这太可怕了。我强烈建议您不要尝试执行任何操作,而是重新审视阻止您使用AnchorDock属性的任何要求/设计约束。 在我的这些年里,我认为我没有听说过不使用这些或布局控件TableLayoutPanel / FlowLayoutPanel或两者的正当理由。这些 处理WinForms布局的方式;别的什么都是笨拙的黑客。