2009-04-21 2 views
1

C++/CLI에서 사용자 정의 컨트롤 (Forms.Control의 직계 하위 요소)을 작성하여 대부분의 처리와 페인팅 전체를 별도의 legacy-ish MFC 컨트롤로 오프로드합니다. 이 컨트롤을 C# 응용 프로그램에 래핑합니다. 응용 프로그램에서 같은 양식에있는 UserControl에서 C++/CLI 컨트롤로 항목을 드래그 할 수 있어야합니다.내 사용자 지정 컨트롤이 끌어서 놓기 이벤트를받지 못하는 이유는 무엇입니까?

어떤 이유에서든 내 사용자 지정 컨트롤에 AllowDrop을 true로 설정 했음에도 불구하고 끌어서 놓기 이벤트가 수신되지 않습니다. (나는 AllowDrop이 런타임에 true인지 확인했습니다.) 콜백이 호출되지 않기 때문에 DragEventArgs를 검사/조작 할 수있는 기회를 얻지 못했습니다.

드래그 앤 드롭이 정상적으로 작동하는지 확인했습니다. 예를 들어, 사용자 정의 컨트롤을 Panel로 바꾼다면 dragdrop 콜백을 사용할 수 있습니다.

끌어다 놓기 콜백을 지원하기 위해 컨트롤에 구현해야하는 추가 사항이 있습니까? 컨트롤이 마우스 오버로 드래그 작업의 대상이되어야 함을 시스템이 인식하도록 처리해야하는 미묘한 무언가가 있습니까?

참고 :

그림을 할 것입니다 MFC 컨트롤이 나에게 아직 사용할 수없는, 그래서 난 그냥에 페인트하려고 해요 (OnPaintBackground를 통해) 간단한 그라데이션 배경 그림하고 있습니다. 또한 OnPaint에 작은 그라디언트 사각형을 페인팅합니다.

사용자 지정 컨트롤의 핸들을 디자이너/생성자 코드를 통해 만들고 OnHandleCreated 재정의를 통해 핸들을 만든 후에 AllowDrop = true를 설정해 보았습니다. 행동에 차이가 없습니다.

끌기 커서는 사용자 지정 컨트롤 위에있는 "끌기 없음"커서에서 변경되지 않습니다.

UserControl 하위 컨트롤 MouseDown 이벤트에 대한 이벤트 처리기에서 this.DoDragDrop()을 호출합니다.

DragDrop은 사용자 정의 컨트롤과 동일한 어셈블리에서 C#으로 만든 다른 사용자 정의 컨트롤로 작동하는 것처럼 보입니다. 콜백을 잘 캡처합니다. 내 C++/CLI 컨트롤 만 볼 수 없습니다. initializecomponent goo는 부적절합니다. 나는 그것을 아무 변화없이 모두 언급 할 수있다.

답변

2

나는 내 실수를 알아 냈으므로 다른 누군가가 비슷한 실수를 저 지르면 여기에 대답 할 것이다. 나는 내 질문에 대답을 암시 한 것처럼 보이지만, 나는 그 시간에 그것을 깨닫지 못했다. 내 질문에

, 나는

내가 설정을 시도 밝혔다 AllowDrop의 = 사실 사용자 지정 컨트롤의 핸들 ( 디자이너/생성자 코드를 통해) 생성되고 후 핸들이 생성됩니다 전과 (OnHandleCreated override를 통해 통해). 아니요 동작의 차이.

실제로 고장이 발생한 곳입니다. 나는 OnHandleCreated이라는 기본 클래스의 구현을 기억해야한다는 것을 구체적으로 언급하고있는 OnHandleCreated documentation을 읽지 못했습니다.

반사경은 Control의 내부 이벤트 알림 구조 설정에 대한 책임이 Control::OnHandleCreated임을 보여줍니다. Control::OnHandleCreated을 호출 한 적이 없으므로 내부 이벤트 알림 구조가 제대로 구축되지 않았습니다. 이 이벤트 구조 (반사판 다시 표시)는 OnDragOver 등을 실행하므로 누락 된 이벤트 구조로 인해 누락 된 이벤트가 발생합니다.

답변 :

것은 당신이 그것을 무시할 때 OnHandleCreated의 기본 클래스 구현을 호출 있는지 확인하십시오!