使Cocoa窗口全屏

3

我正在为我的OpenGL窗口在OS X中添加全屏视图。我不使用OS X的“全屏模式”,因为我不喜欢占据用户的屏幕。

我有自己的自定义窗口类,派生自NSWindow,在该类中,我已经重写了toggleFullscreen:选择器:

- (void)toggleFullScreen:(id)sender
{
    _fullscreen = !_fullscreen;
    if(_fullscreen) {
        NSRect screenRect = [[NSScreen mainScreen] frame];
        [self setStyleMask:NSBorderlessWindowMask];
        [self setFrame:screenRect display:YES];
        [self setLevel:NSMainMenuWindowLevel+1];
        [self setOpaque:YES];
        [self setHidesOnDeactivate:YES];
    } else {
        NSRect screenRect = [[NSScreen mainScreen] frame];
        unsigned int width = (unsigned int)(screenRect.size.width/2.0f);
        unsigned int height = (unsigned int)(screenRect.size.height/2.0f);
        NSRect frame = NSMakeRect(0, screenRect.size.height-height, width, height);

        [self setStyleMask:NSTitledWindowMask | NSResizableWindowMask];
        [self setFrame:frame display:YES];
        [self setLevel:NSNormalWindowLevel];
        [self setOpaque:YES];
        [self setHidesOnDeactivate:NO];
    }
}

这似乎基本上可以正确工作,可以在全屏窗口(根据苹果的文档这里)和半屏分辨率窗口之间切换。

问题在于,在两种模式之间切换会使我的窗口“失去焦点”。如果我在切换模式后立即按下我正在使用的键盘快捷方式,我会得到OS X错误提示音。在我能再次使用开关之前,我必须单击窗口以“重新激活”它。

我已经尝试在我的函数中添加[self makeKeyAndOrderFront:nil];,但这并没有解决问题。除了这个问题之外,这种方法完美地工作,并且不需要对我的NSView进行任何更改。

编辑

不确定是否相关,但我是通过编程方式创建此窗口的,而不是从Nib加载它。


无边框窗口默认情况下不是关键窗口,因此您需要覆盖-canBecomeKeyWindow方法:-(BOOL)canBecomeKeyWindow { return YES; } 另外,我建议使用`-setFrame:display:animate:`而不是`-setFrame:display`,这样您将获得漂亮的动画效果。 - Justin Boo
@JustinBoo:添加 canBecomeKeyWindow 似乎没有什么区别。至于渲染,我正在使用 CVDisplayLink :-) - Kyle
仅供参考,这里有一个相关信息的好页面链接,但它似乎也没有提供一个好的解决方案。有人说使用NSWindowController可以解决这个问题,但对我来说并没有起作用。 - Kyle
2个回答

2
一种更简单的方法,看起来是正确的现代方式(截至Lion)...
在我的NSApplicationDelegate的init方法中(抱歉,我是新手,所以我的术语不对),在创建窗口后...
[window setCollectionBehavior:(NSWindowCollectionBehaviorFullScreenPrimary)];
然后从您的菜单中触发一个toggleFullScreen,目标为nil。
然后它会创建一个新的命名桌面,带有图标,将您的窗口滑动到该桌面并使其全屏。就像谷歌Chrome或Safari在您使它们全屏时一样。我也没有使用nib或xib或现在孩子们称之为的任何东西。
这个页面讨论了用Interface Builder的方式来做它。
这是苹果公司关于这个主题的官方文档。

0

我自己遇到了这个问题,并发现在调用setStyleMask:之前调用它:

[window orderOut:nil];

在我使用setStyleMask之后,这解决了我失去焦点的问题:

[window makeKeyAndOrderFront:nil];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接