注册 登录
编程论坛 C# 论坛

在 vs2008,用 C# 画多条直线时卡

gxlove 发布于 2014-06-12 00:52, 676 次点击
C#语言,在pictureBox控件中画直线时,数量少画得很快,当数量为100条时执行时间明显长了很多,卡一下才显示所画的100条直线。请大家帮看一下要怎么优化才执行快些?代码如下:
程序代码:
        
        Point[] pt;
        Point p1, p2;
        List<Point[]> pts = new List<Point[]>();
        public void InitData()
        {
            int x1, y1, x2, y2;
            for (int r = 0; r <101; r++)
            {
                x1 = 0;
                y1 = r * 32;
                x2 = 101* 32;
                y2 = r * 32;
                p1 = new Point(x1,y1);
                p2 = new Point(x2,y2);
                pt = new Point[2];
                pt[0] = p1;
                pt[1] = p2;
                pts.Add(pt);

            }
        }
       //调用画图方法
        public void myDraw()
        {
            Bitmap bmp = new Bitmap(100*32, 100*32);
            Graphics g = Graphics.FromImage(bmp);
            Pen pen = new Pen(Color.White, 1);
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            pen.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;
            foreach (Point[] po in pts)
            {
                g.DrawLine(pen, po[0], po[1]);
            }
            pictureBox1.Image = bmp;
            pen.Dispose();
            g.Dispose();
        }
4 回复
#2
wangnannan2014-06-12 08:40
程序代码:
在构造函数中加如下代码
      SetStyle(ControlStyles.UserPaint, true);
      SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
      SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲
#3
gxlove2014-06-12 11:45
回复 2 楼 wangnannan
请这三句加在哪里?是加在for循环中还是放在哪?
#4
gxlove2014-06-12 11:51
还有个问题当Bitmap bmp = new Bitmap(100*32, 100*32);中bmp设置的宽高大于等于400*32时就报错,提示参数无效。当300*32时要7,8秒才显示。我看到类似的软件画5000条线一下显示出来,不懂怎么实现?
#5
gxlove2014-06-14 21:34
结贴。经测试不是双缓冲问题。而是程序问题,优化了程序,得已解决。
1