С# Сообщите, если форма максимизируется

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

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

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

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


person Ozzy    schedule 02.06.2009    source источник


Ответы (5)


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

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

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

person ChrisF    schedule 02.06.2009
comment
Это уже пробовал. Проблема в том, что если я попытаюсь изменить ширину и высоту формы, когда она развернута, ничего не произойдет. Даже если я редактирую свойство MaximumSize - person Ozzy; 02.06.2009
comment
Я думаю, установив свойство MaximumSize, вы фактически отключили функциональность Maximize. Попробуйте установить для параметра MaximumSize значение (0,0), если WindowSate развернут. - person ChrisF; 02.06.2009
comment
Я только что попробовал, и когда я нажал «Развернуть», мое приложение переместилось в верхний левый угол экрана и осталось в максимальном размере. - person ChrisF; 02.06.2009
comment
Вы также не устанавливаете для WindowState значение Maximized. - person ChrisF; 02.06.2009

Я нашел ответ, который меня полностью устроил. Небольшое переопределение 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. Изящный хD

person Ozzy    schedule 02.06.2009
comment
this.maximize = true; я не могу найти свойство, подобное максимизации. Кстати, хорошая работа, мне очень помогла. - person Sangram Nandkhile; 15.10.2012
comment
Просто хочу добавить список всех сообщений pinvoke.net/default.aspx/Enums.WindowsMessages - person Sangram Nandkhile; 15.10.2012

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

person Timothy Carter    schedule 02.06.2009
comment
У меня уже установлен минимальный размер. Будучи перфекционистом в дизайне (не говоря уже о том, что я хорош в дизайне, хотя: P), я не могу сделать форму больше, чем все элементы управления, которые она отображает. - person Ozzy; 02.06.2009


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

private void Form1_Resize(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Normal)
    {
        this.WindowState = FormWindowState.Maximized;
    }
}
person Pedro Arruda    schedule 17.10.2017