Изменить размер элемента управления, чтобы соответствовать пропорциям

1

Описание

Я создаю "симулятор" для разных разрешений. В основном у меня есть контроль внутри панели. Затем пользователь может выбрать соотношение сторон (более подробная информация ниже), и управление внутри симулятора должно быть изменено в соответствии с желаемым соотношением.

проблема

Проблема в том, что я не знаю, что это хороший способ рассчитать размер элемента управления без использования большого количества CPU или попыток или изменения размера. Как я могу знать, если мне нужно изменить размер или ширину элемента управления, чтобы он находился внутри симулятора?

Симулятор может расти или сокращаться. Вот почему я не могу быть уверен, что если внутри этого элемента управления будет заполняться вся ширина симулятора или высота, но соотношение сторон должно быть всегда правильным.

намек

Это, вероятно, очень простая математическая проблема. Я просто не нашел решения прямо сейчас (сегодня не мой день)!

Если у вас есть какие-либо идеи или предложения, не стесняйтесь спрашивать и предлагать!

пример

Изображение 174551

Доступные разрешения

  • 3: 2 (Как на iPhone до iPhone 5; Кто-нибудь знает другое имя?)
  • 16:10 (WXGA)
  • 16: 9 (широкоэкранный)
  • 4: 3 (VGA)

Спасибо за помощь!

  • 0
    Вы после height = width / widthRatio * heightRatio ? (или наоборот)
  • 0
    Хорошо. Но элемент управления внутри симулятора должен заполнять либо ширину, либо высоту симулятора. Как мне узнать, нужно ли доводить высоту элемента управления до максимума или ширину? Я бы попробовал, наверное?
Показать ещё 4 комментария
Теги:
winforms
resize
aspect-ratio

1 ответ

2
Лучший ответ

Вот небольшая пробная версия. Поместите элемент управления в форму и назначьте ему переменную 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;
    }

}
  • 0
    Это в основном, как я решил это. Я отмечу ваш ответ как принятый. Спасибо за поддержку!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню