【问题标题】:Controlling the placement of fsMDIChild windows in Delphi在 Delphi 中控制 fsMDIChild 窗口的位置
【发布时间】:2010-08-17 21:32:25
【问题描述】:

如何在 Delphi 或 C++Builder 中控制 MDI 子窗口 (FormStyle := fsMDIChild) 的放置?我知道我可以设置 Left、Top、Position 等,但特别是对于 MDI 子项,这些在窗口已经创建并显示在其默认位置之后才会生效。结果是一次创建和定位多个窗口会导致相当多的闪烁,因为窗口是在默认位置创建的,然后立即移动和调整大小。

通过深入研究 VCL 源代码,我能够找到的唯一解决方案是重写 TCustomForm 的 CreateParams 方法并更改 Params 参数的 X、Y、Width 和 Height 字段,但这感觉像是一个 hack。有没有更清洁的方法?

【问题讨论】:

    标签: delphi c++builder mdi mdichild


    【解决方案1】:

    您可以将WM_SETREDRAW 消息发送到 MainForm 的 ClientHandle,其中一个 wParam 设置为 False,然后将 wParam 设置为 True,以避免在设置 MDI 子窗口时闪烁,例如:

    德尔福:

    SendMessage(Application.MainForm.ClientHandle, WM_SETREDRAW, False, 0);
    try
      Child := TChildForm.Create(Self);
      Child.Left := ...;
      Child.Top := ...;
      Child.Show;
    finally
      SendMessage(Application.MainForm.ClientHandle, WM_SETREDRAW, True, 0);
      InvalidateRect(Application.MainForm.ClientHandle, nil, True);
    end;
    

    C++:

    SendMessage(Application->MainForm->ClientHandle, WM_SETREDRAW, FALSE, 0);
    try
    {
      Child = new TChildForm(this);
      Child->Left = ...;
      Child->Top = ...;
      Child->Show();
    }
    __finally
    {
      SendMessage(Application->MainForm->ClientHandle, WM_SETREDRAW, TRUE, 0);
      InvalidateRect(Application->MainForm->ClientHandle, NULL, TRUE);
    }
    

    【讨论】:

    • 谢谢。我必须使用 RedrawWindow 而不是 InvalidateRect 来让 MDI 子项正确重绘,如“备注”下的 msdn.microsoft.com/en-us/library/dd145219%28VS.85%29.aspx 所述。
    • 我使用 InvalidateRect() 它对我来说很好用。备注指的是 ListBox,而不是 MDI 窗口。
    【解决方案2】:

    我观察到根本没有闪烁,但这可能是因为我的计算机速度太快,或者可能是 Windows 7 对减少闪烁的改进。

    我在 FormShow 处设置了 MDI 子窗口位置:

    procedure TForm2.FormShow(Sender: TObject);
    begin
      Top := 200;
      Left := 400;
    end;
    

    【讨论】:

    • 谢谢。我试图从构造函数中执行此操作,但没有意识到 OldCreateOrder 设置为 true。一旦我修复了 OldCreateOrder,使用构造函数和 FormShow 都可以工作。
    猜你喜欢
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    相关资源
    最近更新 更多