0

これは再生ボタンのコードです:

private void btnPlay_Click(object sender, EventArgs e)
        {
            _files = new List<FileInfo>(); 
            _indx = 0;
            DirectoryInfo dir = new DirectoryInfo(filesForanimation);

            if (_files == null)
                _files = new List<FileInfo>();

            fi1 = dir.GetFiles("*.bmp");
            _files.AddRange(fi1);

            _files = _files.OrderBy(f => f.LastWriteTime).ToList();
            button14.ForeColor = Color.Red;
            button13.ForeColor = Color.Black;
            button12.ForeColor = Color.Black;
            timer3.Start();
            button13.Enabled = true;
            button13.Text = "Pause";
            button12.Enabled = true;
            trackBar1.Maximum = fi1.Length;
            trackBar1.Minimum = 0;
        }

次に、タイマー ティック イベント:

private void timer3_Tick(object sender, EventArgs e)
        {
            try
            {
                Image iOLd = this.pictureBox1.Image;
                trackBar1.Value = _indx;
                label23.Text = _files[_indx].Name;

            if (checkBox1.Checked)
            {
                Image img = Image.FromFile(_files[_indx].FullName);
                this.pictureBox1.Image = img;
                this.pictureBox1.Image = null;
                pictureBox1.Refresh();
            }
            else
            {
                Image img = Image.FromFile(_files[_indx].FullName);
                this.pictureBox1.Image = img;
            }
            if (iOLd != null)
                // iOLd.Dispose();
                _indx++;

            if (_indx >= _files.Count)
            {
                _indx = 0;
                trackBar1.Value = 0;
            }
                timer3.Interval = Convert.ToInt32(numericUpDown1.Value); 
            }
            catch
            {

            }
        }

そして、checkBox チェック イベント:

private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1.Checked) 
            {
                Graphics g = Graphics.FromImage(pictureBox1.Image);
                g.Clear(SystemColors.Control);
                pictureBox1.Invalidate();
            }
            else
            {
                pictureBox1.Load(fi[trackBar1.Value].FullName);
                pictureBox1.Invalidate();
            }
        }

問題はタイマーティックにあります。初めて if (checkBox1.Checked) 内で試したのは、pictureBox1.Refresh(); だけでした。しかし、再生ボタンを押すと、白い背景に大きな赤い X が表示されます。だから私は//行をマークしました: iOLd.Dispose(); だから今、私はピクセルのみの図面を見ていますが、それらは決して変化しません。何らかの理由で、ハードディスクから新しい画像をロードしないと思います。同じ画像を何度も移動し続けます。

それで、if (checkBox1.Checked) で今のようにしようとしました:

Image img = Image.FromFile(_files[_indx].FullName);
                    this.pictureBox1.Image = img;
                    this.pictureBox1.Image = null;
                    pictureBox1.Refresh();

しかし、この場合、trackBar とタイマーは一度画像番号 2 に移動し、何もせずにそこで停止します。

そして、これは、チェックボックスがチェックされていない場合にのみチェックされ、pictureBoxにピクセルと背景画像が正常に機能している場合にのみ発生します。

** Cleared を修正し、質問を短くしました **

4

1 に答える 1

1

チェック変更イベントなどの永続化されていないメソッドからグラフィックス オブジェクトに描画しないでください。

PictureBox のPaintイベントを処理して、更新が必要になるたびにグラフィックが再描画されるようにする必要がありPictureBoxます (背景画像を変更する場合など)。現状では、ウィンドウを十分に動かすと、グラフィックが失われる可能性が高くなります。

例えば:

pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
   Graphics g = e.Graphics;
   // draw your pixels here
}

: ピクチャ ボックスには用途と問題があります。カスタム描画を行いたい場合は、代わりに標準パネルに描画することをお勧めします。

于 2012-07-26T17:02:45.933 に答える