如何接受一个部分的鼠标点击,并让鼠标点击NSWindow的其余部分



我有一个子类NSWindow下面的代码,有一个可以缩放的动画视图,我想接受点击,当它被点击在正确的位置和拒绝(点击通过),如果它是在外面。

下面的代码工作得很好,只是窗口不允许点击通过。

- (void)mouseDragged:(NSEvent *)theEvent {
  if (allowDrag) {
    NSRect screenVisibleFrame = [[NSScreen mainScreen] visibleFrame];
    NSRect windowFrame = [self frame];
    NSPoint newOrigin = windowFrame.origin;
    // Get the mouse location in window coordinates.
    NSPoint currentLocation = [theEvent locationInWindow];
    // Update the origin with the difference between the new mouse location and the old mouse location.
    newOrigin.x += (currentLocation.x - initialMouseLocation.x);
    newOrigin.y += (currentLocation.y - initialMouseLocation.y);
    if ((newOrigin.y + windowFrame.size.height) > (screenVisibleFrame.origin.y + screenVisibleFrame.size.height)) {
        newOrigin.y = screenVisibleFrame.origin.y + (screenVisibleFrame.size.height - windowFrame.size.height);
    }
    // Move the window to the new location
    [self setFrameOrigin:newOrigin];
  }
}

- (void)mouseDown:(NSEvent *)theEvent
{
    screenResolution = [[NSScreen mainScreen] frame];
   initialMouseLocation = [theEvent locationInWindow];
    float scale = [[NSUserDefaults standardUserDefaults] floatForKey:@"widgetScale"]/100;
    float pX = initialMouseLocation.x;
    float pY = initialMouseLocation.y;
    float fX = self.frame.size.width;
    float fY = self.frame.size.height;
    if (pX>(fX-fX*scale)/2 && pX<(fX+fX*scale)/2 && pY>(fY+fY*scale)/2) {
        allowDrag = YES;
    } else {
        allowDrag = NO;
    }
}

在Cocoa中,你有两个基本的选择:1)你可以让整个窗口通过[window setIgnoresMouseEvents:YES],或者2)你可以让你的窗口的一部分透明,点击将默认通过。

限制是窗口服务器决定将事件传递给哪个应用程序一次。在它把事件传递给你的应用程序之后,没有办法让它把事件拿回来并传递给另一个应用程序。

一个可能的解决方案可能是使用石英事件水龙头。其思想是让窗口忽略鼠标事件,但设置一个事件点击,将看到登录会话的所有事件。如果你想让一个事件通过你的窗口,实际上停止在你的窗口,你手动处理它,然后丢弃它。你不会让事件继续到它本来会到达的应用。我预计这将是非常棘手的做好。例如,你不想拦截位于你前面的另一个应用程序窗口的事件。

如果可能的话,我建议您使用cocoa支持的技术。我认为你只希望点击通过透明的窗口,否则用户怎么知道他们点击的是什么?

请调用一个透明的叠加子窗口来接受控件,并使主窗口-setIgnoresMouseEvents:YES。

我在我的应用程序"Overlay"上使用了这个技巧

相关内容

  • 没有找到相关文章

最新更新