我的程序很简单,就是启动一个Timer,然后DrawLine重复画一条连续的折线。因为效率的问题,我的程序不要求在窗口被覆盖时重绘,由此不要onPaint里重绘,但现在的问题是我的窗口在绘图时,当鼠标操作其他程序时,测试程序有时也会刷新,即使测试程序的窗口并没有被覆盖或者被影响。网上有这样说,去掉Onpaint,但是也没有用:
protected override void OnPaint(PaintEventArgs e)
  {
   //   base.OnPaint(e);
  }
protected override void OnPaintBackground(PaintEventArgs e)
  {
     // base.OnPaintBackground(e);
  }请问怎么办?

解决方案 »

  1.   

    自己在程序里画好图,然后然后返回一个bitbmp对象,建议参考zedGraph这个第三方控件.
      

  2.   


    这个思路是对的,创建一个 Image 对象
    Image img = new Bitmap(500, 500);
    this.BackgroundImage = img;
    using (Graphics g = Graphics.FromImage(img))
    {
    g.DrawLine(/*...*/);
    g.Save();
    }
      

  3.   

    谢谢楼上的2位,但这样肯定要主动刷新整个背景吧?如果绘画的速度很快,并且折线很多,就很耗cpu了。
      

  4.   

    把下面代码放其他控件的事件里,比如Button,让某个事件去触发绘制线条 Graphics g = panel1.CreateGraphics();//用控件创建
     g.DrawLine(new Pen(Color.Red), new Point(15, 15), new Point(15, 100));//画
      

  5.   

    被动刷新的意思:就是我的窗口只是在重复Drawline,窗口并没有被覆盖,但是当其他软件操作时,他偶尔还是会被重绘(准确说是被清空)
      

  6.   

    你应该采用双缓冲绘图,楼上几位也提到了,先在内存中新建一个Bitmap对象,将曲线绘制到Bitmap中,Paint事件你是无法避免不被调用的,你要做的事情是在Paint事件中将Bitmap绘制出来,而在你的Timer中,控制是否需要更新Bitmap对象,比如:判断是Active Form才去更新BitmapTimer t = new Timer();
                t.Tick += delegate
                {
                    if (Form.ActiveForm == this)
                    {
                        //update bitmap;
                    }
                };
      

  7.   

    我drawline的速度很快,类似医院那种心电图,每秒都要走几十个点,这样我的程序不要求重绘,即窗口被覆盖时可以清空,这样比加载整幅内存图片时速度快很多。但目前情况是,我在电脑上进行其他节目操作时,根本就没有覆盖画图的窗口,曲线有时也会被清空。
      

  8.   

    在UPDATE里写你的事件估计就不会了.
      

  9.   

    update?不明白刚才我加了输出,即使该窗口没有被覆盖,它的onpaint事件也会被执行,现在的问题应该是我如何避免这个事件?
      

  10.   


    protected override void OnPaintBackground(PaintEventArgs e)
    {
        // 注释 base.OnPaintBackground(e);
        e.Graphics.DrawRectangle(Pens.Black, 0, 0, 100, 100);
    }
      

  11.   

    嗯,另外再加了个image,解决了,谢谢楼上的各位。