我的应用程序中的窗口从屏幕边缘弹出,这当然是一个问题,因为有些窗口是模态的,不能被关闭(你甚至不知道它们在那里)。
我正在使用 TurboPower Orpheus 组件,它会记住每个表单的位置和大小,然后在再次显示表单时恢复它。它将大小和位置保存在 INI 文件中。
我能做些什么来防止窗口从屏幕的一侧显示出来?
我的应用程序中的窗口从屏幕边缘弹出,这当然是一个问题,因为有些窗口是模态的,不能被关闭(你甚至不知道它们在那里)。
我正在使用 TurboPower Orpheus 组件,它会记住每个表单的位置和大小,然后在再次显示表单时恢复它。它将大小和位置保存在 INI 文件中。
我能做些什么来防止窗口从屏幕的一侧显示出来?
如果您使用多台显示器然后断开一个显示器,例如在断开笔记本电脑时,这种情况很常见。或者,如果您将笔记本电脑连接到分辨率更高的屏幕。或者使用远程桌面等。补救方法是用健全性检查覆盖“记住我的位置”行为,看看 left+width 是否超过屏幕的宽度(实际上是 Screen.Monitors 数组 - 谢谢大家),顶部+高度反之亦然。
理想情况下,您通过减去差异来“碰撞”,因此您正在与窗口想要跨越的边缘对接。
另外,查看 Orpheus 是否有修复此问题的更新。如果没有,您可以获取源代码,进行更正(可选)并将其贡献回项目。我记得是 OSS。
您可能想看一下它们的DefaultMonitor
属性并阅读代码TCustomForm.SetWindowToMonitor
以了解如何处理相对于 的定位Screen.Monitors
。
Use DefaultMonitor to associate a form with a particular monitor in a multi-monitor application. The following table lists the possible values:
Value Meaning
dmDesktop No attempt is made to position the form on a specific monitor.
dmPrimary The form is positioned on the first monitor listed in the global screen object's Monitors property.
dmMainForm The form appears on the same monitor as the application's main form.
dmActiveForm The form appears on the same monitor as the currently active form.
Note: DefaultMonitor has no effect if the application does not have a main form.