2013-02-21 3 views
3

프로그래밍에 익숙하지 않습니다. objective-c (및 stackoverflow)입니다. 나는 아주 천천히 배우고 앞으로 나아가고있다.) 그러나 나는 구글이 해결할 수없는 문제에 부딪쳤다. 하나의 창과 NSview가 있고 좌표를 내 뷰로 가져와야하는 마우스 이벤트를 추가했지만 그렇지 않습니다. 재미있는 것은이다 : 그것은 그릴 때 내 응용 프로그램 윈도우의 윈도우 버튼 위로 마우스를 이동 ... 나는 계속하는 방법을 모른다마우스 이벤트를 통해 NSView를 그립니다.

- (void)drawRect:(NSRect)dirtyRect { 
    NSPoint imagePos = NSMakePoint(0, 0); 
    NSImage *aImage = [NSImage imageNamed:@"mw_bg01.png"]; 
    [aImage dissolveToPoint:imagePos fraction:1.0]; 
} 
- (void)mouseDown:(NSEvent*)theEvent;{ 
    mouseLoc = [NSEvent mouseLocation]; 
    mousePosX = mouseLoc.x;mousePosY = mouseLoc.y; 
    NSString* mouseString = [NSString stringWithFormat:@"%d", mousePosX]; 
    NSPoint textPoint = NSMakePoint(5, 5); 
    NSMutableDictionary *textAttrib = [[NSMutableDictionary alloc] init]; 
    [textAttrib setObject:[NSFont fontWithName:@"Helvetica Light" size:10] 
       forKey:NSFontAttributeName]; 
    [textAttrib setObject:[NSColor grayColor] forKey:NSForegroundColorAttributeName]; 
    [mouseString drawAtPoint:textPoint withAttributes:textAttrib]; 
} 

, 어떤 제안? 감사!

+0

이 코드는 어디에 있습니까? mouseDown 핸들러를 작성한 것 같습니다. 이 코드의 위치에 따라 (예 : 응용 프로그램과보기 또는 기타 등등) 단순히 버튼의 대리자가 될 수 있지만보기는 어디서나 발생할 수 있습니다. – podperson

+0

보기에 있습니다. mouseDown 핸들러를 사용하여 내 뷰에서 드로잉을 테스트하고 mousemove가 호출되지 않도록했습니다. – fw2601

+0

그리고 : 버튼이 전혀 없습니다. 3 osx 창 버튼을 의미했습니다 ... – fw2601

답변

5

-mouseDown: 방법으로 그리기를해서는 안됩니다. 오히려 -drawRect: (또는 -drawRect:에서 전화하는 방법)에서 모든 그림을 만들어야합니다. 다음과 같이 시도하십시오.

@interface MyView() 
    @property NSPoint lastMousePoint; 
@end 

@implementation MyView 

- (void)drawLastMousePoint 
{ 
    NSString *mouseString = NSStringFromPoint(self.lastMousePoint); 
    NSPoint textPoint = NSMakePoint(5, 5); 
    NSMutableDictionary *textAttrib = [[NSMutableDictionary alloc] init]; 
    [textAttrib setObject:[NSFont fontWithName:@"Helvetica Light" size:10] 
       forKey:NSFontAttributeName]; 
    [textAttrib setObject:[NSColor grayColor] forKey:NSForegroundColorAttributeName]; 
    [mouseString drawAtPoint:textPoint withAttributes:textAttrib]; 
} 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    NSPoint imagePos = NSMakePoint(0, 0); 
    NSImage *aImage = [NSImage imageNamed:@"mw_bg01.png"]; 
    [aImage dissolveToPoint:imagePos fraction:1.0]; 

    [self drawLastMousePoint]; 
} 

- (void)mouseDown:(NSEvent*)theEvent; 
{ 
    self.lastMousePoint = [theEvent locationInWindow]; 
    [self setNeedsDisplay:YES]; 
} 

@end 

마우스 다운 이벤트가 발생하면 마우스 위치 만 저장하면됩니다. 그림은 -drawRect: 방법으로 전화하는 -drawLastMousePoint에서 이루어집니다. 마우스를 클릭 할 때마다 다시 그리기가 필요하다는 것을 알기 때문에 -setNeedsDisplay:을 호출하여 뷰를 다시 그려야한다고 알립니다. 다시 그리기가 즉시 발생하는 것이 아니라 다음에 실행 루프를 통해 발생합니다. 다른 말로하면, "어이, 뭔가 바뀌었고 내 시야의 내용을 다시 그려야 해. 가능한 한 빨리 -drawRect:에게 전화 해주세요."

기타 참고 사항 : +[NSEvent mouseLocation]은 실제로 외부의 현재 마우스 위치를 얻기 위해 설계된 것으로, 이벤트 스트림은입니다. 일반적으로 -mouseDown: 메서드에서 메서드에 대한 인수로 NSEvent에 전달 된 -locationInWindow을 호출합니다. 로컬/뷰 좌표로 변환해야하는 경우 [self convertPoint:[theEvent locationInWindow] fromView:nil];을 호출해야합니다.

+0

고마워요. 나는 많이 배울 필요가있다;) 한 가지 : setNeedsDisplay를 호출하면 mw_bg01.png도 그려지 는가? 느린 거지, 그치? – fw2601

+0

우리는 모든 시점에서 새로운 브랜드였습니다. :) 예, PNG를 다시 그립니다. 속도가 느려지는 것을 사전에 걱정할 필요는 없으며 실제로 속도가 느려지는지 알아보기 위해 테스트해야하며 실제로 작동하는 방식을 변경하는 데만 시간을 할애해야합니다. 일반적으로 정적 PNG를 화면에 그리는 것은 매우 빠릅니다. 성능을 향상시킬 필요가 있다면 다음과 같은 몇 가지 옵션이 있습니다 : 뷰의 일부만 다시 그리기 ('-setNeedsDisplayInRect :'참조), 현재 뷰의 하위 뷰인 다른 뷰에서 마우스 포인트를 그리는 핸들, CALayers 등을 사용하십시오. –

+0

@ fw2601 실제로 작동하지 않습니까? 왜 그 대답을 받아 들일 수 없었습니까? –

관련 문제