2009-08-02 3 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 하위 클래스를 만들지 않습니까? 그런 다음 피커가 기능을 버리지 않고 기존의 색상 패널에 추가 할뿐만 아니라 원하는 경우 플러그인으로 내보낼 수도 있으므로 사용자가 모든 응용 프로그램에서 멋진 색상 선택기를 사용할 수 있습니다. –

+0

나는 미래 버전에서 그렇게하려고 생각 해왔다. 우선 더 나은 색상 선택기에 대한 아이디어가 나올 수 있음을 스스로 입증해야합니다. –

답변

2

mouseEntered : and mouseExited : 직접 뷰를 시작하거나 종료하는 것을 추적하지 않습니다. 그들은 당신이보기에 설정 한 모든 추적 영역을 입력/종료 추적합니다. 관련 방법은 -addTrackingRect:owner:userData:assumeInside:-removeTrackingRect:입니다. 전체보기를 추적하려면 첫 번째 매개 변수에 [self bounds]을 전달하십시오. 앱이 10.5 이상인 경우 추적 영역 내에서만 마우스 이동 이벤트를 가져 오는 것을 직접 지원하므로 NSTrackingArea를 대신 사용해야합니다.

1) 추적 표시 줄은 회전 된보기가있는 커서 rects와 다소 이상한 동작을하며 2) 테두리가 변경된 경우 (단순히 프레임이 아닌 경우) 추적 표시 줄을 설정하십시오. 따라서 추적 표시 줄의 태그를 저장하여 나중에 제거하십시오.

+0

NSTrackingArea에 대한 정보를 제공해 주셔서 감사합니다. 나는 그것을 확실히 체크 할 것이다. –

관련 문제