Delphi Multiple MDI Children вызывает изменение состояния окна - PullRequest
3 голосов
/ 20 декабря 2011

Я пытаюсь предотвратить изменения дочернего элемента MDI WindowState при создании второго дочернего объекта MDI ...

У меня есть приложение, которое я разрабатываю, написанное на Delphi. Благодаря небольшому волшебству Delphi / Windows приложение имеет несколько MDI Parents и несколько MDI Children.

Я могу создать форму (дочерний элемент A1) и развернуть ее в пределах родительского элемента MDI (родительский элемент A). Я могу создать вторую форму (дочерний элемент B1) и развернуть ее во втором родительском элементе MDI (родительский элемент B). Обе формы будут мазимизированы у отдельных родителей, больных ДИ. Все идет нормально. У меня это работает.

Однако, когда я создаю второго дочернего элемента MDI (дочерний элемент A2) в первом родительском элементе MDI (родительский элемент A), WindowState (wsMaximized) первого дочернего элемента (дочерний элемент A1) изменяется при создании второго дочернего элемента (дочерний элемент A2). Я хочу, чтобы первый дочерний элемент (дочерний элемент A1) оставался максимальным, а второй дочерний элемент (дочерний элемент A2) создавался и помещался поверх первого дочернего элемента ...

Как я могу предотвратить изменение состояния первого ребенка MDI, а также создать второго ребенка MDI? Есть намеки?

ОК - Теперь я пообедал, может быть, я смогу объяснить это лучше ... вот второй взгляд ...

Описанное поведение может быть воспроизведено в простом приложении MDI (магия, которую я использовал для создания нескольких родителей MDI, не влияет на мою проблему)

Создание нового приложения форм, меняющего стиль формы на fsMdiForm Создайте вторую форму, измените ее стиль на fsMDIChild Создайте третью форму, измените ее стиль на fsMDIChild

Запустите приложение. Создайте вторую форму, затем разверните ее (работает как положено - максимально в MDI Parent) При создании третьей формы открывается третья форма с состоянием окна wsNormal. Но когда создается третья форма, состояние окна второй формы изменяется - оно перестает быть максимизированным и становится wsNormal, как если бы вы нажали кнопку восстановления!

Я хочу избежать восстановления второй формы при открытии третьей формы ... (Все формы имеют начальное WindowState wsNormal ...

Любые советы приветствуются!

Ответы [ 3 ]

1 голос
/ 20 декабря 2011

В моем приложении я также использую несколько родителей MDI.Ниже приведен мой магический код, в котором разные дочерние элементы имеют разные состояния в каждом родителе.

Этот код принят из: ID: 23574, нескольких родительских форм MDI в одном приложении

//Add multiple MDIForm support
TFormMDIEnhance = class(TForm)
  private
    _mdiClientHandle: HWND;
    function GetMDIClientHandle: HWND;
  protected
    procedure CreateWindowHandle(const Params: TCreateParams); override;
    procedure DestroyWindowHandle; override;
  end;

procedure TFormMDIEnhance.CreateWindowHandle(const Params: TCreateParams);
var
  mdiStruct: MDICREATESTRUCT;
begin
  _mdiClientHandle := GetMDIClientHandle;

  if (FormStyle = fsMDIChild) then
  begin
    mdiStruct.szClass := Params.WinClassName;
    mdiStruct.szTitle := Params.Caption;
    mdiStruct.hOwner := HInstance;
    mdiStruct.x := Params.X;
    mdiStruct.y := Params.Y;
    mdiStruct.cx := Params.Width;
    mdiStruct.cy := Params.Height;
    mdiStruct.style := Params.Style;
    mdiStruct.lParam := LPARAM(Params.Param);

    WindowHandle := SendStructMessage(_mdiClientHandle, WM_MDICREATE, 0, mdiStruct);
    Include(FFormState, fsCreatedMDIChild);
  end
  else
    inherited CreateWindowHandle(Params);
end;

procedure TFormMDIEnhance.DestroyWindowHandle;
begin
  if fsCreatedMDIChild in FFormState then
    SendMessage(_mdiClientHandle, WM_MDIDESTROY, Handle, 0)
  else
    inherited DestroyWindowHandle;

  _mdiClientHandle := 0;
end;

function TFormMDIEnhance.GetMDIClientHandle: HWND;
var
  fm: TForm;
begin
  result := 0;

  if Owner is TForm then
  begin
    fm := Owner as TForm;
    if Assigned(fm) then
      Result := fm.ClientHandle;
  end;

  if (Result = 0) and Assigned(Application.MainForm) then
    Result := Application.MainForm.ClientHandle;

  if Result = 0 then
    raise EInvalidOperation.Create(SNoMDIForm);

end;

Унаследуйте ваши формы от этой базовой формы, тогда вы сможете создать несколько родителей MDI.Может быть, это поможет.

0 голосов
/ 29 декабря 2011

Реми и Дэвид оба правы в том, что это ограничение MDI.

Мое решение в итоге, которое работает, состояло в том, чтобы поддерживать ChildWindowState (который является просто WindowState) в каждой дочерней форме, затемобработка изменения размера / расположения дочерних окон при изменении ChildWindowState ... Это не очень приятный ответ, но он обеспечивает необходимую мне функциональность в моем приложении.

Спасибо за все ответы:)

0 голосов
/ 20 декабря 2011

Мне потребовались целые годы, чтобы понять, что вы на самом деле спрашиваете, но я думаю, что это сводится к этому комментарию.

Я хочу, чтобы поведение WindowState детей MDI было разным в родительском.Итак, первый MDI Child - это wsMax'd, а второй wsNormal.

Это невозможно в MDI.Когда дочерний MDI развернут, это единственное видимое дочернее окно.

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