Delphi несколько дочерних элементов MDI вызывает изменение состояния окна



Я ищу, чтобы предотвратить изменения WindowState дочернего MDI, происходящие при создании второго дочернего MDI...



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



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



Однако, когда я создаю второй МДИ ребенок (А2) в первом МДИ родителей (родителя) на windowstate значение (wsMaximized) первый ребенок (А1) меняется, когда второй ребенок (А2) создается. Я хочу, чтобы первый ребенок (ребенок А1) оставался максимизированным, а второй ребенок (ребенок А2) был создан и помещен поверх первого ребенка...



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



Хорошо-теперь я пообедал, может быть, я смогу объяснить это лучше... а вот и вторая попытка...



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

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



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



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



Любые намеки очень ценятся!

564   3  

3 ответов:

В моем приложении я также использую несколько родителей 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. Может быть, это поможет.

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

Я хочу, чтобы поведение WindowState детей MDI было другим в родителе. Поэтому сначала дочерней MDI-wsMax бы и второй wsNormal.

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

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

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

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

Comments

    Ничего не найдено.