繁体   English   中英

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

[英]Resize control to match aspect ratio

描述

我正在为不同的分辨率创建一个“模拟器”。 基本上,我在面板内部有一个控件。 然后,用户可以选择宽高比(下面的更多信息),并且模拟器内部的控件应调整大小以匹配所需的宽高比。

问题

问题是我不知道在不使用大量CPU或不进行尝试或调整大小的情况下,计算控件大小的好方法是什么。 我是否必须调整控件的高度或宽度以适合模拟器的大小才能知道?

模拟器可以增长或收缩。 这就是为什么我不能确定的是,其中的控件是否会填满模拟器的整个宽度或高度,但是长宽比应该始终正确。

暗示

这可能是一个非常简单的数学问题。 我只是现在找不到解决方案(今天不是我的日子)!

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

模拟器示例。

可用分辨率

  • 3:2(就像在iPhone上一样直到iPhone 5;有人知道其他名字吗?)
  • 16:10(WXGA)
  • 16:9(宽屏)
  • 4:3(VGA)

感谢您的帮助!

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

注意1:我选择一个表单作为Container(您的Simulator )以便于测试,因此使用其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;
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM