Мне кажется, что вы пытаетесь сделать простую вещь слишком сложным способом. Я обработал бы сообщение WM_GETMINMAXINFO
, которое отправляется в ваше окно всякий раз, когда его размер или позиция собирается измениться. Обработка этого сообщения дает вам возможность указать максимальное или минимальное значение для каждого из этих атрибутов, эффективно предотвращая его уменьшение или уменьшение по вашему желанию.
Я не буду публиковать много примеров кода, потому что ваш вопрос показывает, что вы уже знаете, как переопределить WndProc
и обрабатывать оконные сообщения. Единственное, что вам нужно сделать, это определить структуру MINMAXINFO
в управляемом коде. Примерно так:
[StructLayout(LayoutKind.Sequential)]
struct POINT
{
public int X;
public int Y;
}
[StructLayout(LayoutKind.Sequential)]
struct MINMAXINFO
{
public POINT ptReserved;
public POINT ptMaxSize;
public POINT ptMaxPosition;
public POINT ptMinTrackSize;
public POINT ptMaxTrackSize;
}
Используйте Marshal.PtrToStructure
для преобразования указателя, содержащегося в свойстве Message.LParam
, в экземпляр структуры MINMAXINFO
, определенной выше. Итак, внутри вашего WndProc
метода вы бы сделали что-то вроде:
MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(msg.LParam, typeof(MINMAXINFO));
Обновление:
На скриншотах, которые вы опубликовали, похоже, что два разных дисплея идентичны, единственное отличие состоит в том, отображается ли DataGridView внизу. GroupBox вверху отображается независимо от размера формы.
Таким образом, мне кажется, что решение состоит в том, чтобы просто обработать событие Form.Resize
(которое должно быть вызвано независимо от того, как изменяется размер вашей формы, будь то путем ручного перетаскивания ее границ, нажатия заголовка кнопки панели или с помощью Aero Snap).
Внутри этого метода обработчика событий проверьте текущие размеры вашей формы. Если оно достаточно большое, установите для свойства Visible
элемента управления DataGridView
значение true
. Если его недостаточно, переключитесь на «минимальный режим», установив DataGridView.Visible = false
.
Это не очень технически сложное решение, но, похоже, оно должно достичь всех ваших желаемых целей. Мотивация, насколько я понимаю, заключается в том, чтобы предоставить более простой интерфейс, когда форма слишком мала, чтобы можно было все видеть, и расширить этот интерфейс, когда форма больше. Если вы обработаете событие Resize
и проверите фактический размер формы после того, как это событие сработало, вы не ошибетесь.
Альтернативное решение - просто включить свойство AutoScroll
и всегда показывать оба элемента управления. Все, что нужно сделать пользователю, это прокрутить вверх или вниз, чтобы увидеть все, что он хочет. WinForms позаботится обо всем остальном.