5

私は四角形を描いており、数ミリ秒間スリープしています。その後、四角形をクリアしたいのですが、方法がわかりません。(四角形はグラフィックの上にあるので、別の四角形で単純に覆うことはできません)

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

4 に答える 4

5

グラフィック (または少なくとも長方形の下の部分) を再描画する必要があります。これがピクチャ ボックスまたは同様のものである場合は、Invaldiate()を使用して再描画を強制します。

于 2009-06-11T19:30:30.100 に答える
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;
}
于 2009-06-11T19:30:46.870 に答える
2

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

于 2009-06-11T19:31:12.690 に答える
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;
      }
    }
  }
于 2017-04-08T07:59:03.673 に答える