【问题标题】:Delphi SDI application - Not handling cascade/tile horizontal & tile vertically?Delphi SDI 应用程序 - 不处理级联/平铺水平和垂直平铺?
【发布时间】:2009-12-08 16:14:11
【问题描述】:

我的应用程序似乎没有接收或处理特定 Windows 版本上的 Cascade、Tile Horizo​​ntal/Tile Vertical 的相同 Windows 消息。

Windows XP x32 - 不工作
Windows XP x64 - 未测试
Windows Vista x32 - 不工作
Windows Vista x64 - 工作正常?
Windows 7 x32 - 未测试
Windows 7 x64 - 不工作

有人知道为什么会出现这种情况吗?有没有什么特定于 Vista x64 的东西不与其他人一样,我自己也不会这么想!

更新

更具体地说,我指的是当我打开一个或多个应用程序实例时,我按住 Ctrl 并从任务栏中选择这些实例,然后尝试层叠/平铺。

升级到 Delphi 2009 之前的旧版本应用程序似乎可以正常工作。与此不同的是我们现在使用的是 DevExpress 功能区组件。更令人沮丧的是,我们还有另一个版本的应用程序,它在 Delphi 2009 中并使用了功能区,而且效果很好!

【问题讨论】:

  • 你如何“捕获”这些信息?也许它可以帮助
  • 我没有困住他们,我以为是操作系统处理了这个问题?
  • 我什至不知道你能做到这一点!对于它的价值,我只是在 WinXP-32 下使用 Delphi 2006 应用程序进行了尝试,你是对的。它不起作用。
  • @Mike,是的,您可以捕获多个 Windows 消息(我们实际上在很多情况下都会这样做)。但是,我们不会捕获特定于该区域的任何内容。
  • @James,我的意思是我不知道你可以从任务栏中多选应用程序并平铺它们。我以为我什么都知道:-} 刚刚尝试运行 Winspector - 我可以看到正确的 WM_WINDOWPOSCHANGING 和 WM_WINDOWPOCHANGED 消息进入队列,但应用程序实例没有移动。

标签: windows delphi delphi-2009 windows-messages


【解决方案1】:

如果您在谈论 Delphi 的 TForm.Cascade 和 TForm.Tile 方法,请参阅文档(Delphi 7,因为它很方便):

使用 Cascade 排列 MDI 子窗体,使它们重叠。 Cascade 仅在窗体是 MDI 父窗体时才有效(即,如果窗体的 FormStyle 属性为 fsMDIForm)。

如您所见,它们仅适用于 MDI 子窗体;它们对非 MDI 子窗体没有影响。这也许可以解释为什么他们不能在您测试过的四个操作系统中的三个上工作。 (我怀疑 Vista x64 的工作是某种侥幸。)

编辑:根据评论,问题与 TForm.Cascade/Tile 无关。

不过,我认为 Craig Young 走在了正确的轨道上。你有没有尝试添加

Application.ShowMainFormOnTaskbar := True;

到 .DPR 文件?我认为问题可能在于,在早期版本的 Delphi 中启动然后更新到较新版本的项目中,未设置标志并且应用程序的窗口是放在任务栏上的。将其改为主表单可能会解决问题。

【讨论】:

  • 我指的是当您在任务栏上右键单击应用程序并从菜单中选择这些选项时。不管它是什么类型的应用程序,我都会通过它。
  • 啊,好的。措辞像 TForm.Cascade 一样读给我听。查看更新的答案。
  • 我在 cmets 中提到了这个已经完成的主要问题。我不认为这是问题所在。 I noticed we do trap the WM_MOVING message however it doesn't seem to get called when the Cascade/Tile options are selected.
【解决方案2】:

一个简单的 Delphi 应用程序有两个“主”句柄。一个用于主窗体,另一个用于 TApplication 实例。

就我个人而言,我不使用该功能在桌面上平铺或层叠应用程序(我更喜欢最大限度地运行事物)。因此,我从来没有费心去挖掘这种行为。不过我可以指点一下:

  • TApplication.WndProc 方法很可能正在接收消息,但尝试调整它的大小无济于事。
  • 我建议您截取相关消息并将它们简单地传递给主窗体的句柄。
    • TApplication.OnMessage 事件是最简单的,应该足够了。
    • 如果没有,您可以尝试使用 TApplication.HookMainWindow();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 2016-01-27
    相关资源
    最近更新 更多