0

フォームには、画像ボックス(picturebox1)とタイマーコントロール(timer1)が含まれています。

基本的に、起動時に、ピクセルクラスの5つのインスタンスを含むリストコレクションを作成します。タイマーがトリガーされると、ペイントイベントを呼び出すピクチャーボックスの更新を呼び出します。ペイントイベントでは、リストコレクションを繰り返し処理し、各ピクセルの描画メソッドを呼び出します。

私が抱えている問題は、1つのピクセルしか表示されないことです...つまり、ピクセルを追加するポイントでブレークを設定しない限り、続行して再度ブレークし、すべてのptheピクセルが作成されるまで繰り返します。その後、何らかの理由ですべてのピクセルが表示されます...

なぜ私が1つのピクセルしか見ることができないのか誰かに教えてもらえますか?

public partial class Form1 : Form
{
    List<Pixel> pixels = new List<Pixel>();

    public Form1()
    {            
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        for (int ii = 0; ii < 5; ii++)
            pixels.Add(new Pixel(pictureBox1));  // <- breakpoint here...?
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        foreach (Pixel p in pixels)
            p.Draw(e, pictureBox1);
    }

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

public class Pixel
{
    Random r = new Random(DateTime.Now.Millisecond);

    public Point Position { get; set; }

    public Pixel(PictureBox src) 
    {
        Position = new Point(r.Next(0, src.Width), r.Next(0, src.Height));
    }

    public void Draw(PaintEventArgs e, PictureBox src)
    {
        e.Graphics.DrawRectangle(new Pen(Color.Black), Position.X, Position.Y, 1, 1);
    }
}

私の元のコードはもっと多くのことをします..しかし、私はそれをすべて取り除き、同じ結果を得ました。

4

2 に答える 2

2

Random r = new Random(DateTime.Now.Millisecond)毎回同じシード値で呼び出されたため、ピクセルはまったく同じ場所に表示されました。Random宣言をメインクラスに移動し、それをピクセルクラスに渡しました。今では期待どおりに動作します。

public partial class Form1 : Form
{
    Random r = new Random(DateTime.Now.Millisecond);
    List<Pixel> pixels = new List<Pixel>();

    public Form1()
    {            
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        for (int ii = 0; ii < 5; ii++)
        {
            pixels.Add(new Pixel(pictureBox1, r));
        }
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        foreach (Pixel p in pixels)
            p.Draw(e, pictureBox1);
    }

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

public class Pixel
{
    public Point Position { get; set; }

    public Pixel(PictureBox src, Random r) 
    {
        Position = new Point(r.Next(0, src.Width), r.Next(0, src.Height));
    }

    public void Draw(PaintEventArgs e, PictureBox src)
    {
        e.Graphics.DrawRectangle(new Pen(Color.Black), Position.X, Position.Y, 1, 1);
    }
}
于 2012-10-29T17:23:49.983 に答える
-1

これは、ピクセルクラスの5つのインスタンスすべてのランダマイザーがまったく同じシードを使用しているためです(すべて同じミリ秒の値で発生しています)。Thread.Sleepの使用を容認しないために、少なくとも問題を明らかにするための最も迅速な「修正」は、form_loadイベントを次のように変更することです(ランダム化の方法をリファクタリングすることもできます)。

    private void Form1_Load(object sender, EventArgs e)
    {
        for (int ii = 0; ii < 5; ii++)
        {
            Thread.Sleep(1);
            pixels.Add(new Pixel(pictureBox1));
        }
    }
于 2012-10-29T17:31:44.210 に答える