【问题标题】:NSBorderlessWindowMask Window wont show NSPanels if not front most window如果不是最前面的窗口,NSBorderlessWindowMask 窗口将不会显示 NSPanels
【发布时间】:2008-11-21 23:07:02
【问题描述】:

我有一个用 NSBorderlessWindowMask 和 kCGDesktopWindowLevel 设置的窗口。当一个 NSPanel 应该从 Dock 图标菜单或状态栏项菜单的选择中出现时,如果应用程序不是最前面的窗口,则 NSPanel 将不会显示。

所以这个程序此时只有一个状态菜单项(想想 QuickSilver 是如何实现的),当我从我的菜单中选择首选项时,它被设置为使用 Makekey 和 orderfront 显示首选项面板,但是除非你刚刚启动了应用程序并且什么也没做,当您选择首选项时,什么也没有发生。

我发现,当我为 Sparkle 的检查更新选择菜单项时,检查更新面板会出现,然后会出现我让我打开的首选项面板。

所以看起来 makekeyandorderfront 并没有真正把它带到最前面,也许。

有谁知道如何解决这个问题? 我应该调用 makekeyandorderfront 之外的东西,还是与它结合使用?

提前致谢

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    面板默认设计为以这种方式工作。它们被设计为您的应用程序的辅助窗口,并且在应用程序停用时始终消失。您可能还会遇到面板成为关键的问题...但要解决您的面板消失问题,请将此消息发送到您的面板:

    [panelObject setHidesOnDeactivate:NO];
    

    您可能应该在这里使用实际的 NSWindow 对象而不是 NSPanel 对象,但由于我不太了解您的应用程序是如何工作的,因此您必须自己研究一下。有关面板和窗口之间区别的更多信息,请查看此处的文档:Window Programming Guide

    【讨论】:

    • 有没有办法让它在停用时隐藏,但是当他们选择菜单项时,它会将应用程序带到前面,这样他们就可以正常/正常工作?
    • 使用常规窗口并让状态菜单/停靠菜单项的操作命令窗口进入。完成后,将其排序。如果您希望它在用户单击其他位置时消失,请将 applicationDidResignActive 添加到您的应用委托并在那里订购。
    • kdbdallas:尝试 [NSApp activateIgnoringOtherApps:NO]。如果这不起作用,请尝试“是”。如果这不起作用,请尝试使用 { 0, kCurrentProcess } 和 kSetFrontProcessFrontWindowOnly 的 SetFrontProcessWithOptions。
    猜你喜欢
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 2020-11-24
    相关资源
    最近更新 更多