При изменении размеров окон на рабочем столе Windows полагается на сообщение WM_GETMINMAXINFO, чтобы получить пределы размера, чтобы окно оставалось пригодным для использования - согласно рекомендациям Microsoft ,
[Resizable windows] Следует установить минимальный размер окна, если есть размер, ниже которого контент больше не может использоваться. Для элементов управления с изменяемым размером установите минимальные размеры элементов с изменяемым размером на их наименьшие функциональные размеры, такие как минимальная ширина функциональных столбцов в представлениях списка.
По умолчанию Windows накладывает ограничение высоты строки заголовка для высоты и около 100 пикселей для ширины (кнопки min / max / close + несколько букв имени). Чтобы снять это ограничение, вы должны самостоятельно обработать сообщение WM_GETMAXINFO и изменить минимальный размер на тот, который необходим.
Пример кода C # можно адаптировать отсюда :
private const long WM_GETMINMAXINFO = 0x24;
public struct POINTAPI
{
public int x;
public int y;
}
public struct MINMAXINFO
{
public POINTAPI ptReserved;
public POINTAPI ptMaxSize;
public POINTAPI ptMaxPosition;
public POINTAPI ptMinTrackSize;
public POINTAPI ptMaxTrackSize;
}
protected override void WndProc(ref System.Windows.Forms.Message m )
{
if (m.Msg == WM_GETMINMAXINFO)
{
MINMAXINFO mmi = (MINMAXINFO)m.GetLParam(typeof(MINMAXINFO));
mmi.ptMinTrackSize.x = 0;
mmi.ptMinTrackSize.y = 0;
System.Runtime.InteropServices.Marshal.StructureToPtr(mmi, m.LParam, true);
}
base.WndProc(ref m);
}
И (исследуя это) я нашел еще один SO вопрос , который касается той же проблемы. Очевидно, вам также нужно переопределить WM_WINDOWPOSCHANGING
, чтобы это работало в Vista и / или C #. (Другой пример, который я видел, был в Delphi, и ему также не нужно было переопределять последнее сообщение).