Delphi: разверните дочернее окно в проекте MDI - PullRequest
0 голосов
/ 27 февраля 2012

Есть хороший компонент для максимизации дочернего окна в клиентской области (необходимо удерживать клавишу SHIFT) - NLDExtraMDIProps .

Или этот код можно использовать:

procedure WMSIZE(var Msg: TMessage); message WM_SIZE;

procedure TForm2.WMSIZE(var Msg: TMessage);
begin
  inherited;
  if Msg.WParam = SIZE_MAXIMIZED then
  begin
    ShowWindow(Handle, SW_RESTORE);
    Left := 0;
    Top := 0;
    Width := Form1.ClientWidth - 4; // The BORDER
    Height := Form1.ClientHeight - 4;
  end;
end;

Но максимизация не является реальной максимизацией. Дочернее окно выравнивается только по клиентской области. Он должен автоматически изменять размер и соответствовать клиентской области, когда изменяется родительское окно, должна изменяться системная кнопка максимизации / восстановления и т. Д.

Я пытаюсь выполнить эффекты, описанные ниже.

Как видно на рисунках, дочерние окна развернуты, а

1) они не занимают все родительское окно ( только клиентская область ).

2) невозможно переместить над заголовком / строкой заголовка, потому что они развернуты.

3) У них есть кнопка восстановления , больше не кнопка увеличения.

4) Они выровнены по клиентской области (изменение размера родительского окна приводит к изменению размера дочернего окна в пределах клиентской области).

Код в моем вопросе и компонент не похожи на дочерние окна на изображениях.

Можем ли мы сделать окно максимально развернутым (не только выровненным)?

Не максимизировано (не хорошо; компонент и код из моего вопроса максимизируются, как на этих рисунках):

enter image description here enter image description here

Максимально (что мне нужно):

enter image description here enter image description here

Ответы [ 2 ]

6 голосов
/ 27 февраля 2012

Я не понимаю вашей проблемы.Максимизация дочернего окна MDI выполняется:

  • программно: с помощью ShowWindow(ActiveMDIChild.Handle, SW_MAXIMIZE),
  • вручную: путем щелчка по значку «Развернуть рамку» или двойным щелчком по заголовку формы.

Оба эти действия приводят к:

  • исчезновению границы дочернего окна (сворачивается в границу формы MDI),
  • добавлению маленькой границызначки (для дочернего окна) на панели главного меню,
  • - эффект изменения размера, аналогичный эффекту Align=alClient.

Чтобы ограничить доступное пространство для дочерних окон в пределахосновной формы, убедитесь, что выровняли оконные элементы управления по краям формы.

Установка свойств Align или Anchors для дочерних окон MDI не имеет никакого эффекта: они больше не являются частью реализации выравнивания VCL по умолчанию.;Windows взяла на себя эту работу.

Если вы хотите вмешаться в изменение размера дочернего объекта MDI, тогда обработка WM_SIZE - неправильный подход, потому что это сообщение отправляется после изменения размера.Вместо этого, обработайте WM_SYSCOMMAND, как я объяснил здесь .

Что касается моего компонента, к которому вы обращаетесь:

  • Ручное увеличение, нажав значок Развернуть границу, делаетименно так: операция максимизации по умолчанию, как описано выше,
  • Максимизация вручную, щелкнув по значку Максимизировать границу, удерживая клавишу Shift, изменяет размер дочернего окна до наибольшего свободного пространства вФорма MDI.В этом случае изменение размера основной формы MDI не приводит к изменению размера дочерних форм MDI.
0 голосов
/ 05 февраля 2014
if (Msg.WParam = SIZE_MAXIMIZED) then
  begin
    Left := 0;
    Top := 0;
    Width := frmMain.ClientWidth - 4;
    Height := frmMain.ClientHeight - 4;
    SendMessage(Handle, WM_SIZE, SIZE_RESTORED, 0);
  end;
...