Как установить минимальный размер клиентской области формы.
Свойство Form.MinimumSize
устанавливает минимальный размер формы в целом, включая текущие границы, заголовок и тонкое внутреннее заполнение, которое применяется при размер формы изменяется, и выполняется новый макет (многие факторы определяют эту активность ).
Это может быть незаметно, потому что это быстро (и, как правило, никто не заботится), но отношение между размером формы и размером клиента не является постоянным. Он может измениться при изменении размера формы, перетаскивая ее границы. Или системное событие вызывает это.
Кроме того, изменение системных настроек во многих отделах (свойства Windows, Тема, Dpi, Размер шрифта и c.) Может определять изменение отношений между размером формы. и размер его клиентской области.
Хорошо, что Форма знает об этих изменениях и, когда уведомляется о системном событии, которое каким-то образом изменяет аспект Windows, повторно выполняет свое layout.
Когда это происходит (и это может происходить часто, всегда при изменении размера формы), вызывается метод OnLayout .
Переопределение OnLayout, позволяет обновлять значения, основанные на показателях области окна / клиента.
► Может быть интересно посмотреть, что происходит, когда системные настройки, влияющие на аспект Windows, изменяются во время работы приложения. В этом конкретном c контексте, сколько раз вызывается метод OnLayout
и какие свойства LayoutEventArgs установлены в.
Все это считается, мы можно создать свойство c MinimumClientSize
.
Переопределить OnLayout
и сбросить Form.MinimumSize
на новый Form.MinimumClientSize
плюс разница между Form.Size
и Form.ClientSize
.
Например, если нам нужно, чтобы размер клиентской области был минимальным (500, 500)
:
private Size m_MinimumClientSize = new Size(500, 500);
public Size MinimumClientSize {
get => m_MinimumClientSize;
set { m_MinimumClientSize = value;
this.PerformLayout();
}
}
protected override void OnLayout(LayoutEventArgs e) {
base.OnLayout(e);
this.MinimumSize = m_MinimumClientSize + (this.Size - this.ClientSize);
}
Если добавить метод OnLayout
:
Console.WriteLine($"ClientSize: {this.ClientSize}");
Console.WriteLine($"MinimumSize: {this.MinimumSize}");
Console.WriteLine($"Size: {this.Size}");
становится ясно, что соотношение между Form.Size
и Form.ClientSize
не всегда одинаково.
Мы также можем рассчитать разницу между Size и ClientSize следующим образом:
var borderSize = new Size(
(SystemInformation.FrameBorderSize.Width * SystemInformation.BorderMultiplierFactor
+ (SystemInformation.Border3DSize.Width * 2)) * 2,
(SystemInformation.FrameBorderSize.Height * SystemInformation.BorderMultiplierFactor
+ (SystemInformation.Border3DSize.Height * 2)) * 2);
var captionSize = new Size(0, SystemInformation.CaptionHeight);
this.MinimumSize = MinimumClientSize + borderSize + captionSize;
Эти фиксированные меры верны. В обычных ситуациях они предоставляют одинаковые значения.
Хотя не всегда. Никогда, когда форма изменяется до минимального размера.
Плюс, мы рассматриваем только форму с 3d-границей.
Ну, мы также можем переопределить WndProc
...