3

現在、OS XのOpenGLウィンドウにフルスクリーンビューを追加しています。ユーザーの画面を引き継ぐというアイデアが気に入らないため、OSXの「フルスクリーンモード」を使用していません。

私は独自のカスタムウィンドウクラスを派生させており、そのクラスでセレクター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];
    }
}

これはほとんど正しく機能しているようで、フルスクリーンウィンドウ(Appleのドキュメントはこちら)と画面解像度の半分のウィンドウを切り替えます。

問題は、2つのモードを切り替えると、ウィンドウのフォーカスが失われることです。モードを切り替えた直後に使用しているキーボードショートカットを押すと、OSXエラー「ビープ音」が鳴ります。トグルを再度使用する前に、ウィンドウをクリックして「再アクティブ化」する必要があります。

関数にを追加しようとしました[self makeKeyAndOrderFront:nil];が、問題は解決しません。必要なのは、移行中にウィンドウを「フォーカス」したままにする方法です。その問題を除いて、この方法は完全に機能し、私のに変更を加える必要はありませんNSView

編集

関連性があるかどうかはわかりませんが、ペン先からロードするのではなく、プログラムでこのウィンドウを作成しています。

4

2 に答える 2

2

(Lionの時点で)正しい最新の方法のように見える、さらに簡単な方法...

ウィンドウを作成した後、私の NSApplicationDelegate の init メソッドで (申し訳ありませんが、新しいので用語が間違っています)...

[window setCollectionBehavior:(NSWindowCollectionBehaviorFullScreenPrimary)];

次にtoggleFullScreen、ターゲット = nil を指定して、たとえばメニューから a を起動します。

次に、アイコンで新しい名前付きデスクトップを作成し、ウィンドウをそれにスライドさせてフルスクリーンにします。フルスクリーンにすると、Google Chrome や Safari と同じように表示されます。私もペン先やxib、または最近の子供たちがそれを呼ぶものは何もせずにそれをやっています.

このページでは、Interface Builder の方法でそれを行う方法について説明します。

これは、この件に関するAppleの公式ドキュメントです。

于 2015-03-13T14:47:36.907 に答える
0

私は自分でこの問題に遭遇し、setStyleMask の前にこれを呼び出すことがわかりました。

[window orderOut:nil];

そして、これは setStyleMask が私のために失われたフォーカスの問題を修正した後:

[window makeKeyAndOrderFront:nil];
于 2017-07-01T03:14:58.393 に答える