1

PictureBox イメージ キャンバスにいくつかの図形を描画していますが、同時にキャンバスの周りでそれらをアニメーション化する必要があるという問題に遭遇しました。

キャンバス上の形状の位置を更新する必要があるため、キャンバスをクリアしてすべてを再描画する必要があることを意味します。これにより、明らかに更新時にちらつき効果が生じます。

この問題を回避するには、どのようなオプションが必要ですか? それらを移動するために私が見つけた唯一の方法は、形状を「トレイル」にすることですが、これは私が望んでいるものではありません。

私の苦境を説明するコードは次のとおりです。

Form_Load:
      OriginalImage = pictureBox1.Image;

Timer_Tick:
    pictureBox1.Image = OriginalImage;
    Image canvas = (Image)pictureBox1.Image.Clone();
    Graphics g = Graphics.FromImage(canvas);
    g.DrawRectangle(newPosition);

Timer2_Tick:
    // This will clear the canvas and only draw the ellipse, which means I can't get both shapes on at the same time.
    pictureBox1.Image = OriginalImage;
    Image canvas = (Image)pictureBox1.Image.Clone();
    Graphics g = Graphics.FromImage(canvas);
    g.FillEllipse(newPosition);
    pictureBox1.Image = 
4

1 に答える 1

0

すべての図形の場所を追跡し (既にあると思います)、pictureBox のPaintイベントを使用します。

次に、次のようにします。

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawRectangle(your_rectangle);
        e.Graphics.DrawEllipse(your_ellipse);
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        pictureBox1.Invalidate();
    }

pictureBox が再描画されるたびに、関連する位置に長方形と楕円が描画されます。pictureBox を更新 (再描画) するには、タイマーで .Invalidate() メソッドを使用して、タイマーが起動するたびに pictureBox を更新します。タイマーの間隔を、イメージを更新する頻度に設定します。

フォームの Load イベントで一度設定するだけで、毎回 pictureBox の画像を描画する必要はありません。

    private void Form1_Load(object sender, EventArgs e)
    {
        pictureBox1.Image = myImage;
    }

APictureBoxは標準に従って DoubleBuffered であるため、ちらつきはありません。

于 2013-01-15T18:48:51.243 に答える