2012-04-01 2 views
2

클릭 한 상태에서 마우스를 눌렀을 때를 감지 할 수 있습니다. 이것은 내가 가지고있는 것이지만 클릭 수 대신 마우스를 누르고있는 것을 감지 할 수 있기를 원합니다.마우스가 눌려있는 것을 감지했습니다.

-(void)mouseDown:(NSEvent *)event; 
{ 
    //instead of clickCount I want my if statement to be 
    // if the mouse is being held down. 
    if ([event clickCount] < 1) 
    { 

    } 
    else if ([event clickCount] > 1) 
    { 

    } 
} 
+0

사용자가 클릭 할 때이 이벤트가 발생하지 않습니까? – millimoose

+0

'mouseDown' 이벤트가 발생했을 때, 컴퓨터는 미래에 사용자가 마우스 버튼을 계속 누르고 있는지를 알 수 없을 정도로 충분히 멀리 볼 수 없습니다. 일반적으로 끌어서 놓기를 구현하려면'mouseDown' 이벤트에서 끌고있는 것을 파악하고, Kristian 윤곽선과 같은 'mouseUp' 이벤트를 보면서 항목이 떨어지는 위치를 파악하고'mouseMown ' '(또는 그것이 무엇이든간에) 이벤트 (어떤 것이 드래그되고 있는지를보기 위해'mouseIsHeldDown'을 체크하는) 이벤트를 호출합니다. –

+0

또 다른 옵션은'mouseDown'에서 어떤 종류의 지연 콜백을 설정하는 것입니다. 마우스를 놓으면 콜백을 지우고 콜백이 발생하면 마우스 버튼을 적어도 그 시간 동안 누르고 있습니다.이것은 키 반복이 작동하는 것과 유사합니다. –

답변

3

아마도 일정 기간 동안 마우스를 누르고 있는지 여부를 감지하고 싶을 것입니다. 이것은 매우 간단합니다. 타이머 만 있으면됩니다.

mouseDown:에서는 선택한 기간 후에 타이머가 시작됩니다. 다음 마우스를 알고, 타이머 화재의 경우

- (void)mouseUp: (NSEvent *)theEvent { 
    [mouseTimer invalidate]; 
    mouseTimer = nil; 
} 

: 당신은 또한 mouseUp:에서 mouseUp:

- (void)mouseDown: (NSEvent *)theEvent { 
    mouseTimer = [NSTimer scheduledTimerWithTimeInterval:mouseHeldDelay 
                target:self 
               selector:@selector(mouseWasHeld:) 
               userInfo:theEvent 
               repeats:NO]; 
} 

에 참조하기 때문에 당신은 파괴, 바르에이 붙어 타이머를 필요 버튼을 지정한 기간 동안 누르고 있으면 원하는 행동을 취할 수 있습니다.

- (void)mouseWasHeld: (NSTimer *)tim { 
    NSEvent * mouseDownEvent = [tim userInfo]; 
    mouseTimer = nil; 
    // etc. 
} 
+0

사용자가 무언가를 클릭했지만 버튼을 계속 누르고 있지 않은 경우 발생해야하는 작업을 처리하는 'mouseUp' 처리기가 있어야합니다. 또한'mouseUp :'이 입력 된 후'mouseTimer invalidate; '가 호출되기 전에 타이머가 작동하지 않을 것이라는 보장이 있습니까? –

+0

@ 마이크 : 1) 물론; 나는 OP에 연습으로 그 것을 남겨 둡니다. 2) 타이머와 이벤트 핸들링 모두 실행 루프에 대기중인 입력이므로 문제가되지 않아야합니다. 그렇지 않으면 그 보장을 할 수있는 방법을 생각할 수 없습니다. –

+0

일단 일정 시간 동안 마우스를 누른 채 mouseWasHeld라고 말하면 EXC_BAD_ACCESS를 얻습니다. mouseWasHeld가 호출 될 때만 마우스를 놓는 순간 발생합니다. 내가 뭘 잘못했는지 알아? –

0

지금까지 내가 사용자가 처음 누르지 요소를 클릭 할 때 mouseDown 만 해고 기억한다.

문제에 대한 해결책은 다음처럼 .H에 BOOL을 정의하는 것입니다 :

당신의 mouseDown에서 다음
bool mouseIsHeldDown = false; 

:

mouseIsHeldDown = true; 

그리고 당신의와 mouseUp의 :

mouseIsHeldDown = false; 

그런 다음 코드에서 mouseIsHeldDown = true를 확인할 수 있습니다.

희망 사항이 문제를 해결합니다.

9

OS X 10.6부터는 다음과 같이 사용할 수 있습니다. NSEvent의 어디에서나 pressedMouseButtons 방법 :

NSUInteger mouseButtonMask = [NSEvent pressedMouseButtons]; 
BOOL leftMouseButtonDown = (mouseButtonMask & (1 << 0)) != 0; 
BOOL rightMouseButtonDown = (mouseButtonMask & (1 << 1)) != 0; 

방법은 현재 아래 마스크로 마우스 버튼의 인덱스를 반환합니다. 1 << 0은 마우스 왼쪽 버튼에, 1 << 1은 오른쪽 마우스 버튼에 해당하고 1 << n, n> = 2는 다른 마우스 버튼에 해당합니다.

이걸로 mouseDown:, mouseDragged: 또는 mouseUp: 이벤트를 잡을 필요가 없습니다.

관련 문제