Cocoa 如何接受鼠标单击一部分,然后让鼠标单击窗口的其余部分

Cocoa 如何接受鼠标单击一部分,然后让鼠标单击窗口的其余部分,cocoa,nswindow,nsevent,Cocoa,Nswindow,Nsevent,下面是子类NSWindow的代码,有一个可以缩放的动画视图,我想在右点单击时接受单击,如果在外部,则拒绝(单击) 下面的代码运行良好,只是窗口不允许点击 - (void)mouseDragged:(NSEvent *)theEvent { if (allowDrag) { NSRect screenVisibleFrame = [[NSScreen mainScreen] visibleFrame]; NSRect windowFrame = [self frame];

下面是子类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;
    }
}
-(无效)鼠标标记:(n事件*)事件{
if(allowDrag){
NSRect screen visibleFrame=[[NSScreen main screen]visibleFrame];
NSRect windowFrame=[自帧];
NSPoint newOrigin=windowFrame.origin;
//获取鼠标在窗口坐标中的位置。
NSPoint currentLocation=[theEvent locationInWindow];
//使用新鼠标位置和旧鼠标位置之间的差异更新原点。
newOrigin.x+=(currentLocation.x-initialMouseLocation.x);
newOrigin.y+=(currentLocation.y-initialMouseLocation.y);
如果((newOrigin.y+windowFrame.size.height)>(screenVisibleFrame.origin.y+screenVisibleFrame.size.height)){
newOrigin.y=screenVisibleFrame.origin.y+(screenVisibleFrame.size.height-windowFrame.size.height);
}
//将窗口移动到新位置
[self-setFrameOrigin:newOrigin];
}
}
-(无效)鼠标向下移动:(n事件*)事件
{
屏幕分辨率=[[NSScreen mainScreen]帧];
initialMouseLocation=[TheEventLocationInWindow];
浮动比例=[[NSUserDefaults standardUserDefaults]floatForKey:@“widgetScale”]/100;
float pX=初始鼠标位置.x;
float pY=初始鼠标位置.y;
float fX=self.frame.size.width;
浮动fY=自身框架尺寸高度;
如果(pX>(fX*比例)/2和&pX(fY+fY*比例)/2){
allowDrag=是;
}否则{
allowDrag=否;
}
}

在Cocoa中,您有两个基本选择:1)您可以使用
[window setIgnoresMouseEvents:YES]
使整个窗口通过单击,或者2)您可以使部分窗口透明,默认情况下单击将通过

限制是窗口服务器决定将事件传递给哪个应用程序。在它将事件发送到您的应用程序后,无法让它将事件收回并发送到另一个应用程序

一个可能的解决方案可能是使用。这样做的目的是让窗口忽略鼠标事件,但设置一个事件点击,以查看登录会话的所有事件。如果你想让一个通过你的窗口的事件实际上在你的窗口停止,你可以手动处理它,然后丢弃它。你不能让事件继续到应用程序上,否则它将到达。我认为这将是非常棘手的事情。例如,您不希望截获位于您前面的另一个应用程序窗口的事件


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

在Cocoa中,你有两个基本选择:1)你可以通过
[window setignoresmousevents:YES]
让整个窗口通过点击,或者2)您可以使窗口的某些部分透明,默认情况下单击将通过

限制是窗口服务器决定将事件传递给哪个应用程序。在它将事件发送到您的应用程序后,无法让它将事件收回并发送到另一个应用程序

一个可能的解决方案可能是使用。这样做的目的是让窗口忽略鼠标事件,但设置一个事件点击,以查看登录会话的所有事件。如果你想让一个通过你的窗口的事件实际上在你的窗口停止,你可以手动处理它,然后丢弃它。你不能让事件继续到应用程序上,否则它将到达。我认为这将是非常棘手的事情。例如,您不希望截获位于您前面的另一个应用程序窗口的事件


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

请调用透明覆盖子窗口接受控制,并使主窗口-setIgnoresMouseEvents:YES按Ken指示


我在名为“Overlay”的应用程序中使用了这个技巧。

请调用一个透明的Overlay子窗口来接受控制,并使主窗口-setIgnoresMouseEvents:YES符合Ken的指示


我在名为“Overlay”的应用程序中使用了这个技巧。

不幸的是,没有任何东西能像我预期的那样工作。当我使用基本动画缩放窗口视图时,它会生成许多透明部分,但这些部分仍然接受鼠标单击,因为原始透明度与动画层无关。它还必须对应用商店友好,因此事件陷阱不好。我已经按原样提交了这个应用程序,如果我收到很多投诉,就会出现“bug”,如果我只是简单地将封闭窗口的大小调整为与缩放视图相同的大小,这可能是最好的选择。不管怎样,谢谢。我不知道在动画期间,但肯定在动画调整完成后,请尝试调用
-[NSWindow invalidateShadow]
。这将确保窗口服务器更新其窗口形状的概念。当我使用基本动画缩放窗口视图时,它会生成许多透明部分,但这些部分仍然接受鼠标单击,因为原始透明度与动画层无关。它还必须对应用商店友好,因此事件陷阱不好。我已经按原样提交了这个应用程序,如果我收到很多投诉,就会出现“bug”,如果我只是简单地将封闭窗口的大小调整为与缩放视图相同的大小,这可能是最好的选择。无论如何谢谢你。我不知道在动画片中,b