Como ocultar apenas o botão Fechar (x)?


151

Tenho uma caixa de diálogo modal e preciso ocultar o botão Fechar (X), mas não posso usá-lo ControlBox = false, pois preciso manter os botões Minimizar e Maximizar.

Eu preciso esconder apenas o botão Fechar, existe alguma maneira de fazer isso?

Muito obrigado!

Atualização: eu tinha permissão para desativá-lo, o que é mais simples :) Obrigado a todos!


Pode ser isso que você deseja: [Ocultar o botão Fechar [X] dos formulários do Win no C # .NET] ( sameeramrutia.wordpress.com/2008/09/16/… ) apenas pesquisou:,hide close button c# segundo resultado aqui! =)
Miguel Angelo

você está errado, eu não quero desabilitar o botão, mas ocultá-lo .. você consegue encontrar uma solução?
stefano m

8
Necessidade é uma palavra forte. De onde vem esse requisito? Qual é o requisito real - que o usuário não possa encerrar o programa ou que a interface do usuário "pareça que não possui um botão Fechar"? Porque existem outras maneiras de contornar isso, e você será pressionado a fechar completamente todas elas (por exemplo, gerenciador de tarefas, habilidade para tarefas, possivelmente alt + f4, etc.). Pessoalmente, não trabalharia muito nisso, porque, a menos que você repare a aparência de todo o aplicativo, será um esforço desperdiçado e quebrará as expectativas / continuidade do usuário com outros programas do Windows.
Merlyn Morgan-Graham

4
@ Sayem revela esta página, então não seja tão crítico.
Brian Graham

1
Raspe o botão minimizar da sua lista também. Minimizar um diálogo modal o fechará automaticamente. Necessariamente, é a única janela restante que ainda está ativada. Quando você o minimiza, não resta nenhuma janela que ainda possa obter o foco, para que o usuário não possa voltar ao seu programa. Agora você está em "isso ainda faz sentido?" território. Não faz.
Hans Passant

Respostas:


148

Você não pode ocultá-lo, mas pode desativá-lo, substituindo a propriedade CreateParams do formulário.

private const int CP_NOCLOSE_BUTTON = 0x200;
protected override CreateParams CreateParams
{
    get
    {
       CreateParams myCp = base.CreateParams;
       myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON ;
       return myCp;
    }
}

Fonte: http://www.codeproject.com/KB/cs/DisableClose.aspx


Obrigado, eu encontrei esta solução, mas gostaríamos escondê-lo, não apenas desativar :( anywat obrigado!
m stefano

4
não há outra maneira senão projetar seu formulário do zero.
Daniel A. White

sim. é melhor criar seu próprio formulário com sua própria caixa de controle sem o botão Fechar e ocultar a caixa de controle do formulário pai.
precisa

A resposta de 'Abhishek.Chopra' é simples e eficaz.
Altaf Patel #

Como habilitá-lo durante o tempo de execução novamente?
Mike de Klerk

158

Podemos ocultar o botão Fechar no formulário definindo this.ControlBox=false;


29
Você leu a pergunta em que ele especificou que isso não era uma opção?
Servy

28
Fiz uma pesquisa no Google e esse SO QA foi o principal sucesso. E essa resposta foi o que eu estava procurando. Obrigado Abhishek ...
Abel Gaxiola

15
Isso oculta todos esses botões de dimensionamento. Não apenas o X.
Rich Shealer

1
Muito obrigado! Caminho mais fácil.

26

Bem, você pode ocultá-lo removendo todo o menu do sistema:

private const int WS_SYSMENU = 0x80000;
protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.Style &= ~WS_SYSMENU;
        return cp;
    }
}

Obviamente, isso remove os botões minimizar e maximizar.

Se você mantiver o menu do sistema, mas remover o item de fechamento, o botão Fechar permanecerá, mas será desativado.

A alternativa final é pintar a área de não-cliente. É muito difícil acertar.


4
Isso também funciona, ótimo! Mas ControlBox = false é fácil de usar como você quer.
simmeone 9/02/16

1
É o mesmo que definir como ControlBoxfalse. Além disso, ele falha no requisito: preciso manter os botões Minimizar e Maximizar #
whiteshooz

23

você pode ocultar a caixa fechada usando

this.ControlBox = false;

e não se esqueça de adicionar espaço em branco this.Text = " "para torná-lo assim

insira a descrição da imagem aqui


2
Isto é o que eu preciso. Obrigado.
Kosmas

2
Isso não está correto. Diretamente da questão do OP: Eu não pode usarControlBox = false
Martin

8

Se você realmente deseja ocultá-lo, como em "não visível", provavelmente precisará criar um formulário sem borda e desenhar os componentes da legenda. A biblioteca VisualStyles tem os elementos do Windows disponíveis. Você também teria que adicionar novamente a funcionalidade de redimensionar o formulário ou movê-lo, agarrando a barra de legenda. Sem mencionar o menu do sistema no canto.

Na maioria dos casos, é difícil justificar que o botão "fechar" não esteja disponível, especialmente quando você deseja um formulário modal com recursos de minimização. Minimizar uma forma modal realmente não faz sentido.


2

Nas propriedades do seu formulário, defina 'Control Box' = False, mas ocultará Minimized e Maximize também.


1

Bem, você pode ocultar o botão Fechar alterando o FormBorderStyle da seção de propriedades ou programaticamente no construtor usando:

public Form1()
{
InitializeComponent();
this.FormBorderStyle = FormBorderStyle.None;
}

então você cria um item da faixa de menu para sair do aplicativo.

Felicidades

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.