Вопрос

Хорошо, вот моя проблема.У меня есть форма, максимальный размер которой, когда она не развернута, должен равняться общей высоте компонентов внутри формы.Чтобы добиться этого, я использую это:

    private void resize_form(object sender, EventArgs e)
    {
        this.MaximumSize = new System.Drawing.Size(1000, this.panel4.Height + this.label2.Height + this.HeightMin);
    }

Это срабатывает при событии изменения размера формы.Поскольку размер компонента постоянно меняется, имело смысл сделать это при событии изменения размера.Однако, если я хочу максимизировать форму, форма просто переходит к самым высоким настройкам, определенным в this.MaximumSize.Поэтому мне было интересно, есть ли способ определить, когда форма будет развернута, и установить ее максимальный размер на границах экрана до того, как форма развернется.

Если есть лучший способ изменить значение максимального размера без события изменения размера, это тоже было бы здорово :)

Это было полезно?

Решение 2

Я нашел ответ, который меня полностью устроил.Небольшое переопределение WndProc :D (теперь я люблю WndProc)

protected override void WndProc(ref Message message)
{
    const int WM_SYSCOMMAND = 0x0112;
    const int SC_MAXIMIZE = 0xF030; 

    switch (message.Msg)
    {
        case WM_SYSCOMMAND:
            int command = message.WParam.ToInt32() & 0xfff0;
            if (command == SC_MAXIMIZE) 
            {
                this.maximize = true;
                this.MaximumSize = new System.Drawing.Size(0, 0);
            }
            break;
    }

    base.WndProc(ref message);
}

private void resize_form(object sender, EventArgs e)
{
    if (!maximize)
    {
        this.MaximumSize = new System.Drawing.Size(1000, this.panel4.Height + this.label2.Height + this.HeightMin);
    }
}

По сути, он устанавливает для this.maximize значение true, когда получает сообщение SC_MAXIMIZE.Событие изменения размера установит новый MaximumSize только в том случае, если для this.maximize установлено значение false.Отлично xD

Другие советы

Вам все равно нужно использовать событие изменения размера, но проверьте WindowState:

if (this.WindowState == FormWindowState.Maximized)
{
    // Do your stuff
}

Как отмечает Ишудителу, вы также можете установить свойство минимального размера вашей формы - что в сочетании с разумным использованием значений привязки должно означать, что она никогда не сможет сжиматься слишком сильно, а когда она вырастет, компоненты будут перемещаться и/или расти по мере увеличения размера. необходимый.

Вы уверены, что не хотите устанавливать Минимальный размер свойство?Если вы установите для параметра «Минимальный размер» размер всех меток, форма никогда не будет меньше этого размера.Но он все равно может вырасти до любого размера, который захочет пользователь, если он больше минимального.

Проверьте System.Windows.Forms.Screen сорт.Получите экран из соответствующей точки (для обработки случая с несколькими мониторами), а затем получите его разрешение.

Это должно работать в сочетании с другим комментарием о проверке FormWindowState.Maximized.

Если пользователь нажимает на верхнюю панель, он может изменить размер окна, поэтому я использую это:

private void Form1_Resize(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Normal)
    {
        this.WindowState = FormWindowState.Maximized;
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top