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!

stefano m
fonte
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

Daniel A. White
fonte
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;

Abhishek.Chopra
fonte
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.

David Heffernan
fonte
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

Ramgy Borja
fonte
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.

LarsTech
fonte
2

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

Muhammad Haroon
fonte
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

Josh John
fonte