3

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

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
  • 有没有办法让菜单栏不显示在我上面尝试的工作表解决方案上?

谢谢大家:-)

4

3 回答 3

3

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

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

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

于 2010-03-08T14:43:28.503 回答
3

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

@implementation NSSavePanel (SavePanelSetLevel)

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

@end

因为 runModal 重置了之前设置的级别!

于 2011-06-01T10:34:34.233 回答
2

好的,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);
             }];

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

于 2010-01-03T22:32:16.430 回答