日期:2014-05-18  浏览次数:21336 次

C# 图形编程:如何在高速刷屏的情况下,实时绘制的曲线图形不闪动?
具体的案例如下:

        前台数据采集模块每50毫秒采集若干数据,然后在后台实时绘制相应的曲线,具体原理类同与医院里用于监控病人的心率等参数的监控器程序。在此,我采用了每50毫秒在   PictureBox   控件里重新绘制其曲线,不停的   Refresh(),结果发现屏幕不停的闪动,而且过不了太长的时间,系统就崩溃了。我知道在   Delphi   中,多采用在内存中绘制当前的曲线图形,然后在该控件中贴图,这样,所绘制的图形的实时性便有了保证,而且也不会闪屏,但是,我不知道用C#开发此程序时,具体的细节又该如何实现呢?还望各位大虾指点一二。

------解决方案--------------------
参考:

【翻译】一个简单的性能监视及绘制控件
http://bbs.msproject.cn/Default.aspx?g=posts&t=242

【翻译】Windows系统性能检视及绘制
http://bbs.msproject.cn/Default.aspx?g=posts&t=462


------解决方案--------------------
GDI+,生成Bitmap,再贴图
------解决方案--------------------
简单的,你可以先new一个bitmap,在这个bitmap上画图,画完了,再把这个图帖到控件上去。
vs2005里提供了一个类,专门用于双缓冲画图,好像是buffergraphics和buffergraphicscontext类,你看看msdn。
------解决方案--------------------
double buffer或者用Direct3D
------解决方案--------------------
同意楼上
------解决方案--------------------
double buffer
先内存新建一个bmp
画在上面
然后drawimage到控件上
------解决方案--------------------

------解决方案--------------------
友情UP一下
------解决方案--------------------
UP
------解决方案--------------------
这个是简单的双缓冲。。参考参考吧

Graphics displayGr5aphics = this.CreateGraphics();
Random r = new Random();
Image i = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);
Graphics g = Graphics.FromImage(i);
OutNum = ClientRectangle.Width;
inNum = ClientRectangle.Height;
g.FillRectangle(Brushes.White, ClientRectangle);
OutNum = 1;
inNum = ClientRectangle.Width;
for (int x = 0; x <= ClientRectangle.Width; x++)
{
for (int y = 0; y < ClientRectangle.Height; y += 10)
{
Color c = Color.FromArgb(r.Next(255), r.Next(255), r.Next(255));
Pen p = new Pen(c, 1);
g.DrawLine(p, new Point(0, 0), new Point(x, y));
p.Dispose();

add = y;
}
if (OutNum != ClientRectangle.Width)
OutNum =x;
}
displayGr5aphics.DrawImage(i, ClientRectangle);
i.Dispose();