Описание
Я создаю "симулятор" для разных разрешений. В основном у меня есть контроль внутри панели. Затем пользователь может выбрать соотношение сторон (более подробная информация ниже), и управление внутри симулятора должно быть изменено в соответствии с желаемым соотношением.
проблема
Проблема в том, что я не знаю, что это хороший способ рассчитать размер элемента управления без использования большого количества CPU или попыток или изменения размера. Как я могу знать, если мне нужно изменить размер или ширину элемента управления, чтобы он находился внутри симулятора?
Симулятор может расти или сокращаться. Вот почему я не могу быть уверен, что если внутри этого элемента управления будет заполняться вся ширина симулятора или высота, но соотношение сторон должно быть всегда правильным.
намек
Это, вероятно, очень простая математическая проблема. Я просто не нашел решения прямо сейчас (сегодня не мой день)!
Если у вас есть какие-либо идеи или предложения, не стесняйтесь спрашивать и предлагать!
пример
Доступные разрешения
Спасибо за помощь!
Вот небольшая пробная версия. Поместите элемент управления в форму и назначьте ему переменную ViewPort. Здесь я выбрал textBox1, но любой элемент управления будет делать. Затем выберите целевое соотношение сторон, я выбрал TargetRatio_3_2. Попробуйте, изменив размер формы!
Примечание 1: я выбрал форму в качестве контейнера (ваш симулятор) для более легкого тестирования и, следовательно, использовал свой ClientRectangle для доступа к его внутренним мерам. Любой другой элемент управления будет работать в основном.
Not 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;
}
}
height = width / widthRatio * heightRatio
? (или наоборот)