2014-04-26 2 views
0

내가 이해할 수없는 일에, C++에서 NSResponder 같은 클래스를 구현하기 위해 노력하고있어이 있습니다 :첫 번째 응답자가 아닌 NSButton을 클릭 할 수있는 이유는 무엇입니까?

모든 키보드/예를 들어 NSTextField있는 현재의 경우, 그래서 마우스 상호 작용은 첫 번째 응답자로 전송됩니다 첫 번째 응답자, 동일한보기의 다른 NSButton이 클릭 된 것을 어떻게 알 수 있습니까? 텍스트 필드가 마우스 클릭을 원하지 않으면 슈퍼 뷰에 텍스트 필드를 보내고 슈퍼 뷰는 뷰 컨트롤러로 텍스트 필드를 보냅니다. 따라서 마우스 클릭 이벤트는 결코 버튼에 도달하지 않습니다.

이것은 꽤 분명하지만 나는 그 순간에 내 머리를 감쌀 수 없습니다.

답변

3

모든 키보드/마우스 상호 작용은 첫 번째로 반응

이 잘못 전송됩니다. 부터 Cocoa Event Handling Guide :

...는 NSResponder에 메시지 등 mouseDown에서 사용자 동작과 관련된 NSView의 객체 에 대부분의 이벤트를 전달 창 개체 : 또는를 keyDown :. ...

이벤트 메시지를 수신하는 개체는 이벤트 유형에 따라 약간 다릅니다. 마우스 및 타블렛 이벤트의 경우 NSWindow 객체는 버튼을 사용자가 마우스 또는 스타일러스 키를 누른 뷰에 전달합니다. 대부분의 키 이벤트를 키 윈도우의 첫 번째 응답자에게 전달합니다.

마우스 및 키 이벤트 경로의 이러한 구분은 해당 이벤트 유형에 관련된 관련 섹션에서 반복됩니다.

클릭 한 것은 버튼이 클릭 되었기 때문에 "알았"습니다. 창은 -[NSView hitTest:] 방법을 사용하여 마우스 커서 아래에 있던 것을 찾습니다.

+0

마우스가 버튼 밖으로 움직이는 경우, 마우스 이벤트가 전송되지 않으면 마우스가 더 이상 존재하지 않는다는 것을 어떻게 알 수 있습니까? 예를 들어 마우스를 움직이면 이미지가 마우스 오버 이미지로 바뀌고 버튼이 일반 이미지로 다시 바뀌어야합니까? – levidhuyvetter

+0

먼저, 버튼이'-mouseDown :'구현에서 내부 이벤트 루프를 시작합니다. 그래서, 마우스 업까지 * 모든 이벤트를 가져옵니다. 그러나 그렇지 않은 경우에도 링크 된 동일한 문서에서 다음과 같이 말합니다. "마우스 드래그 및 마우스 업 이벤트는 일반적으로 가장 최근의 마우스 다운 이벤트를 수신 한 동일한보기로 전송됩니다." –

+0

나는 당신의 대답을 몇 번 읽었으며 당신이 만든 구별을 이해하는 데 잠시 걸렸으므로 미래의 검색을 위해 여기서는 흑백으로되어있다. 1) 마우스 클릭에 대해 마우스 아래 물건이 이벤트를 받는다. 메시지, 예. NSButton. 2) 키보드의 (대부분의) '키 누름'의 경우 창 첫 번째 응답자가 이벤트 메시지를 수신합니다. – 7stud

관련 문제