NSColorWell 子类未获取 mouseMoved 事件

发布于 2024-07-30 02:54:34 字数 1658 浏览 2 评论 0原文

我正在尝试在我的 Cocoa 应用程序中实现一个颜色选择器。 (是的,我知道 NSColorPanel。我不太喜欢它。滚动我自己的重点是我认为我可以做得更好。)

这是我的选择器当前状态的图片。

自定义观看度!
(来源:ryanballantyne.name

井围绕色轮的是 NSColorWell 子类。 它们以编程方式实例化,并通过调用色轮类上的 addSubView 添加到色轮视图(NSView 子类)。

我想让你可以通过它们的手柄拖动颜色井。 该旅程的开始是,当鼠标悬停在手柄上时,光标变为张开的手。 遗憾的是,我无法使用光标为矩形,因为我的大多数视图都旋转了。 因此,我必须使用 mouseMoved 事件并自己进行点击检测。

这是我试图使其工作的鼠标事件代码:

- (void)mouseMoved:(NSEvent*)event
{
    NSLog(@"I am over here!\n");

    [super mouseMoved:event];

    NSPoint eventPoint = [self convertPoint:[event locationInWindow] fromView:nil];
    BOOL isInHandle = [grabHandle containsPoint:eventPoint];
    if (isInHandle && [NSCursor currentCursor] != [NSCursor openHandCursor])  {
        [[NSCursor openHandCursor] push];
    }
    else if (!isInHandle)  [NSCursor pop];
}

- (void)mouseEntered:(NSEvent*)event
{
    [[self window] setAcceptsMouseMovedEvents:YES];
}
- (void)mouseExited:(NSEvent*)event
{
    [[self window] setAcceptsMouseMovedEvents:NO];
    [NSCursor pop];
}

- (BOOL)acceptsFirstResponder
{
    return YES;
}
- (BOOL)resignFirstResponder
{
    return YES;
}

我发现我的 mouseMoved 方法从未被调用。 进入和退出也是如此。 然而,当我实现 mouseDown 时,那个确实会被调用,所以至少有一些事件发生在我身上,只是不是我想要的事件。

有任何想法吗? 谢谢!

I'm trying to implement a color picker in my Cocoa app. (Yes, I know about NSColorPanel. I don't like it very much. The point of rolling my own is that I think I can do better.)

Here's a picture of the current state of my picker.

Custom viewness!
(source: ryanballantyne.name)

The wells surrounding the color wheel are NSColorWell subclasses. They are instantiated programmatically and added to the color wheel view (an NSView subclass) by calling addSubView on the color wheel class.

I want to make it so that you can drag the color wells around by their grab handles. The start of that journey is making the cursor change to an open hand when the mouse hovers over the handles. Sadly, I can't use a cursor rect for this because most of my views are rotated. I must therefore use mouseMoved events and do the hit detection myself.

Here's the mouse event code I'm trying to make work:

- (void)mouseMoved:(NSEvent*)event
{
    NSLog(@"I am over here!\n");

    [super mouseMoved:event];

    NSPoint eventPoint = [self convertPoint:[event locationInWindow] fromView:nil];
    BOOL isInHandle = [grabHandle containsPoint:eventPoint];
    if (isInHandle && [NSCursor currentCursor] != [NSCursor openHandCursor])  {
        [[NSCursor openHandCursor] push];
    }
    else if (!isInHandle)  [NSCursor pop];
}

- (void)mouseEntered:(NSEvent*)event
{
    [[self window] setAcceptsMouseMovedEvents:YES];
}
- (void)mouseExited:(NSEvent*)event
{
    [[self window] setAcceptsMouseMovedEvents:NO];
    [NSCursor pop];
}

- (BOOL)acceptsFirstResponder
{
    return YES;
}
- (BOOL)resignFirstResponder
{
    return YES;
}

I find that my mouseMoved method is never called. Ditto for entered and exited. However, when I implement mouseDown, that one does get called, so at least some events are getting to me, just not the ones I want.

Any ideas? Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我是有多爱你 2024-08-06 02:54:34

mouseEntered: 和 mouseExited: 不直接跟踪进入/退出视图; 它们会跟踪进入/退出您在视图中建立的任何跟踪区域。 相关方法是 -addTrackingRect:owner:userData:assumeInside:-removeTrackingRect:。 如果您希望跟踪整个视图,只需将 [selfbounds] 作为第一个参数即可。 如果您的应用程序仅 10.5+,您可能应该使用 NSTrackingArea,因为它直接支持仅在跟踪区域内获取鼠标移动事件。

请记住,1)跟踪矩形与带有旋转视图的光标矩形具有相同的有点奇怪的行为,2)如果您的边界发生变化(不仅仅是您的框架),您可能需要重新建立您的跟踪矩形,因此请保存跟踪矩形的标签以便稍后将其删除。

mouseEntered: and mouseExited: don't track entering/exiting your view directly; they track entering/exiting any tracking areas you've established in your view. The relevant methods are -addTrackingRect:owner:userData:assumeInside: and -removeTrackingRect:. Just pass [self bounds] for the first parameter if you want your whole view to be tracked. If your app is 10.5+ only, you should probably use NSTrackingArea instead as it directly supports getting mouse-moved events only inside the tracking area.

Keep in mind that 1) tracking rects have the same somewhat odd behavior as cursor rects w/r/t rotated views, and 2) if your bounds change (not merely your frame) you'll probably need to re-establish your tracking rect, so save the tracking rect's tag to remove it later.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文