首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSOpenPanel在全屏NSWindow之上?

NSOpenPanel在全屏NSWindow之上?
EN

Stack Overflow用户
提问于 2009-12-21 18:21:30
回答 3查看 4.6K关注 0票数 3

我用以下内容打开一个窗口:

代码语言:javascript
复制
NSRect screenRect = [[NSScreen mainScreen] frame];
[super initWithContentRect:screenRect 
               styleMask:NSBorderlessWindowMask 
                 backing:NSBackingStoreBuffered 
                   defer:NO]; 
int windowLevel = CGShieldingWindowLevel();
[self setLevel:windowLevel];

..。因此,该窗口是全屏的&高于所有其他窗口级别(包括模态窗口)。稍后,我想显示一个打开的面板,但是下面的对话框打开了下面的对话框--我在上面创建的窗口(似乎runModal的内容覆盖了我试图设置的请求窗口级别):

代码语言:javascript
复制
  NSOpenPanel *OP = [NSOpenPanel openPanel];      
  int windowLevel = CGShieldingWindowLevel();
  [OP setLevel:windowLevel];
  int returnCode = [OP runModal];

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

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

..。所以我的问题是:

  • ,有人知道如何在CGShieldingWindowLevel之上打开一个模式窗口吗?
  • ,有什么方法可以使菜单栏不出现在我正在尝试的单张解决方案上?

谢谢大家:-)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-08 14:43:28

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

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

..。依:打开面板,就像打开自己的窗户一样,这正是我最想做的事情(嗯!)

票数 3
EN

Stack Overflow用户

发布于 2011-06-01 10:34:34

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

代码语言:javascript
复制
@implementation NSSavePanel (SavePanelSetLevel)

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

@end

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

票数 3
EN

Stack Overflow用户

发布于 2010-01-03 22:32:16

好的,5年后,我可以把它做好--诀窍是打开第二个窗口,把它推广到CGShieldingWindowLevel,让它键和顺序前面,然后把打开的工作表附加到它上面--工作表神奇地出现在第二个窗口的任何地方,虽然并不完美,但它看起来比我最初想出的解决方案要好得多。这是零钱:

代码语言:javascript
复制
  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);
             }];

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1941749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档