一次刷新一屏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; }

解决方案 »

  1.   

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

  2.   

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

  3.   

    // 该调用是 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);
      

  4.   

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

  5.   

    每次onpaint的时候
    DrawLine
    800个点12次会很慢。。
    创建一个bitmap也会慢。建议你在load的时候先生成bitmap
    然后在onpaint的时候画bitmape.Graphics.DrawImage(b,0,0);
      

  6.   

    发来看看
    [email protected]