NSPanel没有收到mousedragged事件

时间:2013-03-15 11:43:05

标签: objective-c xcode cocoa draggable nswindow

我有一个无边界NSPanel,当我第一次启动它并且它有焦点时我可以拖动它并且mousedragged方法被正确触发,但是当我将焦点切换到另一个应用程序然后返回到NSPanel(设置为NSNonactivatingPanelMask)我不再收到mousedragged事件。

我仍然收到mouseup和mousedown事件,所以我不知道为什么没有执行mousedragged事件。

有什么想法吗?

以下是初始化的方式:

   _panel  = [[MyPanel alloc] initWithContentRect:frame
              styleMask:NSBorderlessWindowMask | NSNonactivatingPanelMask
              backing:NSBackingStoreBuffered
              defer:NO];

我也尝试将所有这些方法添加到我的面板类中:

- (BOOL)canBecomeKeyWindow {
    return YES;
}

- (BOOL)canBecomeMainWindow
{
    return YES;
}

- (BOOL)canBecomeFirstResponder {
    return YES;
}

- (BOOL)acceptsFirstResponder
{
    return YES;
}

- (BOOL)acceptsFirstMouse
{
    return YES;
}

然后让鼠标成为第一个响应者(它仍然收到):

- (void)mouseDown:(NSEvent *)theEvent
{
    [self makeFirstResponder:self];
    [self makeKeyWindow];
    [self setBackgroundColor:[NSColor redColor]];
    [self display];
}

mousedragged只包含这个:

- (void)mouseDragged:(NSEvent *)theEvent
{
    [self setBackgroundColor:[NSColor greenColor]];
    [self display];
    NSLog(@"dragged");
}

我不希望窗口获得焦点。 (焦点应保留在下面的第三方应用程序中。)

更新:我添加了一个示例项目,请点击此处下载:http://users.telenet.be/prullen/MovingPanel.zip

正如您将看到的,当您第一次运行应用程序并拖动它时,将在console.log中连续输出“拖动”(并且背景颜色将为绿色)。如果您随后切换到另一个应用程序然后返回移动面板应用程序,则拖动将不再输出任何内容。 (并且背景颜色将为红色,在mousedown事件处理程序中设置)。

如果没有NSNonactivatingPanelMask,它可以正常工作,但是我的面板下面的窗口保持活动状态至关重要。如果还有其他方法可以实现这一目标,请分享。

有一件事我也注意到,如果你双击面板(快速),然后拖动,它会变成绿色(所以mousedragged:正在被调用),但是它没有移动......不知道该怎么想那个。

1 个答案:

答案 0 :(得分:0)

我也注意到,如果我这样做[self setMovableByWindowBackground:NO];那么它也会正常工作。我打赌setMovableByWindowBackground的工作方式是干扰被调用的mouseDragged。它可能是一个被调用的错误。

我猜一种可能的解决方案是实现自己的窗口拖动。

如果您真正感兴趣的是在窗口移动时做出响应,那么这个问题和答案可能会提供您所需要的内容。

How to receive notifications when moving Window by mouse?