描述
我正在创建一个"模拟器"对于不同的决议。基本上我在面板内有一个控件。然后用户可以选择宽高比(下面的更多信息),模拟器内的控件应调整大小以匹配所需的比例。
问题
问题是我不知道在不使用大量CPU或尝试调整大小的情况下计算控件大小的好方法。我怎么知道,如果我必须调整控件的高度或宽度以适应模拟器内部?
模拟器可以增长或缩小。这就是为什么我不能确定,如果它内部的控件将填满模拟器的整个宽度或高度,但纵横比应始终是正确的。
提示
这可能是一个非常容易的数学问题。我现在没有找到解决方案(今天不是我的一天)!
如果您有任何想法或建议,请随时提出建议!
示例
可用的解决方案
感谢您的帮助!
答案 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;
}
}