2009-06-11 7 views
5

私は長方形を描画して、数ミリ秒間スリープ状態にしてから、その長方形をクリアしたいのですが、どのように把握できません。WindowsフォームでDrawRectangleをクリアする

   graphics.DrawRectangle(p, innerRectangle) 
       System.Threading.Thread.Sleep(75) 
       Next I want to clear the rectange... 

答えて

5

(矩形はので、私は単に別の長方形でそれをカバーすることはできませんグラフィックの上に座っている)あなたは(四角形の下またはそれの少なくとも一部)のグラフィックを再描画する必要があります。これがピクチャボックスまたは同様のものの場合は、Invaldiate()を使用して再描画を強制します。

2

私は、矩形を描画する前に、表面から元のデータを一時ビットマップにコピーしてから、その場所にビットマップを描画するようにしてください。

更新

あり受け入れ答えはすでにあるが、私はとにかくコードサンプルを共有することができると思いました。このコントロールは、与えられたコントロール上で赤色の四角形を描画し、500ミリ秒後にその領域を復元します。

public void ShowRectangleBriefly(Control ctl, Rectangle rect) 
{ 
    Image toRestore = DrawRectangle(ctl, rect); 
    ThreadPool.QueueUserWorkItem((WaitCallback)delegate 
    { 
     Thread.Sleep(500); 
     this.Invoke(new Action<Control, Rectangle, Image>(RestoreBackground), ctl, rect, toRestore); 
    }); 
} 

private void RestoreBackground(Control ctl, Rectangle rect, Image image) 
{ 
    using (Graphics g = ctl.CreateGraphics()) 
    { 
     g.DrawImage(image, rect.Top, rect.Left, image.Width, image.Height); 
    } 
    image.Dispose(); 
} 

private Image DrawRectangle(Control ctl, Rectangle rect) 
{ 
    Bitmap tempBmp = new Bitmap(rect.Width + 1, rect.Height + 1); 
    using (Graphics g = Graphics.FromImage(tempBmp)) 
    { 
     g.CopyFromScreen(ctl.PointToScreen(new Point(rect.Top, rect.Left)), new Point(0, 0), tempBmp.Size); 
    } 

    using (Graphics g = this.CreateGraphics()) 
    { 
     g.DrawRectangle(Pens.Red, rect); 
    } 
    return tempBmp; 
} 
2

長方形がグラフィックの上に完全に座っている場合は、下にあるグラフィックを再描画または更新するだけで済みます。そうでない場合は、背景色を使用して矩形を再描画し、基礎となるグラフィックを更新する必要があります。

1

私は同じ問題を抱えており、メインフォームに描画され、必要に応じて表示/非表示、サイズ変更、配置された別のパネルで解決しました。四角形はもう必要がない場合

SelectionBox box = new SelectionBox(); 
box.Location = location; 
box.Size = size; 
box.Visible = true; 

すると、ちょうど呼び出すことによって、それを隠す:

box.Visible = false; 

パネルクラスは、ウィンドウの他のコンテンツを隠していないことオーバーレイグラフィックスを確保するために、透明で作られています。

[System.ComponentModel.DesignerCategory("Code")] 
    public class SelectionBox : Panel 
    { 
    protected override void OnPaint(PaintEventArgs e) 
    { 
     const int penWidth = 2; 
     int offset = penWidth - 1; 
     using (Pen pen = new Pen(Color.Red, 2)) 
     e.Graphics.DrawRectangle(pen, offset, offset, 
      ClientSize.Width - offset - 1, ClientSize.Height - offset - 1); 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
     CreateParams cp = base.CreateParams; 
     cp.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT 
     return cp; 
     } 
    } 
    } 
+0

この場合、オーバーレイパネルはマウスのクリックを妨害するため、関連するすべてのイベントを下位のパネルに転送する必要があります。 –

関連する問題