2012-09-15 82 views
3

我目前正在向OS X中的OpenGL窗口添加全屏視圖。我沒有使用OS X的「全屏模式」,因爲我不喜歡接管用戶屏幕。Make Cocoa Window Fullscreen

我有我自己的自定義窗口類從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]; 
    } 
} 

這似乎大多正常,全屏窗口之間切換(每個蘋果的文檔here)和一半的屏幕分辨率的窗口。

問題是,在兩種模式之間切換會使我的窗口「失去焦點」。如果我在切換模式後立即使用了我正在使用的鍵盤快捷鍵,則會出現OS X錯誤「嗶嗶聲」。我必須點擊窗口才能「重新激活」它,然後才能再次使用切換。

我試着給我的函數添加一個[self makeKeyAndOrderFront:nil];,但那不能解決問題。我需要的是在轉換過程中保持窗口「專注」的方式。除了這個問題,這個方法完美無缺,不需要修改我的NSView

編輯

不知道它的相關性,但我編程方式創建這個窗口,而不是從筆尖加載它。

+0

無邊距窗口不鍵,默認情況下,所以您需要覆蓋'-canBecomeKeyWindow': - (BOOL)canBecomeKeyWindow { \t return YES; }另外我會建議使用'-setFrame:display:animate:'而不是'-setFrame:display',那麼你會得到很好的動畫。 –

+0

@JustinBoo:添加'canBecomeKeyWindow'似乎沒有什麼區別。至於渲染,我使用'CVDisplayLink' :-) – Kyle

+0

爲了記錄,有一個很好的頁面與相關信息[這裏](http://cocoadev.com/wiki/BorderlessWindow),但它不似乎也提供了一個很好的解決方案。有人說使用'NSWindowController'可以解決這個問題,但這對我不起作用。 – Kyle

回答

2

一個更簡單的方法,這似乎是正確的現代生活方式(如獅子)...

在我NSApplicationDelegate的init方法(對不起,我新,所以我的條件是錯誤的),創造了後窗口...

[window setCollectionBehavior:(NSWindowCollectionBehaviorFullScreenPrimary)];

然後把火關toggleFullScreen,從你的菜單中說,與目標=零。

然後,它會創建一個帶有圖標的新命名桌面,並將其滑動到全屏。就像谷歌瀏覽器或Safari,當你讓他們全屏。我也是這樣做,沒有筆尖或xib,或者這些天孩子們所說的。

This page談論如何使用Interface Builder方式。

This是蘋果官方的官方文檔。

0

我來到這個問題我自己,發現該setStyleMask之前調用此:

[window orderOut:nil]; 

而在此之後,setStyleMask固定爲我失去焦點的問題:

[window makeKeyAndOrderFront:nil];