Pergunta

Na minha aplicação eu preciso cinza temporariamente fora o botão de minimização do formulário principal. Alguma idéia de como isso pode ser alcançado? Eu não me importo de fazer p / invoca para DLLs Win32.

Edit:? Greying o botão de minimizar seria a solução preferida, mas existe alguma outra maneira de prevenir a forma de tornar-se minimizado

Foi útil?

Solução

Eu li o seu comentário em relação à minha resposta e foi capaz de angariar uma solução mais completa para você. Corri isso rapidamente e parecia ter o comportamento que você queria. Em vez de derivar suas winforms da forma, derivar dessa classe:


using System;
using System.Windows.Forms;
using System.ComponentModel;

namespace NoMinimizeTest
{
    public class MinimizeControlForm : Form
    {
        private const int WM_SYSCOMMAND = 0x0112;
        private const int SC_MINIMIZE = 0xf020;

        protected MinimizeControlForm()
        {
            AllowMinimize = true;
        }

        protected override void WndProc(ref Message m)
        {
            if (!AllowMinimize)
            {
                if (m.Msg == WM_SYSCOMMAND)
                {
                    if (m.WParam.ToInt32() == SC_MINIMIZE)
                    {
                        m.Result = IntPtr.Zero;
                        return;
                    }
                }
            }
            base.WndProc(ref m);
        }

        [Browsable(true)]
        [Category("Behavior")]
        [Description("Specifies whether to allow the window to minimize when the minimize button and command are enabled.")]
        [DefaultValue(true)]
        public bool AllowMinimize
        {
            get;
            set;
        }
    }
}

Você poderia fazer um pouco mais se você queria ser capaz de decidir se permite minimizar no momento do clique é enviada, por exemplo:


using System;
using System.Windows.Forms;
using System.ComponentModel;

namespace NoMinimizeTest
{
    public class MinimizeControlForm : Form
    {
        private const int WM_SYSCOMMAND = 0x0112;
        private const int SC_MINIMIZE = 0xf020;

        protected MinimizeControlForm()
        {

        }

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_SYSCOMMAND)
            {
                if (m.WParam.ToInt32() == SC_MINIMIZE && !CheckMinimizingAllowed())
                {
                    m.Result = IntPtr.Zero;
                    return;
                }
            }
            base.WndProc(ref m);
        }

        private bool CheckMinimizingAllowed()
        {
            CancelEventArgs args = new CancelEventArgs(false);
            OnMinimizing(args);
            return !args.Cancel;
        }

        [Browsable(true)]
        [Category("Behavior")]
        [Description("Allows a listener to prevent a window from being minimized.")]
        public event CancelEventHandler Minimizing;

        protected virtual void OnMinimizing(CancelEventArgs e)
        {
            if (Minimizing != null)
                Minimizing(this, e);
        }
    }
}

Para obter mais informações sobre esta notificação de janela, consulte o artigo MSDN sobre isso .

Outras dicas

form.MinimizeBox = false;

ou se no âmbito formulário

MinimizeBox = false;

Basta fazer MinimizeBox = false; no código do seu formulário.

Coloque este código no evento de redimensionamento do formulário:

if (this.WindowState == FormWindowState.Minimized)
{
    this.WindowState = FormWindowState.Normal;
}

Isso fará com que seu formulário un-minimizable (IMPORTANTE: Eu não defendo alterar o comportamento padrão do Windows, desta forma).

Você também pode implementar identificador para o evento Minimizar para cancelar o comando

Não faça isso. não mexa com minhas janelas. Eles são minha, não sua. É o meu computador e se eu quiser minimizar, eu deveria ser capaz de fazer. Eu não posso pensar, e nunca foram dadas, uma boa razão para fazer isso.

A resposta de Coincoin está correto. MinimizeBox também está disponível como uma propriedade na janela de propriedades de grife.

@ Kevin: Enquanto eu aprecio o sentimento, que nem sempre é uma resposta válida. Se o aplicativo exibe uma caixa de diálogo modal através da criação de uma nova instância de um formulário e, em seguida, chamando .ShowDialog () sobre ele, você não deseja que o usuário para minimizar essa forma, porque então todas as entradas na principal segmento interface do usuário é bloqueado até que que o estado modal do formulário está satisfeito. O usuário poderia potencialmente clique no formulário principal e é só pegar o "ding ding ding" som não responde a partir do Windows e não sabe o que fazer.

apenas definir a propriedade MinimizeBox do seu formulário como falsa. isso irá desativar o botão de minimizar, mas outros botões permanecerá funcional.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top