Pergunta

Ok heres meu problema. I tem uma forma que, quando não é maximizado, o seu tamanho máximo tem que ser a altura total dos componentes no interior da forma. Para conseguir isso, eu uso isso:

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

que dispara sobre o evento Resize do formulário. Porque o tamanho do componente está sempre mudando fazia sentido fazer isso em um evento de redimensionamento. Como sempre, se eu quero maximizar o formulário, o formulário só vai para as mais altas configurações definidas no this.MaximumSize. Então eu queria saber se existe uma maneira de dizer quando um formulário vai ser maximizado e defina seu MaximumSize aos boundarys tela antes que o maximiza formulário.

Se houver uma maneira melhor para alterar o valor MaximumSize sem evento de redimensionamento, que também seria ótimo:)

Foi útil?

Solução 2

Eu encontrei a resposta que me serviu perfeitamente. Um lil WndProc override: D (eu amo WndProc agora)

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);
    }
}

Basicamente ele define this.maximize a verdade quando se recebe teh mensagem SC_MAXIMIZE. O evento de redimensionamento só irá definir um novo MaximumSize se this.maximize é definida como falsa. Nifty xD

Outras dicas

Você ainda precisa usar o evento de redimensionamento, mas verificar o WindowState:

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

Como yshuditelu pontos fora, você pode definir a propriedade de tamanho mínimo do seu formulário também - que deveria, quando combinada com o uso criterioso de valores âncora, significa que ele nunca pode encolher muito longe e quando o faz crescer os componentes irá mover e / ou crescer conforme necessário.

Você tem certeza que não quer ser definindo o MinimumSize propriedade? Se você definir o MinimumSize para o tamanho de todos os rótulos, em seguida, a forma nunca será menor que isso. Mas ainda pode crescer para o tamanho que o usuário quer, contanto que ele é maior do que o mínimo.

Confira os System.Windows.Forms. classe Screen . Obter a tela de um ponto relevante (para lidar com o caso multi-mon) e, em seguida, obter a sua resolução.

Isso deve funcionar em conjunto com o outro comentário sobre a verificação FormWindowState.Maximized.

Se o usuário clicar na barra superior, que pode redimensionar a janela, então eu uso isso:

private void Form1_Resize(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Normal)
    {
        this.WindowState = FormWindowState.Maximized;
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top