2

我希望我的应用程序同时显示在笔记本电脑屏幕和带有两个分离的 NSWindow 的外部屏幕上,我找不到任何关于如何实现它的文档。有什么提示吗?

谢谢

4

1 回答 1

1

OS X OpenGL Programming Guide展示了制作全屏窗口的旧方法:

  1. 在要接管的显示器上创建一个屏幕大小的窗口:

    NSRect mainDisplayRect = [[NSScreen mainScreen] frame];
    NSWindow *fullScreenWindow = [[NSWindow alloc] initWithContentRect: mainDisplayRect styleMask:NSBorderlessWindowMask
        backing:NSBackingStoreBuffered defer:YES];
    
  2. 将窗口级别设置为高于菜单栏。:

    [fullScreenWindow setLevel:NSMainMenuWindowLevel+1];
    
  3. 执行您想要的任何其他窗口配置:

    [fullScreenWindow setOpaque:YES];
    [fullScreenWindow setHidesOnDeactivate:YES];
    
  4. 创建具有双缓冲 OpenGL 上下文的视图并将其附加到窗口:

    NSOpenGLPixelFormatAttribute attrs[] =
    {
        NSOpenGLPFADoubleBuffer,
        0
    };
    NSOpenGLPixelFormat* pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
    
    NSRect viewRect = NSMakeRect(0.0, 0.0, mainDisplayRect.size.width, mainDisplayRect.size.height);
    MyOpenGLView *fullScreenView = [[MyOpenGLView alloc] initWithFrame:viewRect pixelFormat: pixelFormat];
    [fullScreenWindow setContentView: fullScreenView];
    
  5. 显示窗口:

    [fullScreenWindow makeKeyAndOrderFront:self];
    

您可以使用此方法在要绘制到的每个屏幕上创建窗口。如果您使用它仅在一个屏幕上创建一个窗口,另一个屏幕将继续正常运行,而不是被涂黑或被愚蠢的亚麻纹理覆盖。根据您的使用情况,您可能不希望setHidesOnDeactivate.

还有一些较低级别的 API 可以完全控制屏幕并阻止操作系统或任何其他应用程序绘制到屏幕上,但它们的使用很少是合理的。

编辑:如果你想拥有一个跨越多个屏幕的渲染的 GL 上下文,你需要创建一个NSRect跨越所有屏幕的单一窗口。如果屏幕分辨率不匹配,这可能会导致您的部分窗口不可见,并且低端图形芯片可能会出现一些问题。

于 2012-10-11T02:53:52.230 回答