gpt4 book ai didi

cocoa - 如何接受鼠标点击一部分并让点击通过 NSWindow 的其余部分

转载 作者:行者123 更新时间:2023-12-03 17:13:14 26 4
gpt4 key购买 nike

我有一个子类 NSWindow 的代码,有一个可以缩放的动画 View ,我想在正确的位置单击时接受单击,如果在外部则拒绝(单击通过)。

下面的代码运行良好,只是窗口不允许点击。

- (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)您可以使窗口的一部分透明并点击将默认传递。

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

一种可能的解决方案可能是使用 Quartz Event Taps 。这个想法是让你的窗口忽略鼠标事件,但设置一个事件点击来查看登录 session 的所有事件。如果您想让正在通过您的窗口的事件实际上停止在您的窗口上,您可以手动处理它,然后丢弃它。您不会让事件继续传递到它原本会到达的应用程序。我预计这将是非常棘手的正确做法。例如,您不想拦截您前面的另一个应用程序窗口的事件。

如果可能的话,我建议您使用 Cocoa 支持的技术。我认为您只希望点击通过您的窗口,无论如何它都是透明的,否则用户如何知道他们正在点击什么?

关于cocoa - 如何接受鼠标点击一部分并让点击通过 NSWindow 的其余部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15182819/

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