objective-c - 如何在 Mac OS X Lion 上双屏显示

标签 objective-c macos cocoa

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

谢谢

最佳答案

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

  1. Create a screen-sized window on the display you want to take over:

    NSRect mainDisplayRect = [[NSScreen mainScreen] frame];
    NSWindow *fullScreenWindow = [[NSWindow alloc] initWithContentRect: mainDisplayRect styleMask:NSBorderlessWindowMask
        backing:NSBackingStoreBuffered defer:YES];
    
  2. Set the window level to be above the menu bar.:

    [fullScreenWindow setLevel:NSMainMenuWindowLevel+1];
    
  3. Perform any other window configuration you desire:

    [fullScreenWindow setOpaque:YES];
    [fullScreenWindow setHidesOnDeactivate:YES];
    
  4. Create a view with a double-buffered OpenGL context and attach it to the window:

    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. Show the window:

    [fullScreenWindow makeKeyAndOrderFront:self];
    

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

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

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

关于objective-c - 如何在 Mac OS X Lion 上双屏显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12831249/

相关文章:

objective-c - 如何从 SKShapeNode 裁剪出 SKLabelNode?

macos - ffmpeg 安装失败 OSX 11.2.3

objective-c - NS图像到纹理

cocoa - 如何使用 NSDateFormatter 格式化 NSString?

c++ - 有人知道一些lib处理音频吗?如STK

ios - 我可以减少重复声明中的代码吗?

linux - docker 网络 - 无法发现任何可绑定(bind)的网络接口(interface)

macos - 为什么 AXUIElementCopyAttributeValue() 会为此函数中屏幕上的每个窗口返回 kAXErrorAttributeUnsupported ?

ios - 如何在elcImagePickerController中获取视频的NSData?

objective-c - 如何从 OS X 中的设备 ID 知道设备的名称?