2009-08-02 49 views
1

我想在我的可可应用程序中实现颜色选择器。 (是的,我知道NSColorPanel,我不太喜欢它,滚动我自己的一点是我认为我可以做得更好。)NSColorWell子类没有获取mouseMoved事件

下面是我的选取器当前状态的图片。

Custom viewness! http://ryanballantyne.name/forumstuff/color-picker-shot.jpg

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

我想让它可以通过它们的把手拖动颜色井。该行程的开始是当鼠标悬停在手柄上时,光标变为张开的手。可悲的是,I can't use a cursor rect for this because most of my views are rotated。因此,我必须使用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时,那个确实被调用,所以至少有一些事件正在接近我,而不是我想要的。

任何想法?谢谢!

+0

为什么不制作NSColorPicker子类?然后,您的选择器不仅可以添加到现有的颜色面板中,而不会丢弃其功能,但是如果您愿意,甚至可以将其作为插件导出,以便用户可以在任何应用程序中使用您的真棒颜色选择器。 – 2009-08-02 19:05:25

+0

我想过在未来的版本中这样做。首先,我需要向自己证明,我的想法是选择更好的选色器。 – 2009-08-03 00:32:19

回答

2

mouseEntered:和mouseExited:不直接跟踪输入/退出视图;他们跟踪进入/退出您在视图中建立的任何跟踪区域。相关的方法是-addTrackingRect:owner:userData:assumeInside:-removeTrackingRect:。只要通过[self bounds]作为第一个参数,如果你想跟踪你的整个视图。如果您的应用程序仅为10.5+,则应该使用NSTrackingArea,因为它直接支持仅在跟踪区域内获取鼠标移动事件。请记住,1)跟踪矩阵与光标矩阵具有相同的有点奇怪的行为w/r/t旋转视图,以及2)如果你的界限改变(不仅仅是你的框架),你可能需要重新定位,建立你的跟踪矩形,所以保存跟踪矩形的标签以后再删除它。