gpt4 book ai didi

objective-c - NSPanel 没有收到 mousedragged 事件

转载 作者:搜寻专家 更新时间:2023-10-30 19:49:21 26 4
gpt4 key购买 nike

我有一个无边框的 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 中连续输出“dragged”(背景颜色将为绿色)。如果您随后切换到另一个应用程序,然后又回到移动面板应用程序,拖动将不会再输出任何内容。 (并且背景颜色将为红色,这是在 mousedown 事件处理程序中设置的)。

如果没有 NSNonactivatingPanelMask,它可以正常工作,但我的面板下方的窗口保持事件状态至关重要。如果有其他方法可以做到这一点,请分享。

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

最佳答案

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

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

如果你真正感兴趣的是在窗口移动时响应,这个问答可能会提供你所需要的。

How to receive notifications when moving Window by mouse?

关于objective-c - NSPanel 没有收到 mousedragged 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15431559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com