delphi - 在 Delphi 中控制 fsMDIChild 窗口的位置

标签 delphi c++builder mdi mdichild

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

通过深入研究 VCL 源代码,我找到的唯一解决方案是重写 TCustomForm 的 CreateParams 方法并更改 Params 参数的 X、Y、宽度和高度字段,但这感觉像是一种 hack。有没有更干净的方法来做到这一点?

最佳答案

您可以向 MainForm 的 ClientHandle 发送 WM_SETREDRAW 消息,先将 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);
}

关于delphi - 在 Delphi 中控制 fsMDIChild 窗口的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3507144/

相关文章:

delphi - Delphi中.Create和.Create()有什么区别?

windows - Delphi Firemonkey Cross Platform - 传递 Windows 句柄的通用方法

c++ - 我的消息收到额外字符的原因可能是什么?

delphi - DragMode为dmAutomatic时,如何使TScrollBox自动滚动?

linux - TIdMBCSEncoding.Create ('ASCII' ) 在 Linux 上返回 MaxCharSize = 0

xml - 使用 Delphi XML 数据绑定(bind)向导时不存在必需的标记

c++ - 如何使用同步()?

c# - 我如何知道新的 MDI 表单已添加到父 MDI 表单中?

c++ - 如何在 vc++ 6 中使用 mfc 标记选中的菜单项?

java - MDI JTable 重叠区域重绘