2017-07-06 24 views
0

画面からDrawReversibleFrameを削除する際に問題があります。ドキュメントは、それを削除する機能を2回入力すると言うが、それは私のロジックレイアウトではうまくいかないようだ。画面からDrawReversibleFrameを消去しています

using System.Drawing; 
using System.Windows.Forms; 

namespace WindowsFormsApp6 
{ 
public partial class Form1 : Form 
{ 
    private Point? _start; 
    private Rectangle _previousBounds; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void OnMouseDown(object sender,MouseEventArgs e) 
    { 
     _start = e.Location; 
    } 

    private void OnMouseMove(object sender,MouseEventArgs e) 
    { 
     if (_start.HasValue) 
     { 
      ReverseFrame(); 
      DrawFrame(e.Location); 
     } 
    } 

    private void OnMouseUp(object sender,MouseEventArgs e) 
    { 
     ReverseFrame(); 
     _start = null; 
    } 

    private void ReverseFrame() 
    { 
     ControlPaint.DrawReversibleFrame(_previousBounds, Color.Red, FrameStyle.Dashed); 

    } 
    private void DrawFrame(Point end) 
    { 
     ReverseFrame(); 

     var size = new Size(end.X - _start.Value.X, end.Y - _start.Value.Y); 
     _previousBounds = new Rectangle(_start.Value, size); 
     _previousBounds = RectangleToScreen(_previousBounds); 
     ControlPaint.DrawReversibleFrame(_previousBounds, Color.Red, FrameStyle.Dashed); 
    } 
} 
} 

フォームにマウスをドラッグしたときの結果です。 http://imgur.com/a/Kh4h7

私がやっているような気がするように、ぺスコのコードはうまくいくはずです。

MouseDown:

描画矩形。

矩形の境界を保存します。

-

のMouseMove(W /左ボタンダウン):

消去する前四角形を再描画。

次の矩形を計算します。

次の矩形を描画します。

矩形の境界を保存します。

リンス/リピート(無期限)

-

のMouseUp:

消去する最後の四角形を再描画します。

+0

ReverseFrame()の*最初の呼び出しが無効であることを覚えておく必要があります。まだ逆転するものはないから。 –

答えて

0

this example

例でMouseUpイベントハンドラが注目点であるを見てみましょう。

private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) 
     { 
      // If the MouseUp event occurs, the user is not dragging. 
      isDrag = false; 

      // Draw the rectangle to be evaluated. Set a dashed frame style 
      // using the FrameStyle enumeration. 
      ControlPaint.DrawReversibleFrame(theRectangle, this.BackColor, FrameStyle.Dashed); 

      // Find out which controls intersect the rectangle and 
      // change their color. The method uses the RectangleToScreen 
      // method to convert the Control's client coordinates 
      // to screen coordinates. 
      Rectangle controlRectangle; 
      for (int i = 0; i < Controls.Count; i++) 
      { 
       controlRectangle = Controls[i].RectangleToScreen(Controls[i].ClientRectangle); 
       if (controlRectangle.IntersectsWith(theRectangle)) 
       { 
        Controls[i].BackColor = Color.BurlyWood; 
       } 
      } 

      // Reset the rectangle. 
      theRectangle = new Rectangle(0, 0, 0, 0); 
     } 

具体的には、私はそれをテストしたときにコメントの下に次の行を置き、あなたと同じ結果を得ました。

// ControlPaint.DrawReversibleFrame(theRectangle, this.BackColor, FrameStyle.Dashed); 

更新

私はあなたのコードをテストしました。あなたの四角形_previousBoundsは2回目に描かれていないと思います。

+0

私はMicrosoftの例を試してみましたが、少し上手く動作します。今私が持っている問題は、フレームを動かすたびにちらつきます。 –

関連する問題