狮子/山狮窗口在第二台显示器上显示视频或其他信息,如输出监视器

时间:2013-07-13 13:54:38

标签: cocoa fullscreen osx-mountain-lion

我正在尝试将原生OSX应用程序编写为一种广告/多媒体播放器,将其内容分发到建筑物周围的多个屏幕。输出监视器连接到iMac或Macbook Pro辅助输出,并且具有相同的分辨率(1280x720),并使用优质电缆和VGA分配器/增强器盒进行物理连接。

所以我想要设置的是主要屏幕,停靠栏和菜单栏将有播放列表。辅助监视器将具有视频输出 - 我正在使用AVFoundation进行视频播放,并且已经进行了各种测试以获得可编程视频播放。

我希望第二台显示器最初只有一个带有图像的黑色屏幕,这样当没有播放时,人们会看到它。

我在这里阅读这篇文章: How to display on dual screens on Mac OS X Lion

然而,我似乎无法让它为我工作,并且有许多类似的例子具有相互矛盾的示例代码,所以我要求更多的“我做错了什么?”。

到目前为止,测试应用程序是作为xcode(非文档)中的简单Cocoa应用程序创建的,这是我试图根据示例链接开始工作的代码:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    NSUInteger c = [[NSScreen screens] count];
    NSLog(@"Number of screens = %li", (unsigned long)c);
    if ([[NSScreen screens] count] > 1) {
        NSLog(@"Attempting to setup second screen");
        NSScreen *screen = [[NSScreen screens] objectAtIndex:1];
        NSRect fs = [screen frame];
        NSLog(@"Second screen frame = x=%f, y=%f, w=%f, h=%f", fs.origin.x, fs.origin.y, fs.size.width, fs.size.height);
        NSRect ss = fs;
        NSWindow *win2 = [[NSWindow alloc] initWithContentRect:ss
                                                     styleMask:NSBorderlessWindowMask
                                                       backing:NSBackingStoreBuffered
                                                         defer:YES];

        [win2 setBackgroundColor:[NSColor blackColor]];
        [win2 setLevel:NSMainMenuWindowLevel+1];
        [win2 setOpaque:YES];
        [win2 setHidesOnDeactivate:YES];

        NSOpenGLPixelFormatAttribute attrs[] =
        {
            NSOpenGLPFADoubleBuffer,
            0
        };
        NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];

        NSRect viewRect = NSMakeRect(0.0, 0.0, fs.size.width, fs.size.height);
        NSOpenGLView *fullScreenView = [[NSOpenGLView alloc] initWithFrame:viewRect pixelFormat: pixelFormat];

        [win2 setContentView:fullScreenView];
        [win2 makeKeyAndOrderFront:self];

        NSButton *testButton = [[NSButton alloc] initWithFrame: NSMakeRect(50.0f, 50.0f, 100.0f, 50.0f)];
        [testButton setTarget:self];
        [testButton setAction:@selector(closeExternalWindow)];
        [fullScreenView addSubview:testButton];
        NSLog(@"Should have a black window with a button on it on monitor 2");
    }

}

我已将OpenGL.framework添加到项目中并包含在我的.h文件中。

在运行时,所有发生的情况是主窗口出现在主屏幕上,辅助设备上没有任何变化。我在这个测试中期待的是一个黑屏,在辅助屏幕上有一个按钮,主屏幕上会显示主窗口。

非常感谢理解我不理解的东西。

由于

1 个答案:

答案 0 :(得分:0)

我设法让它运转起来。起初并不明显,但我看到的是屏幕会瞬间点击,然后回到桌面或其下面的任何内容。

问题出在上面的代码示例中,它创建了第二个窗口 - 在代码片段中,我正在声明

NSWindow *win2 = [[NSWindow alloc] initWithContentRect:ss
                                                     styleMask:NSBorderlessWindowMask
                                                       backing:NSBackingStoreBuffered
                                                         defer:YES];

问题在于它是在本地声明的,而且我正在使用ARC,所以只要当前函数的执行结束,win2就会从内存中消失并从屏幕上移除。

通过在.h文件中放置一个实例变量

来解决这个问题
NSWindow *win2;

然后从alloc / init行中删除NSWindow。

虽然我认为我已经彻底阅读了文档,但我忘记的是,Apple提醒人们阅读基础文档,这样他们就不必不断重复自己了 - 深入研究windows等的概念,这些都是写在那里。

我现在在我的第二台显示器上有一个窗口 - 好吧,作为一个NSBorderlessWindowMask类型,我不能在它上面放置控件但是我可以添加一个NSImageView - 测试完成,现在进入该应用程序的下一阶段。