2011-12-23 35 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

這正好說明你__should使用[版本控制(http://www.fortnet.org/FortNet/HTML/Presentation/CVS/whyvc.html)__以防止這樣的事情在將來發生。 [本教程](http://hginit.com/01.html)可能會幫助您開始。 – Adam 2011-12-23 11:13:37

+0

這聽起來比'我曾經有過這方面的工作100%的有很大不同,但是最近的一些調整已經去了狗again'之後 - 你可以看到,它不會傷害一提的是在你的問題。 – Adam 2011-12-23 11:37:02

回答

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 2011-12-23 13:47:03

-1

也許你應該把焦點的元素上像

label1.Focus(); 
+4

這會解決什麼問題? – 2011-12-23 11:18:55

+0

它抓住onMouseMove處理程序 – gingray 2011-12-23 11:41:18

0

我最近有這樣的問題,我通過設置背景色來解決它的標籤Color.Transparent

如果不解決這個問題,那麼你應該考慮監視你的事件處理。這可能是因爲您註冊了多個鼠標移動事件,因此每種方法都會干擾另一個。

編輯:

您是否也嘗試重寫它的父類的OnPaint方法?

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