将NSView浮动在DVDPlayback框架使用的窗口上方

时间:2012-03-28 13:25:47

标签: macos cocoa nsview dvd

我正在尝试使用Mac OS X的DVDPlayback.framework编写一个简单的DVD播放器。我可以在一个窗口中播放DVD,但最终我希望它作为全屏应用程序运行。

在播放DVD时,我很难添加子视图来显示媒体控件(暂停/播放,进度滑块滚动电影,更改章节等)。

似乎如果我在DVD框架使用的窗口内创建一个子视图(NSView),它似乎总是落后于DVD内容,即使我告诉NSView处于最顶层。

这是简化的代码,它只是试图在窗口区域内创建一个白色的子视图:

(我在10.6和10.7上尝试了相同结果的代码)。

const BOOL PLAY_DVD = YES;

@interface ControlsView : NSView {
}
@end

@implementation ControlsView
- (void)drawRect:(NSRect)rect {
    [[NSColor whiteColor] set];
    NSRectFill(rect);
}
@end

@implementation AppDelegate

@synthesize window = _window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSView *view = self.window.contentView;

    if (PLAY_DVD) {
        NSLog(@"%@ Playing DVD video", [self class]);
        // Register error handler
        OSStatus err;

        err = DVDInitialize();
        if (err != noErr) {
            NSLog(@"DVDInitialise failed with error code %d", err);
            [NSApp terminate:self];
        }

        // Set window to be the main window
        err = DVDSetVideoWindowID([self.window windowNumber]);

        // Set the display...
        CGDirectDisplayID display = (CGDirectDisplayID) [[[[self.window screen] deviceDescription] valueForKey:@"NSScreenNumber"] intValue];
        Boolean isSupported;
        err = DVDSwitchToDisplay(display, &isSupported);

        // Set video bounds
        NSRect frame = [self.window frame];
        CGRect rect = CGRectMake(0, 0, frame.size.width, frame.size.height);
        err = DVDSetVideoCGBounds(&rect);

        FSRef ref;
        DVDOpenMediaFileWithURL([NSURL URLWithString:@"file:///Path/to/my/TestDVD/VIDEO_TS"]);
        DVDOpenMediaFile(&ref);

        DVDPlay();
    }

    // Attempt to add a subview to show the controls...
    ControlsView *controls = [[ControlsView alloc] initWithFrame:NSMakeRect(20, 20, 100, 50)];
    [view addSubview:controls positioned:NSWindowAbove relativeTo:nil];
}
@end

如果PLAY_DVD NO ,则会正确呈现子视图(我可以创建其他子视图并显示排序正确)。

如果PLAY_DVD YES ,则媒体会开始播放,但子视图永远不可见,因为它似乎总是落后于视频。

我能够找到的DVD播放的唯一例子是在第二个窗口中有控件,但对于全屏应用程序,我希望控件成为全屏视图的一部分并且褪色需要时进/出。

有谁知道如何做到最好?我的全屏控件是否必须位于一个单独的窗口中,该窗口漂浮在全屏窗口之上?我无法在同一个窗口中找到一个控件和DVD播放的例子。

提前感谢您的帮助!

0 个答案:

没有答案