문제

드래그 앤 드롭이 완료되지 않은 후 MouseUp 이벤트가 프레임 워크에 의해 무시되고 무시되지 않도록하는 쉬운 방법이 있습니까?

하나를 설명하는 블로그 게시물을 찾았습니다.매커니즘 이지만, 상태 플래그, MouseMove 이벤트, 수동 "마우스 떠나기"확인 등을 포함하여 많은 수동 부기 작업이 필요합니다.이 모든 것을 피할 수 있다면 구현할 필요가 없습니다. p>

도움이 되었습니까?

해결책

최근에 내 프로젝트에 끌어서 놓기 기능을 추가하고 싶었는데이 문제가 발생하지 않았지만 흥미로 웠고에 설명 된 것보다 더 나은 방법을 찾을 수 있는지 확인하고 싶었습니다. 링크 한 페이지. 당신이하고 싶은 모든 일을 명확하게 이해했으면 좋겠습니다. 전반적으로 훨씬 더 우아하고 단순한 방식으로 문제를 해결하는 데 성공했다고 생각합니다.

간단히 말씀 드리 자면, 이와 같은 문제의 경우 코드를 제공하면 사용자가하려는 작업을 정확히 확인할 수 있습니다. 내 솔루션에서 귀하의 코드에 대해 몇 가지 가정했기 때문에이 말을합니다 ... 그래서 꽤 비슷하길 바랍니다.

다음은 아래에서 설명 할 코드입니다. 라코 디스

대부분의 디자이너 코드는 생략했지만 이벤트 처리기 링크 업 코드를 포함하여 무엇이 링크되었는지 확인할 수 있습니다. 내 예에서는 LabelDrag와 LabelDrop 레이블 사이에서 드래그 / 드롭이 발생합니다.

내 솔루션의 주요 부분은 QueryContinueDrag 이벤트를 사용하는 것입니다. 이 이벤트는 해당 컨트롤에서 DoDragDrop이 호출 된 후 키보드 또는 마우스 상태가 변경 될 때 발생합니다. 이미이 작업을 수행하고있을 수 있지만 양식과 관련된 메서드가 아니라 소스 인 컨트롤의 DoDragDrop 메서드를 호출하는 것이 매우 중요합니다. 그렇지 않으면 QueryContinueDrag가 실행되지 않습니다!

한 가지 주목할 점은 드롭 컨트롤 에서 마우스를 놓으면 QueryContinueDrag가 실제로 실행된다는 것입니다. 따라서이를 허용하는지 확인해야합니다. 이것은 마우스 위치 (전역 Control.MousePosition 속성으로 검색)가 LabelDrop 컨트롤 사각형 내부에 있는지 확인하여 처리됩니다. 또한 Control.MousePosition이 화면 상대 위치를 반환하므로 PointToClient를 사용하여 MousePosition을 클라이언트 창에 상대적인 포인트로 변환해야합니다.

따라서 마우스가 드롭 컨트롤 위에 있지 않고 마우스 버튼이 이제 위로 있는지 확인하여 LabelDrag 컨트롤에 대한 MouseUp 이벤트를 효과적으로 캡처했습니다! :) 이제 여기서 원하는 모든 처리를 수행 할 수 있지만 MouseUp 이벤트 핸들러에서 사용중인 코드가 이미있는 경우 효율적이지 않습니다. 따라서 여기에서 MouseUp 이벤트를 호출하여 필요한 매개 변수를 전달하면 MouseUp 핸들러가 차이를 알 수 없습니다.

참고로, 필자의 예에서 MouseDown 이벤트 핸들러 내에서 DoDragDrop을 호출하므로이 코드는 실제로 직접 MouseUp 이벤트를 발생시키지 않아야 합니다. 나는 그것이 가능하다는 것을 보여주기 위해 그 코드를 거기에 넣었습니다.

도움이되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top