Максимизация ребенка МДИ в ограниченной области

У меня есть форма, которая является mdicontainer и имеет полосу меню в верхней части. Я добавляю дочернюю форму к своему контейнеру mdi, и когда я максимизирую дочернюю форму, она максимизируется по менструации. Я хочу знать, как ограничить ребенка, чтобы максимизировать ниже менструации. Любая помощь будет оценена.

3 ответа

Решение

Ваша дочерняя форма максимизируется так, как предполагается, что дочерние формы максимизируются в MDI. На самом деле он не охватывает полосу меню родительской формы - он фактически объединяет собственную полосу меню с полосой родительской формы.

Чтобы дочерняя форма занимала только доступную дочернюю область в родительском элементе MDI (и не объединяла его меню с родительским меню), поместите что-то вроде этого кода в событие Resize дочерней формы:

if (this.WindowState == FormWindowState.Maximized)
{
    this.WindowState = FormWindowState.Normal;
    this.Size = this.MdiParent.ClientSize;
    this.Location = new Point(0, 0);
}

что предотвратит максимальное увеличение дочернего окна.

Я говорю "что-то вроде этого кода", потому что этот фрагмент не работает точно. ClientSize Свойство родительской формы дает общий размер формы, тогда как вы хотите использовать размер только клиентской области MDI. Я не знаю, как это получить, и, видимо, это не так просто. Смотрите этот вопрос:

Размер / расположение клиентской зоны Winforms MDI

Вы можете установить свойство MaximumSize так, чтобы оно не заполняло весь контейнер.

Я знаю, что это старый вопрос, но я столкнулся с этим на старом проекте, над которым я работаю, так что вот ответ для любого, кто видел это. Установка Dock в DockStyle.Fill даст вам желаемое поведение.

Просто имейте в виду, что окно будет выглядеть / выглядеть странно, если вы попытаетесь изменить положение окна или изменить его размер, когда у него есть этот DockStyle.

Для этого я подписался на событие resize окна клиента MDI и, если окно было только что развернуто, я установил для его DockStyle значение Fill, для FormBorderStlye было установлено значение FixedDialog(чтобы предотвратить изменение размера), а для состояния окна было установлено нормальное состояние, чтобы предотвратить максимизация от происходящего.

Чтобы пользователь не мог переместить окно, пока оно находится в этом "развернутом состоянии", я просто переопределил метод WndProc и обработал его при перемещении окна (SC_MOVE) и поместил возврат, чтобы не дать действию вступить в силу.

Другие вопросы по тегам