Изменить размер формы, как если бы это было изображение - PullRequest
0 голосов
/ 26 декабря 2018

Я использую дизайнер форм Visual Studio 2017, и я не нашел способа изменить размер формы, которая имитирует изменение размера изображения.Когда я изменяю размер формы, увеличивая ее на 25%, я хочу, чтобы все элементы внутри нее увеличивались на 25%, а расстояние между каждым элементом управления увеличивалось на эту величину, а между элементом управления и границами формы увеличивалось на 25%.

Я приложил GIF из ситуации

Что происходит

При использовании якоря

Что я хочу

Может кто-нибудь указать мне на библиотеку / способ достижения этого?

1 Ответ

0 голосов
/ 26 декабря 2018

Это не пробуждение из коробки;Я все еще не думаю, что это очень полезно;но, возможно, вашему специальному приложению нужно это нужно ..

Это результат нескольких строк ниже:

enter image description here

Итак, вот пример кода:

Сначала нам нужно настроить вещи путем сохранения старых границ, а также исходных родительских размеров в Tag каждого элемента управления:

    // pick the top parent; in my case it wa a TabPage (not shown)
    Control ctrl = pickTheParent;  
    foreach (Control c in ctrl.Controls) StoreBounds(ctrl, c);
    ctrl.Resize += (ss, ee) =>
    {
        foreach (Control c in ctrl.Controls)  ScaleBounds(c);
    };

Мы также подключили процедуру определения размера к событию Resize родителя.

Как сохранение, так и определение размера должны произойти с всеми элементы управления, включая вложенные ;поэтому они являются рекурсивными ..:

void StoreBounds(Control parent, Control ctl)
{
    ctl.Tag = new Tuple<Size, Rectangle>(parent.ClientSize, ctl.Bounds);
    // **
    foreach (Control c in ctl.Controls)  StoreBounds(ctl, c);
}


void ScaleBounds(Control ctl)
{
    ctl.Bounds = ScaledBounds(ctl);
    foreach (Control c in ctl.Controls)  ScaleBounds(c);
}

При определении размеров просто вычисляются старые и новые коэффициенты:

Rectangle ScaledBounds(Control c)
{
    if (c.Tag == null) return c.Bounds;
    Rectangle old = ((Tuple<Size, Rectangle>)c.Tag).Item2;
    Size frame1 = ((Tuple<Size, Rectangle>)c.Tag).Item1;
    Size frame2 = c.Parent.ClientSize;
    float rx = 1f * frame2.Width / frame1.Width;
    float ry = 1f * frame2.Height / frame1.Height;
    int x = (int)(old.Left * rx);
    int y = (int)(old.Top * ry);
    int w = (int)(old.Width * rx);
    int h = (int)(old.Height * ry);
    return new Rectangle(x,y,w,h);
}

Обратите внимание, что для показанного эффекта мне пришлось отключитьлюбые свойства AutoSize.

Также обратите внимание, что все Anchors (и любые Docks) были удалены .Чтобы сделать это автоматически, вы можете добавить одну или две строки кода в коде хранения (**) ..:

 ctl.Anchor = AnchorStyles.None;

Удаление Docking зависит от вас, может быть, некоторые, например Fill, на самом деле все еще полезны ..?

Также обратите внимание, что в примере строго рассматриваются Size и Location;никакие другие свойства не затронуты.Для некоторых, особенно для Fonts, можно добавить больше кода;например, добавьте 3 Item к Tuple для хранения оригинала FontSize .. Для других, например Border ширины, разумный метод определения размера не приходит на ум.

Очевидно, PictureBox был установлендо Zoom.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...