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-нормальным, как если бы вы нажали кнопку Восстановить!
Я хочу избежать восстановления второй формы при открытии третьей формы... (Все формы имеют начальное состояние окна ненормально...
Любые намеки очень ценятся!
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