如何在Mac OS X Lion上的双屏幕上显示

时间:2012-10-11 02:20:51

标签: objective-c macos cocoa

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

由于

1 个答案:

答案 0 :(得分: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.   
  3. 将窗口级别设置为菜单栏上方。:

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

    [fullScreenWindow setOpaque:YES];
    [fullScreenWindow setHidesOnDeactivate:YES];
    
  6.   
  7. 使用双缓冲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];
    
  8.   
  9. 显示窗口:

    [fullScreenWindow makeKeyAndOrderFront:self];
    
  10.   

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

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

编辑:如果您希望在渲染跨越多个屏幕的情况下拥有一个GL上下文,则需要创建一个跨越所有屏幕的NSRect的单个窗口。如果屏幕分辨率不匹配,可能会导致部分窗口无法看到,而低端图形芯片可能会出现问题。