2012-01-12 2 views
1

사용자가 드래그 할 수있는 일부 항목을 표시하는 Canvas를 기반으로하는 사용자 정의 위젯이 있습니다.SWT, Windows의 애니메이션 배경에 투명한 끌기 이미지 사용

final DragSource source = new DragSource(this, DND.DROP_MOVE); 
source.setDragSourceEffect(new DragSourceEffect(this) { 
    @Override 
    public void dragStart(DragSourceEvent event) { 
     event.image = // do some stuff to generate a partially 
         // transparent image of the dragged item... 
    } 
}); 

나는 항목이 얼마나 사용자에게 표시하기 위해 캔버스의 항목을 애니메이션을 구현했습니다 때까지 잘 작동 : 사용자가 뭔가를 끌 때, 나는 드래그 이미지로 드래그 된 항목의 이미지를 사용하고 드롭이 발생하면 재정렬됩니다. 즉, Windows를 제외한 모든 플랫폼 (GTK, Mac)에서 완벽하게 작동합니다. Windows에서 마우스를 움직일 때마다 플랫폼은 현재 Canvas 내용의 스냅 샷을 찍고 위에 드래그 이미지를 작성하고 화면에 (투명하지 않은) 결과를 배치합니다. 마우스가 움직이지 않는 동안 배경이 실제로 애니메이션으로 바뀌면 그 메커니즘은 끔찍한 결과를 낳습니다. 드래그 이미지가 나타나는 영역은 마지막 마우스 이동 시점의 내용을 표시하지만 드래그 이미지 주위의 영역은 애니메이션으로 표시되고 업데이트됩니다.

마음에 드는 해결책은 마우스와 함께 투명한 맞춤형 셸을 수동으로 움직여 직접 드래그 이미지를 구현하는 것입니다. 내가 가서 그 일을하기 전에, 문제에 대한 나의 해석이 올바른지, Windows에서 움직이는 배경에 드래그 이미지 렌더링을 수정하는 간단한 해결책이 있을까요?

답변

0

드래그 오버 중에 다시 그려주는 것이 큰 골칫거리 인 것 같고 특정 상황에 대해 bug이보고되었습니다. 그래서, 당신의 해석은 (Windows에서?) 드래그 오버가 기본 컨트롤의 다시 그리기/업데이트를 유발하지 않는다는 점에서 올바른 것입니다.

+0

문제를 확인하고 고통을 나누어 주셔서 감사합니다. 나는 단순히 내 자신의 DND 처리를 구현했습니다. 마우스를 움직이는 동안 마우스 이동 이벤트에 대한 전역 이벤트 필터를 설치하고 마우스로 움직이는 드래그 이미지로 투명한 모양의 창을 사용합니다. 이것은 마우스가 실제로 내 타겟 위젯 외부에있을 때에도 드래그 이벤트를 처리 할 수있는 추가 자유를 주었지만 드래그 이미지는 여전히 허용되는 드롭 위치에서 거의 끝났습니다. – stippi