【问题标题】:NSOpenPanel above a fullscreen NSWindow?NSOpenPanel 上面是全屏 NSWindow?
【发布时间】:2009-12-21 18:21:30
【问题描述】:

我打开一个带有以下内容的窗口:

NSRect screenRect = [[NSScreen mainScreen] frame];
[super initWithContentRect:screenRect 
               styleMask:NSBorderlessWindowMask 
                 backing:NSBackingStoreBuffered 
                   defer:NO]; 
int windowLevel = CGShieldingWindowLevel();
[self setLevel:windowLevel];

...所以窗口是全屏的,并且高于所有其他窗口级别(包括模式窗口)。我稍后想显示一个打开的面板,但是下面会打开我在上面创建的窗口下面的对话框(似乎 runModal 的东西覆盖了我尝试设置的请求的窗口级别):

  NSOpenPanel *OP = [NSOpenPanel openPanel];      
  int windowLevel = CGShieldingWindowLevel();
  [OP setLevel:windowLevel];
  int returnCode = [OP runModal];

...下面会在上面创建的窗口上打开一个工作表(很好),但它也会显示我之前隐藏的菜单栏(不是我想要的):

  NSOpenPanel *OP = [NSOpenPanel openPanel];      
  [OP beginSheetModalForWindow:[self window]
             completionHandler:^(NSInteger returnCode) {
               NSLog(@"completionHandler called with %d", returnCode);
             }];

...所以我的问题是:

  • 有谁知道如何打开CGShieldingWindowLevel上方的模态窗口?
  • 有什么方法可以让菜单栏不显示在我在上面尝试的工作表解决方案上?

谢谢大家:-)

【问题讨论】:

  • 别忘了检查[super init…]的返回值。

标签: objective-c cocoa modal-dialog nswindow


【解决方案1】:

好的,这是一个更好的选择 - 我在查看文档时完全错过了这个:

NSOpenPanel *OP = [NSOpenPanel openPanel];
[OP setLevel:CGShieldingWindowLevel()];
[OP beginWithCompletionHandler:^(NSInteger returnCode) {
  NSLog(@"completionHandler called with %d", returnCode);
}];

...即:打开面板作为它自己的窗口,这正是我想要做的第一件事(duh!)

【讨论】:

    【解决方案2】:

    您可以像这样创建一个 NSSavePanel 类别:

    @implementation NSSavePanel (SavePanelSetLevel)
    
    - (void)setLevel:(NSInteger)newLevel
    {
        [super setLevel:CGShieldingWindowLevel()] ; // NSWindow implementation call
    }
    
    @end
    

    因为 runModal 重置了之前设置的关卡!

    【讨论】:

      【解决方案3】:

      好的,5 年后,我可以完成这项工作 - 诀窍是打开第二个窗口,将其提升到 CGShieldingWindowLevel,使其成为关键和订单前面,然后将打开的工作表附加到它 - 神奇的工作表从第二个窗口所在的任何地方都会出现,虽然并不完美,但它看起来比我最初提出的解决方案要好得多。变化如下:

        NSOpenPanel *OP = [NSOpenPanel openPanel];
      
        // this is the new bit - make the window 1x1 @ the location of your liking
        NSRect windowRect = NSMakeRect(0, 1000, 1, 1);
        NSWindow *OPW = [[NSWindow alloc] initWithContentRect:windowRect 
                                                    styleMask:NSBorderlessWindowMask 
                                                      backing:NSBackingStoreBuffered 
                                                        defer:NO];  
        int windowLevel = CGShieldingWindowLevel();
        [OPW setLevel:windowLevel];
        [OPW makeKeyAndOrderFront:nil];
        // end of new bit, apart from passing OPW for beginSheetModalForWindow
        // instead of [self window]
      
        [OP beginSheetModalForWindow:OPW
                   completionHandler:^(NSInteger returnCode) {
                     NSLog(@"completionHandler called with %d", returnCode);
                   }];
      

      ...唯一需要注意的是,使用下面的内容,您可以打开几个打开的对话框,因为工作表是主窗口以外的窗口的模式 - 主窗口仍然可以接受鼠标单击事件...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-03
        • 1970-01-01
        • 2012-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多