Проблема высоты формы, когда FormBorderStyle НЕТ - PullRequest
3 голосов
/ 12 ноября 2010

У меня есть форма без полей (FormBorderStyle = None) с высотой 23 пикселей (установлено в конструкторе)

Когда .NET рисует мою форму во время выполнения - она ​​рисует ее высотой 38 пикселей (по некоторым причинам она добавляет высоту строки заголовка).

MessageBox.Show(this.Height.ToString()); //this shows 38!! why?

Чтобы обойти это, я должен установить «Высота = 23;» в событии Form_Load.

private void MyForm_Load(object sender, EventArgs e)
{
    this.Height = 23; //workaround. wtf??
}

Вы можете попробовать это сами в Visual Studio 2010 (Winforms App, target Framework - 2.0).

Wtf

1 Ответ

5 голосов
/ 12 ноября 2010

Да, это ошибка, в некотором роде. Обратите внимание, как в дизайнере вы устанавливаете размер формы с помощью свойств Width и Height. Эти свойства включают в себя размер границ и строку заголовка. Это проблема, однако, ваша форма может работать на компьютере, где пользователь увеличил, скажем, размер шрифта в строке заголовка. Это уменьшит размер клиентской области окна. Или, другими словами, свойство ClientSize формы будет меняться на этом компьютере. Оставляя меньше места для элементов управления и очень сильно портя дизайн вашей формы.

В классе Form есть код, который запускается после , когда создается дескриптор, непосредственно перед выполнением события Load. Он пересчитывает размер формы, используя тот же размер ClientSize, который был у вас на компьютере. Теперь все хорошо, высота формы не будет соответствовать той, которую вы установили в конструкторе, но в остальном форма выглядит одинаково, а расположение элементов управления идентично.

Тот же код гарантирует, что окно не станет слишком маленьким. И вот где он падает, он не уделяет достаточного внимания свойству FormBorderStyle. Как вы выяснили, обрезка высоты до размера строки заголовка плюс высота клиентской области. Это также предотвращает сужение формы, пытаясь убедиться, что значок и кнопки min / max / close всегда видны. Даже если у вас их нет.

Обходной путь - изменить ClientSize после выполнения этого кода, для этого нужно использовать переопределение OnLoad или обработчик события Load. Помните, что если вы жестко запрограммируете размер формы, как этот, то вам также следует установить для свойства AutoScaleMode значение None. Убедитесь, что это не вызывает проблем на компьютере с другим параметром DPI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...