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

これは、あなたが[バージョンコントロール](http://www.fortnet.org/FortNet/HTML/Presentation/CVS/whyvc.html)__を使用して将来起こることを防ぐことを示しています。 [このチュートリアル](http://hginit.com/01.html)で始めるのに役立つかもしれません。 – Adam

+0

私はこれまで100%働いていたのとはまったく違った音を出しましたが、最近調整した後は再び犬に行ってしまいました。あなたが見ることができるように、あなたの質問に言及するのは害ではありません。 – 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に変更します。

これで解決できない場合は、イベント処理の監視を検討する必要があります。 2つ以上のマウス移動イベントを登録している可能性があり、したがって、それぞれのメソッドが他のマウスと干渉する可能性があります。

EDIT:

は、あなたも、その親クラスののOnPaintメソッドをオーバーライドしようとしたことがありますか?

protected override void OnPaint(PaintEventArgs pe) 
     { 
      base.OnPaint(pe); 
     } 
関連する問題