回 帖 发 新 帖 刷新版面

主题:如何使屏幕没有抖动?

以下是在屏幕上每间隔一秒画出一条小线段的代码,可是程序运行后,每画一次,屏幕就抖动一次,我该如何做才能去除?
private void timer1_Tick(object sender, EventArgs e)
        {
            if (i <= 28)//计划共绘出的电数,从零开始计数
            {   //半径为150像素
                int R = 150;
                //设定角度为15度
                double W = Math.PI/12;
                //定义横坐标
                int R_X;
                //定义纵坐标
                int R_Y;
                //横坐标数值
                R_X = (int)(R* Math.Sin(W * i) + 240);
                //纵坐标数值
                R_Y = (int)(R * Math.Cos(W * i) + 240);
                //确定位图的大小和位置
                Rectangle rcBitmap = new Rectangle(0, 0, 480, 480);
                //建立位图
                m_bmp = new Bitmap(rcBitmap.Width, rcBitmap.Height);
                //从指定的位图创建绘图表面
                Graphics g = Graphics.FromImage(m_bmp);
                //创建画唰
                Brush bb = new SolidBrush(Color.Silver);
                //创建画唰
                Brush bb1 = new SolidBrush(Color.Black);
                //创建画唰
                Pen bb2 = new Pen(Color.DarkGray, 5.0f);
                //创建橙色画笔
                Pen pp = new Pen(Color.Orange, 5.0f);
                //以银灰色填充位图
                g.FillRectangle(bb, rcBitmap);
                //绘外圆边框
                g.DrawEllipse(bb2, 5, 5, 470, 470);
                //再次以黑色圆形填充位图
                g.FillEllipse(bb1, 20, 20, 440, 440);
                //以橙色绘出要显示的小线段
                g.DrawLine(pp, R_X, R_Y, R_X + 3, R_Y + 3);
                //释放资源
                g.Dispose();
                //强制重绘
                this.Refresh();
                //计数加1
                i = i + 1;
            }
            else
                this.timer1.Enabled = false;

        }

回复列表 (共7个回复)

沙发

.net绘图比较慢~~~

板凳

你的问题不在于你这段代码
而是你如何把m_bmp绘制到屏幕上.

我觉得
//建立位图
                m_bmp = new Bitmap(rcBitmap.Width, rcBitmap.Height);
这句代码有问题,好像应该先m_bmp.Dispose();

3 楼

绘图事件我就用了这几行代码完成的.
 private void Form1_Paint(object sender, PaintEventArgs e)
        {
            if (m_bmp == null)
                return;
            e.Graphics.DrawImage(m_bmp,0,0);
        }
    至于m_bmp = new Bitmap(rcBitmap.Width,rcBitmap.Height);
我在前面先定义了Bitmap m_bmp;
    我的目的就是要不停的进行重画,抖动不解决是不行的.

4 楼

在窗体的构造函数中添加这行代码:
SetStyle(ControlStyles.DoubleBuffer |  ControlStyles.AllPaintingInWmPaint,true);

5 楼

放到后台应该就可以了-_#.............
难后最后在显示就不会拌动了...好象是这样

6 楼

我用的是.net campact framewok.在里面
没找到设置双缓冲的这个属性.
我今天又试了试,把窗体的背景设成黑色,位图中也是黑色的,这样再运行程序就看不出抖动了.
但是我觉得这样肯定不对,我还是没有解决问题,只是回避问题![em8]

7 楼

黑色能够缓解
的确是这样
绘图慢主要问题出在BitBlt上面,黑色对付BitBlt算是阴差阳错吧

我来回复

您尚未登录,请登录后再回复。点此登录或注册