Создать свойство Form.MinimumClientSize - PullRequest
2 голосов
/ 18 января 2020

Формы Windows имеют свойства Size и ClientSize. Windows Формы также имеют свойство MinimumSize, которое позволяет вам установить наименьший допустимый размер формы. Я ищу способ установить минимум ClientSize формы. Я новичок в c# и не уверен, как лучше это сделать.

Мне пришло в голову, что я могу использовать событие Form.SizeChanged, чтобы проверить и ограничить размер формы, но это показалось грязным и я ищу другой способ сделать это.

Примечание: Если размер границы формы изменяется, я хочу сохранить минимальный размер клиента.

1 Ответ

4 голосов
/ 18 января 2020

Как установить минимальный размер клиентской области формы.

Свойство 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 ...

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