我有一个无边框的 NSPanel,当我第一次启动它并且它有焦点时,我可以拖动它并且正确触发 mousedragged 方法,但是当我将焦点切换到另一个应用程序然后返回到 NSPanel(使用 NSNonactivatingPanelMask 设置)我不再收到鼠标拖动事件。
我仍然收到 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 中连续输出“dragged”(背景颜色为绿色)。如果您然后切换到另一个应用程序,然后再返回到移动面板应用程序,则拖动将不再输出任何内容。(并且背景颜色将是红色,这是在 mousedown 事件处理程序中设置的)。
如果没有 NSNonactivatingPanelMask,它可以正常工作,但我的面板下方的窗口保持活动状态至关重要。如果有其他方法可以做到这一点,请分享。
我还注意到一件事,如果你双击面板(快速),然后拖动,它会变成绿色(所以 mousedragged: 被调用),但它没有移动......不知道该怎么想。