2

想象一下,我将窗口的位置保存在我的首选项文件中。现在,用户将窗口移动到第二个监视器,然后退出我的应用程序。然后他断开第二台显示器并再次启动我的应用程序。现在我的应用程序想要恢复窗口的保存位置。但是如果一味的恢复旧的窗口坐标,窗口就会离屏。

我曾经在我的 Carbon 应用程序中使用 ConstrainWindowToScreen,但现在我将它移植到 Cocoa,我找不到与之对应的。

文档表明,不知何故,Cocoa 会自动阻止这种情况的发生。虽然在窗口打开时监视器发生变化时可能会出现这种情况,但在我自己存储窗口位置并在启动时重新打开窗口时恢复它们的情况下,这是行不通的。我需要按需调用 Cocoa 的神奇功能,但是如何调用呢?

(注意:我知道我可以遍历所有可用的屏幕,但是如果我想得到这个万无一失的话,我自己写起来会很痛苦。不过,如果你能提供一个完整的 C 或 ObjC 函数来解决它,那也将不胜感激。)

4

2 回答 2

1

请参阅NSWindow 类参考中的“在用户默认值中管理窗口框架”部分。这些方法确保窗口将完全放置在屏幕上。

如果您想自己保存和恢复窗口位置(作为字符串),请使用-stringWithSavedFrameand -setFrameFromString:

使用-saveFrameUsingName:-setFrameUsingName让 NSWindow 在用户默认值中保存和恢复它的框架,给定一个窗口名称。

于 2013-05-27T20:50:33.620 回答
1

我同意 Darren 的建议,即使用内置机制恢复窗口位置。真的,这就像在 IB 中(或使用-setFrameAutosaveName:)设置窗口的框架自动保存名称一样简单。

也就是说,如果一个窗口有一个标题栏,那么在屏幕上排序它的所有方法(例如-orderFront:-makeKeyAndOrderFront:)都会自动重新定位它,以确保至少标题栏和窗口的很大一部分在屏幕上。老实说,让标题窗口在理论上可见但实际上在屏幕外是很困难的。

于 2013-05-27T23:24:35.813 回答