【问题标题】:Excluding certain MDI child windows from cascading从级联中排除某些 MDI 子窗口
【发布时间】:2012-01-16 17:47:30
【问题描述】:

我编写了一个包含许多子窗体的 MDI 应用程序,每个子窗体都不同。假设用户创建了三个子窗体:第一个窗体的左上角位于屏幕坐标 0,0;第二个表格已被拖到屏幕的右侧(坐标 100、300),第三个表格出现在坐标 20,20 处。如果我使用主窗体的级联命令,那么第二个窗体将移动到 10,10。

我希望第二个表格保持原样,并让第三个表格移动到 10、10(即级联顺序的第二位)。有没有办法从主窗体的“级联”命令中排除特定的 MDI 子窗体?

【问题讨论】:

    标签: delphi mdi


    【解决方案1】:

    无法影响Cascade 方法的行为,该方法通过向MDI 容器窗口ClientHandle 发送WM_MDICASCADE 消息来实现。

    现在,查看WM_MDICASCADE,它可以选择从级联中跳过禁用的 MDI 子级。因此,您可以禁用某些子窗口,自己发送WM_MDICASCADE 消息,然后重新启用子窗口。我没有尝试这样做,但在我看来它很有可能会奏效。

    您的另一个选择是实现您自己的 MDI 子定位方法。这实际上是相对容易做到的。我建议您查阅Wine 项目的源代码,以了解如何执行此操作。密钥文件是user32 DLL 中的mdi.c

    【讨论】:

    • 我会将 wm_mdicascade 消息发送到哪个表单,主表单还是子表单?
    • 发送到MainForm.ClientHandle,这是代表MDI容器的窗口。阅读TForm.Cascade的源码,看看VCL是怎么做的。
    • 我已经在我的博客上写了完整的解决方案 - nbnewman.blogspot.com/2011/12/…
    • 您是否考虑过我们 99% 多年前选择的解决方案?停止使用 MDI。糟透了。
    • 99% 我见过的具有“多文档界面”样式的应用程序使用停靠或其他方法来模拟 MDI,而无需在 Windows 中使用 Windows 3.1 时代的 MDI 代码,但存在无数故障。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多