2011-12-23 2 views
0

새 컨트롤을 쉽게 화면에서 이동할 수 있도록 레이블 재정의를 만들었습니다.끌어서 놓기 - Winforms에서 레이블 이동

아래 코드를 첨부했지만 응용 프로그램을 실행하거나 레이블을 이동하려고하면 항상 꺼져 있습니다. 또한 때로는 완전히 사라지거나 흔적을 남기거나 0,0 위치로 재설정됩니다. 스크린 샷을 살펴보십시오.

저는이 방법을 100 % 사용 했었지만, 최근에 약간의 조정을 한 후에 다시 개를 찾았습니다. 어떻게 작동하는지 잘 모르겠습니다.

스크린 샷 : Attempting to Drag

코드 :

internal sealed class DraggableLabel : Label 
{ 

    private bool _dragging; 
    private int _mouseX, _mouseY; 

    public DraggableLabel() 
    { 
     DoubleBuffered = true; 
    } 

    protected override void OnMouseMove(MouseEventArgs e) 
    { 
     if (_dragging) 
     { 
      Point mposition = PointToClient(MousePosition); 
      mposition.Offset(_mouseX, _mouseY); 

      Location = mposition; 
     } 
     base.OnMouseMove(e); 
    } 

    protected override void OnMouseDown(MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      _dragging = true; 
      _mouseX = -e.X; 
      _mouseY = -e.Y; 
      BringToFront(); 
      Invalidate(); 
     } 
     base.OnMouseDown(e); 
    } 

    protected override void OnMouseUp(MouseEventArgs e) 
    { 
     if (_dragging) 
     { 
      _dragging = false; 
      Cursor.Clip = new Rectangle(); 
      Invalidate(); 
     } 

     base.OnMouseUp(e); 
    } 

} 
+1

이렇게하면 [version control] (http://www.fortnet.org/FortNet/HTML/Presentation/CVS/whyvc.html) __을 사용하여 향후 이러한 일이 발생하지 않도록 할 수 있습니다. [이 튜토리얼] (http://hginit.com/01.html)은 시작하는 데 도움이 될 수 있습니다. – Adam

+0

과 매우 다른 소리를 들었지만, 최근에 약간 조정 한 후에 다시 개에갔습니다. - 보시다시피, 귀하의 질문에 언급 할 가치가 없을 것입니다. – Adam

답변

5

OnMouseMove() 코드가 잘못되었습니다. 이렇게하는 대신 다음과 같이하십시오.

private Point lastPos; 

protected override void OnMouseMove(MouseEventArgs e) { 
    if (e.Button == MouseButtons.Left) { 
     int dx = e.X - lastPos.X; 
     int dy = e.Y - lastPos.Y; 
     Location = new Point(Left + dx, Top + dy); 
     // NOTE: do NOT update lastPos, the relative mouse position changed 
    } 
    base.OnMouseMove(e); 
} 

protected override void OnMouseDown(MouseEventArgs e) { 
    if (e.Button == MouseButtons.Left) { 
     lastPos = e.Location; 
     BringToFront(); 
     this.Capture = true; 
    } 
    base.OnMouseDown(e); 
} 

protected override void OnMouseUp(MouseEventArgs e) { 
    this.Capture = false; 
    base.OnMouseUp(e); 
} 

스크린 샷에는 제대로 다시 그려지지 않는 양식의 증거도 나와 있습니다. 그 원인을 알 수있는 단서를 남기지 않았습니다.

+0

그게 전부입니다! 감사합니다 힙!. 그래, 이제 그것을보고 나는 다르게해야 할 몇 가지를 볼 수 있습니다! – Lucas

-1

은 어쩌면 당신은, 내가 최근에 이런 문제가 있었

label1.Focus(); 
+4

이 문제는 어떤 문제를 해결할 것입니까? –

+0

그것은 onMouseMove 핸들러를 잡습니다 – gingray

0

처럼 요소에 초점을 두어야하고 배경색을 설정하여 해결했습니다. 레이블의 Color.Transparent.

이렇게해도 해결되지 않으면 이벤트 처리 모니터링을 고려해야합니다. 두 개 이상의 마우스 이동 이벤트를 등록하고 있으므로 각 메소드가 다른 마우스 간섭 이벤트를 방해 할 수 있습니다.

편집 :

당신도 부모 클래스의 OnPaint 메서드를 재정의하는 시도?

protected override void OnPaint(PaintEventArgs pe) 
     { 
      base.OnPaint(pe); 
     }