我有一个子类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;
}
}
答案 0 :(得分:1)
在Cocoa中,您有两个基本选择:1)您可以通过[window setIgnoresMouseEvents:YES]
使整个窗口通过点击,或者2)您可以使窗口的某些部分透明,默认情况下点击将会通过。 / p>
限制是窗口服务器决定将事件传递给哪一个应用程序。在将活动发布到您的应用之后,无法让活动恢复并将其发送到其他应用。
一种可能的解决方案可能是使用Quartz Event Taps。我们的想法是让您的窗口忽略鼠标事件,但设置一个事件点击,它将查看登录会话的所有事件。如果你想让一个正在通过你的窗口的事件实际停在你的窗口,你手动处理它然后丢弃它。您不会让事件继续发送到原本应该达到的应用程序。我希望这样做是非常棘手的。例如,您不希望拦截在您面前的另一个应用程序窗口的事件。
如果可能,我建议您使用Cocoa支持的技术。我认为你只希望点击进入你的窗口,无论如何它都是透明的,否则用户将如何知道他们点击了什么?
答案 1 :(得分:0)
请调用透明覆盖CHILD WINDOW以接受控制并使主窗口-setIgnoresMouseEvents:YES为Ken指示。
我在名为“Overlay”的应用中使用了这个技巧。