C#使用双缓冲依然不能解决绘图闪烁问题。

时间:2020-11-29 17:40:39
一次刷新一屏800*600 主要问题是拖动滚动条图形闪烁很厉害。
其实就是在屏幕绘制12条曲线。
而且把Bitmap设置成(100,100)的小区域也闪烁。下面是代码。 

protected override void OnPaint(PaintEventArgs e)
{


base.OnPaint (e);

Pen pen=new Pen(Color.LimeGreen);

int i=0;

Bitmap bmp=new Bitmap(800,600);
Graphics grfx =Graphics.FromImage(bmp);

hSBEcg.Minimum=0;
hSBEcg.Maximum=filesize/120-1;
hSBEcg.LargeChange=800;

iFirst=hSBEcg.Value;
iLast=hSBEcg.Value+800;

Point[] pt=new Point[800];
Point[] pt1=new Point[800];
Point[] pt2=new Point[800];
Point[] pt3=new Point[800];
Point[] pt4=new Point[800];
Point[] pt5=new Point[800];
Point[] pt6=new Point[800];
Point[] pt7=new Point[800];
Point[] pt8=new Point[800];
Point[] pt9=new Point[800];
Point[] pt10=new Point[800];
Point[] pt11=new Point[800];


w.BaseStream.Position=hSBEcg.Value*120;
if(w.BaseStream.Position==0)
{
w.BaseStream.Position=30;
}

for(int n=iFirst;n<iLast;n++)
{


pt[i].X=i;
pt[i].Y=w.ReadInt16()*400/4096;
pt1[i].X=i;
pt1[i].Y=w.ReadInt16()*400/4096;
pt2[i].X=i;
pt2[i].Y=w.ReadInt16()*400/4096;
pt3[i].X=i;
pt3[i].Y=w.ReadInt16()*400/4096;
pt4[i].X=i;
pt4[i].Y=w.ReadInt16()*400/4096;
pt5[i].X=i;
pt5[i].Y=w.ReadInt16()*400/4096;
pt6[i].X=i;
pt6[i].Y=w.ReadInt16()*400/4096;
pt7[i].X=i;
pt7[i].Y=w.ReadInt16()*400/4096;
pt8[i].X=i;
pt8[i].Y=w.ReadInt16()*400/4096;
pt9[i].X=i;
pt9[i].Y=w.ReadInt16()*400/4096;
pt10[i].X=i;
pt10[i].Y=w.ReadInt16()*400/4096;
pt11[i].X=i;
pt11[i].Y=w.ReadInt16()*400/4096;

pt[i].Y=(w.ReadInt16()*400/4096)+pt[i].Y;
pt1[i].Y=(w.ReadInt16()*400/4096)+pt1[i].Y;
pt2[i].Y=(w.ReadInt16()*400/4096)+pt2[i].Y;
pt3[i].Y=(w.ReadInt16()*400/4096)+pt3[i].Y;
pt4[i].Y=(w.ReadInt16()*400/4096)+pt4[i].Y;
pt5[i].Y=(w.ReadInt16()*400/4096)+pt5[i].Y;
pt6[i].Y=(w.ReadInt16()*400/4096)+pt6[i].Y;
pt7[i].Y=(w.ReadInt16()*400/4096)+pt7[i].Y;
pt8[i].Y=(w.ReadInt16()*400/4096)+pt8[i].Y;
pt9[i].Y=(w.ReadInt16()*400/4096)+pt9[i].Y;
pt10[i].Y=(w.ReadInt16()*400/4096)+pt10[i].Y;
pt11[i].Y=(w.ReadInt16()*400/4096)+pt11[i].Y;

pt[i].Y=(w.ReadInt16()*400/4096)+pt[i].Y;
pt1[i].Y=(w.ReadInt16()*400/4096)+pt1[i].Y;
pt2[i].Y=(w.ReadInt16()*400/4096)+pt2[i].Y;
pt3[i].Y=(w.ReadInt16()*400/4096)+pt3[i].Y;
pt4[i].Y=(w.ReadInt16()*400/4096)+pt4[i].Y;
pt5[i].Y=(w.ReadInt16()*400/4096)+pt5[i].Y;
pt6[i].Y=(w.ReadInt16()*400/4096)+pt6[i].Y;
pt7[i].Y=(w.ReadInt16()*400/4096)+pt7[i].Y;
pt8[i].Y=(w.ReadInt16()*400/4096)+pt8[i].Y;
pt9[i].Y=(w.ReadInt16()*400/4096)+pt9[i].Y;
pt10[i].Y=(w.ReadInt16()*400/4096)+pt10[i].Y;
pt11[i].Y=(w.ReadInt16()*400/4096)+pt11[i].Y;

pt[i].Y=(w.ReadInt16()*400/4096)+pt[i].Y;
pt1[i].Y=(w.ReadInt16()*400/4096)+pt1[i].Y;
pt2[i].Y=(w.ReadInt16()*400/4096)+pt2[i].Y;
pt3[i].Y=(w.ReadInt16()*400/4096)+pt3[i].Y;
pt4[i].Y=(w.ReadInt16()*400/4096)+pt4[i].Y;
pt5[i].Y=(w.ReadInt16()*400/4096)+pt5[i].Y;
pt6[i].Y=(w.ReadInt16()*400/4096)+pt6[i].Y;
pt7[i].Y=(w.ReadInt16()*400/4096)+pt7[i].Y;
pt8[i].Y=(w.ReadInt16()*400/4096)+pt8[i].Y;
pt9[i].Y=(w.ReadInt16()*400/4096)+pt9[i].Y;
pt10[i].Y=(w.ReadInt16()*400/4096)+pt10[i].Y;
pt11[i].Y=(w.ReadInt16()*400/4096)+pt11[i].Y;


pt[i].Y=50-((w.ReadInt16()*400/4096)+pt[i].Y)/5;//5点算平均,采样点和像素点一致。
pt1[i].Y=100-((w.ReadInt16()*400/4096)+pt1[i].Y)/5;
pt2[i].Y=150-((w.ReadInt16()*400/4096)+pt2[i].Y)/5;
pt3[i].Y=200-((w.ReadInt16()*400/4096)+pt3[i].Y)/5;
pt4[i].Y=250-((w.ReadInt16()*400/4096)+pt4[i].Y)/5;
pt5[i].Y=300-((w.ReadInt16()*400/4096)+pt5[i].Y)/5;
pt6[i].Y=350-((w.ReadInt16()*400/4096)+pt6[i].Y)/5;
pt7[i].Y=400-((w.ReadInt16()*400/4096)+pt7[i].Y)/5;
pt8[i].Y=450-((w.ReadInt16()*400/4096)+pt8[i].Y)/5;
pt9[i].Y=500-((w.ReadInt16()*400/4096)+pt9[i].Y)/5;
pt10[i].Y=550-((w.ReadInt16()*400/4096)+pt10[i].Y)/5;
pt11[i].Y=600-((w.ReadInt16()*400/4096)+pt11[i].Y)/5;

i+=1;

}

// fs.Close();
// w.Close();

grfx.DrawLines(pen,pt);
grfx.DrawLines(pen,pt1);
grfx.DrawLines(pen,pt2);
grfx.DrawLines(pen,pt3);
grfx.DrawLines(pen,pt4);
grfx.DrawLines(pen,pt5);
grfx.DrawLines(pen,pt6);
grfx.DrawLines(pen,pt7);
grfx.DrawLines(pen,pt8);
grfx.DrawLines(pen,pt9);
grfx.DrawLines(pen,pt10);
grfx.DrawLines(pen,pt11);

this.CreateGraphics().DrawImage(bmp, 0, 0);

grfx.Dispose();

}


