繁体   English   中英

Delphi多个MDI子项导致窗口状态更改

[英]Delphi Multiple MDI Children causes window state change

我正在寻找防止在创建第二个MDI子项时发生的MDI子WindowState更改...

我有一个我正在开发的应用程序,用Delphi编写。 通过一点点Delphi / Windows魔术,该应用程序有多个MDI父母和多个MDI子女。

我可以创建一个表单(子A1),并在MDI父级(Parent A)中最大化它。 我可以创建第二个表单(子B1)并在第二个MDI父表(父B)中最大化它。 两种形式都将在单独的MDI父母中最终化。 到现在为止还挺好。 我有这个工作。

但是,当我在第一个MDI父级(父级A)中创建第二个MDI子级(子级A2)时,第一个子级(子级A1)的WindowState(wsMaximized)在创建第二个子级(子级A2)时发生更改。 我希望第一个孩子(孩子A1)保持最大化,并且要创建第二个孩子(孩子A2)并将其放在第一个孩子的上面......

如何防止第一个MDI Child的状态发生变化,还可以创建第二个MDI子项? 任何提示?

好的 - 现在我吃了一些午餐,也许我可以更好地解释一下......这是第二次去吧...

所描述的行为可以在一个简单的MDI应用程序中重现(我用来创建多个MDI父项的魔法不影响我的问题)

创建一个新的表单应用程序,将formstyle更改为fsMdiForm创建第二个表单将其样式更改为fsMDIChild创建第三个表单将其样式更改为fsMDIChild

运行应用程序。 实例化第二个表单,然后最大化(按预期工作 - 在MDI Parent中最大化)实例化第三个表单,第三个表单以窗口状态wsNormal打开。 但是当创建第三个表单时,第二个表单的窗口状态会发生变化 - 它会停止最大化,并且变为wsNormal,就像您单击了还原一样!

当我打开第三个表单时,我想避免恢复第二个表单...(所有表单都有一个wsNormal的初始WindowState ...

任何提示非常感谢!

在我的应用程序中,我还使用多个MDI父母。 下面是我的魔术代码,其中不同的Childs在每个Parent中具有不同的状态。

此代码采用自: 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;

从该Base表单继承您的表单,然后您可以创建多个MDI Parent。 也许这有帮助。

我花了很多时间来研究你真正想要的东西,但我认为这归结为这个评论。

我希望MDI子项的WindowState行为在父项中是不同的。 所以第一个MDI Child是wsMax'd,第二个是wsNormal。

这在MDI中是不可能的。 当MDI子项最大化时,这是唯一可见的子窗口。

雷米和大卫都是正确的,因为它是MDI限制。

我的解决方案最终确实起作用,就是在每个子窗体上维护一个ChildWindowState(它只是一个WindowState),然后在ChildWindowState更改时处理子窗口的大小调整/定位...这不是一个很好的答案,但确实提供了我在我的应用程序中需要的功能。

感谢所有的答案 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM