为什么这个简单的C#试用不起作用

时间:2010-02-16 09:49:35

标签: c# winforms graphics

这会产生条纹而不是点。为什么?我正在尝试绘制单个像素。还尝试了另一种方法(使用fillrectangle),它也没有给出所需的结果,得到了条形而不是点。

protected override void OnPaint(PaintEventArgs pea )
    {

         Graphics g = pea.Graphics ;

         for ( int y = 1 ; y <= Width ; y++ )
         {
            for (  int x  =  1  ; x <=  Height    ; x++ )
            {
                System.Random rand = new  System.Random() ;
                Color c =   (Color.FromArgb(rand.Next(256),
                                    rand.Next(256),
                                    rand.Next(256)));
            // SolidBrush myBrush = new SolidBrush(c);
            // g.FillRectangle(myBrush, x, y, 1, 1);


                 Bitmap pt = new Bitmap(1, 1);
                 pt.SetPixel(0, 0, c);
                 g.DrawImageUnscaled(pt, x, y);

            }
        }

}

这里发生了什么?

5 个答案:

答案 0 :(得分:4)

您需要在循环外创建System.Random对象。在循环内部初始化时,它会保持相同的种子(因为它是根据系统时钟初始化的,因为系统时钟仍具有相同的值),因此颜色相同。

答案 1 :(得分:4)

每次都应创建一个新的Random对象。因为那将为您提供完全相同的“随机”数字反复重复。

而是使用相同的Random对象,然后只需调用Next

答案 2 :(得分:1)

是的,他们说的是什么。

你可能会获得更好的里程数。例如将它绘制在屏幕外,然后立即将其全部绘制。

protected override void OnPaint(PaintEventArgs pea)
{
    using (var b = new Bitmap(this.Width, this.Height))
    {
        using (var g = Graphics.FromImage(b))
        {
            var rand = new Random();

            for (int x = 0; x <= Width; x++)
            {
                for (int y = 0; y <= Height; y++)
                {
                    Color c = (Color.FromArgb(rand.Next(256),
                                              rand.Next(256),
                                              rand.Next(256)));
                    using (var newPen = new Pen(c, 1))
                    {
                        g.DrawRectangle(newPen, x, y, 0.5f, 0.5f);
                    }
                }
            }
        }

        pea.Graphics.DrawImage(b, 0, 0);
    }
}

protected override void OnPaint(PaintEventArgs pea)
{
    Graphics g = pea.Graphics;
    var rand = new Random();

    for (int x = 0; x <= Width; x++)
    {
        for (int y = 0; y <= Height; y++)
        {
            Color c = (Color.FromArgb(rand.Next(256),
                                      rand.Next(256),
                                      rand.Next(256)));
            using (var newPen = new Pen(c, 1))
            {
                g.DrawRectangle(newPen, x, y, 0.5f, 0.5f);
            }
        }
    }
}y

答案 3 :(得分:0)

您需要将System.Radom移动到循环之外。这里发生的是每次循环迭代时你都在创建相同的随机点。如果你添加使用系统;到程序的开头比你可以简单地说随机(但这不重要只是一个侧面说明)。创建Random后,只需在对象上调用Next即可获得下一个数字。试试这个,我相信它可以解决你的问题!

答案 4 :(得分:0)

您正在矩形0,0,宽度,高度的每个像素上绘制一个不同的彩色圆点。但是,由于之前的答案是因为随机在每个循环中被初始化为系统时钟,所以循环绘制相同的颜色,给你一条相同颜色的条纹(水平?),直到系统时钟在一点点上滴答并给你一个不同的种子。

如果你将System.Random移动到循环外面,那么每个Next都会得到不同的颜色,那么你会看到点。