我正在尝试将原生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文件中。
在运行时,所有发生的情况是主窗口出现在主屏幕上,辅助设备上没有任何变化。我在这个测试中期待的是一个黑屏,在辅助屏幕上有一个按钮,主屏幕上会显示主窗口。
非常感谢理解我不理解的东西。
由于
答案 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 - 测试完成,现在进入该应用程序的下一阶段。