private void hSBEcg_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)
{
this.Invalidate();

}



private void EcgScrollBar_Load(object sender, System.EventArgs e)
{

fs = new FileStream("d:\\demo.ecg", FileMode.Open);
w = new BinaryReader(fs);
w.BaseStream.Position=30;
filesize=(int)w.BaseStream.Length-30;

}

12 个解决方案

#1


会不会是this.Invalidate()造成的试试this.Refresh()看行不行

#2


不行,没有什么用。Refresh()也是这样。

#3


另外构造函数加那几句开什么双缓冲也没有意义。

#4


顶上去

#5


// 该调用是 Windows.Forms 窗体设计器所必需的。
InitializeComponent();
// TODO: 在 InitComponent 调用后添加任何初始化
this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
this.SetStyle(ControlStyles.DoubleBuffer,true);
this.SetStyle(ControlStyles.UserPaint,true);
this.SetStyle(ControlStyles.ResizeRedraw,true);

#6


回楼上的:
加上this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);后屏幕刷新后显示的图形消失。
加上后三个没有什么效果。有邮箱的话我把代码发给你看看。谢谢。

#7


感觉原因是帖图速度太慢的原因

#8


每次onpaint的时候
DrawLine
800个点12次会很慢。。。。。
创建一个bitmap也会慢。。。。

建议你在load的时候先生成bitmap
然后在onpaint的时候画bitmap

e.Graphics.DrawImage(b,0,0);


#9


发来看看
samchai@link-groups.com

#10


已发送

#11


mark

#12


已经解决,谢谢大家。

#1


会不会是this.Invalidate()造成的试试this.Refresh()看行不行

#2


不行,没有什么用。Refresh()也是这样。

#3


另外构造函数加那几句开什么双缓冲也没有意义。

#4


顶上去

#5


// 该调用是 Windows.Forms 窗体设计器所必需的。
InitializeComponent();
// TODO: 在 InitComponent 调用后添加任何初始化
this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
this.SetStyle(ControlStyles.DoubleBuffer,true);
this.SetStyle(ControlStyles.UserPaint,true);
this.SetStyle(ControlStyles.ResizeRedraw,true);

#6


回楼上的:
加上this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);后屏幕刷新后显示的图形消失。
加上后三个没有什么效果。有邮箱的话我把代码发给你看看。谢谢。

#7


感觉原因是帖图速度太慢的原因

#8


每次onpaint的时候
DrawLine
800个点12次会很慢。。。。。
创建一个bitmap也会慢。。。。

建议你在load的时候先生成bitmap
然后在onpaint的时候画bitmap

e.Graphics.DrawImage(b,0,0);


#9


发来看看
samchai@link-groups.com

#10


已发送

#11


mark

#12


已经解决,谢谢大家。