调整控件大小以匹配宽高比

时间:2014-06-11 09:28:04

标签: c# winforms resize aspect-ratio

描述

我正在创建一个"模拟器"对于不同的决议。基本上我在面板内有一个控件。然后用户可以选择宽高比(下面的更多信息),模拟器内的控件应调整大小以匹配所需的比例。

问题

问题是我不知道在不使用大量CPU或尝试调整大小的情况下计算控件大小的好方法。我怎么知道,如果我必须调整控件的高度或宽度以适应模拟器内部?

模拟器可以增长或缩小。这就是为什么我不能确定,如果它内部的控件将填满模拟器的整个宽度或高度,但纵横比应始终是正确的。

提示

这可能是一个非常容易的数学问题。我现在没有找到解决方案(今天不是我的一天)!

如果您有任何想法或建议,请随时提出建议!

示例

Example for the simulator.

可用的解决方案

  • 3:2(就像iPhone上的iPhone一样;任何人都知道另一个名字?)
  • 16:10(WXGA)
  • 16:9(宽屏)
  • 4:3(VGA)

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

这是一个小试验台。在窗体上放置一个控件并将ViewPort变量赋给它。在这里我选择了一个textBox1,但任何控件都可以。然后选择目标宽高比,我选择了TargetRatio_3_2。 通过调整表单来尝试它!

注1:我选择了一个表单作为容器(您的模拟器)以便于测试,因此使用其ClientRectangle来访问其内部度量。任何其他控件基本上都是一样的。

不是2:我添加了一些行来将ViewPort(您的 Control )置于中心。

private void Form1_Resize(object sender, EventArgs e)
{
    Control Container = this;
    Control ViewPort = textBox1;

    float ContainerRatio = 1f * Container.ClientRectangle.Width / Container.ClientRectangle.Height;

    const float TargetRatio_3_2 = 3f / 2f;
    const float TargetRatio_16_9 = 16f / 9f;
    const float TargetRatio_4_3 = 4f / 3f;
    const float TargetRatio_16_10 = 16f / 10f;
    //..

    float TargetRatio = TargetRatio_3_2;

    if (ContainerRatio < TargetRatio)
    {
        ViewPort.Width = Container.ClientRectangle.Width;
        ViewPort.Height = (int)(ViewPort.Width / TargetRatio);
        ViewPort.Top = (Container.ClientRectangle.Height - ViewPort.Height) / 2;
        ViewPort.Left = 0;
    }
    else
    {
        ViewPort.Height = Container.ClientRectangle.Height;
        ViewPort.Width = (int)(ViewPort.Height * TargetRatio);
        ViewPort.Top = 0;
        ViewPort.Left = (Container.ClientRectangle.Width - ViewPort.Width) / 2;
    }

}