Как скрыть только кнопку Закрыть (х)?

151

У меня есть модальное диалоговое окно, и мне нужно скрыть кнопку «Закрыть» (X), но я не могу использовать ControlBox = false, потому что мне нужно сохранить кнопки «Развернуть» и «Развернуть».

Мне нужно спрятать только кнопку Закрыть, есть ли способ сделать это?

Большое спасибо!

Обновление: у меня было разрешение отключить его, что проще :) Спасибо всем!

Стефано м
источник
Может ли это быть тем, чего вы хотите: [Скрыть кнопку закрытия [X] Win Forms в C # .NET] ( sameeramrutia.wordpress.com/2008/09/16/… ) просто googled: hide close button c#второй результат здесь! =)
Мигель Анджело
вы не правы, я не хочу отключить кнопку, но скрыть ее .. вы можете найти решение?
Стефано м
8
Нужно это сильное слово. Откуда это требование? Каково реальное требование - чтобы пользователь не мог завершить программу или чтобы пользовательский интерфейс "выглядел так, как будто у него нет кнопки закрытия"? Потому что есть другие способы обойти это, и вам будет трудно полностью закрыть все из них (например, диспетчер задач, taskkill, возможно, alt + f4 и т. Д.). Лично я не стал бы слишком усердно работать над этим, потому что, если вы все равно не перекрасите свое приложение целиком, это будет напрасной тратой усилий и нарушит ожидания пользователей / преемственность с другими программами Windows.
Мерлин Морган-Грэм
4
@ Скажем, это открывает эту страницу, так что не будь таким критиком.
Брайан Грэм
1
Вычеркните также кнопку свертывания из вашего списка. Минимизация модального диалога автоматически закроет его. Обязательно, это единственное оставшееся окно, которое все еще включено. Когда вы минимизируете его, не останется ни одного окна, которое все еще может сфокусироваться, чтобы пользователь не мог вернуться к вашей программе. Вы сейчас в "это все еще имеет смысл?" территория. Это не так.
Ганс Пассант

Ответы:

148

Вы не можете скрыть это, но вы можете отключить его, переопределив свойство CreateParams формы.

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

Источник: http://www.codeproject.com/KB/cs/DisableClose.aspx

Даниэль А. Уайт
источник
спасибо, я нашел это решение, но мы хотели бы скрыть его, а не просто отключить :( в любом случае спасибо!
stefano m
4
нет другого способа, кроме как создать свою форму с нуля.
Дэниел А. Уайт
Да. Лучше создайте свою собственную форму с вашим собственным блоком управления без кнопки закрытия, а затем скройте блок управления родительской формы.
Бахамут
Ответ от «Абхишек.Чопра» прост и эффективен.
Альтаф Патель
Как включить его во время выполнения снова?
Майк де Клерк
158

Мы можем скрыть кнопку закрытия на форме, установив this.ControlBox=false;

Abhishek.Chopra
источник
29
Вы читали вопрос, где он указал, что это не вариант?
Servy
28
Сделал поиск Google, и этот SO QA был лучшим хитом. И этот ответ был тем, что я искал. Спасибо, Абхишек ...
Абель Гаксиола
15
Это скрывает все эти кнопки размера. Не только X.
Богатый Шилер
1
Спасибо вам большое! Самый простой способ.
26

Ну, вы можете скрыть это, удалив все системное меню:

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

Конечно, при этом удаляются кнопки минимизации и максимизации.

Если вы удерживаете системное меню, но удаляете элемент закрытия, кнопка закрытия остается, но не работает.

Последняя альтернатива - нарисовать область, не относящуюся к клиенту, самостоятельно. Это довольно сложно понять правильно.

Дэвид Хеффернан
источник
4
Это тоже работает, отлично! Но ControlBox = false легко использовать по-вашему.
Simmeone
1
Это то же самое, что и установка ControlBoxв false. Кроме того, оно не соответствует требованию: мне нужно сохранить кнопки «Свернуть» и «
Развернуть»
23

Вы можете скрыть закрытое окно, используя

this.ControlBox = false;

и не забудьте добавить пробел, this.Text = " "чтобы сделать это так

введите описание изображения здесь

Рамги Борха
источник
2
Это то, что мне нужно. Спасибо.
Космас
2
Это не правильно. Непосредственно из вопроса ОП: я не могу использоватьControlBox = false
Мартин
8

Если вы действительно хотите скрыть это, как в «невидимом», то вам, вероятно, придется создать форму без полей и нарисовать компоненты заголовка самостоятельно. Библиотека VisualStyles имеет доступные элементы Windows. Вы также должны были бы добавить обратно функциональность изменения размера формы или перемещения формы, захватив строку заголовка. Не говоря уже о системном меню в углу.

В большинстве случаев трудно оправдать отсутствие кнопки «закрыть», особенно если вам нужна модальная форма с минимизирующими возможностями. Минимизация модальной формы действительно не имеет смысла.

LarsTech
источник
2

В свойствах вашей формы установите «Control Box» = False, но он также скроет «Свернутый» и «Свернуть».

Мухаммед Харун
источник
1

Вы можете скрыть кнопку закрытия, изменив FormBorderStyle из раздела свойств или программно в конструкторе, используя:

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

затем вы создаете пункт меню для выхода из приложения.

ура

Джош Джон
источник