当前位置:编程学习 > C#/ASP.NET >>

问一个关于绘制折线的问题(Graphics) 在线等!!!

代码如下

        Graphics myCpuGraphics_;
        BufferedGraphicsContext myBufferGC = BufferedGraphicsManager.Current;
        BufferedGraphics myBufferG_cpu;
        public void loadClass()
        {
            myCpuGraphics = Graphics.FromHwnd(panel_cpu.Handle);
            myBufferG_cpu = myBufferGC.Allocate(myCpuGraphics, panel_cpu.DisplayRectangle);
            myCpuGraphics_ = myBufferG_cpu.Graphics;    
        }
/
/
/
/
/   
         //draw
         myCpuGraphics_.Clear(Color.PowderBlue);
         myCpuGraphics_.DrawLines(myPen_1, myCpuRecord);
         myBufferG_cpu.Render();



为什么我老是感觉画完画“下一帧”总感觉会小闪一下。
   而且我打开使用“双缓冲”好像没什么效果。是不是我哪里写的不对??
有没有什么办法可以不要有那么一闪的感觉??难道是每次用Color.PowderBlue填充一下就闪了?
   求解!! --------------------编程问答-------------------- 如果你想在panel上画,就在panel的OnPaint中画,并设置panel的doublebuffer = true --------------------编程问答--------------------
引用 1 楼  的回复:
如果你想在panel上画,就在panel的OnPaint中画,并设置panel的doublebuffer = true

  要重写onpaint 及设置 控件的doublebuffer  是不是只能重新自定义一个控件,继承与panel --------------------编程问答--------------------  private BufferedGraphicsContext graphicManager;
 private BufferedGraphics managedBackBuffer;

构造函数中加下面代买 
SetStyle(
                     ControlStyles.OptimizedDoubleBuffer
                     | ControlStyles.ResizeRedraw
                     | ControlStyles.Selectable
                     | ControlStyles.AllPaintingInWmPaint
                     | ControlStyles.UserPaint
                     | ControlStyles.SupportsTransparentBackColor,
                     true);
            graphicManager = BufferedGraphicsManager.Current;
            graphicManager.MaximumBuffer =
                new Size(this.Width + 1, this.Height + 1);
            managedBackBuffer =
              graphicManager.Allocate(this.CreateGraphics(),
                                          ClientRectangle);


在OnPaint中加下面代码
 protected override void OnPaint(PaintEventArgs pe)
        {
            if (this.Width > 0 && this.Height > 0)
            {
                if (managedBackBuffer != null)
                {
                    managedBackBuffer.Dispose();
                }

                graphicManager.MaximumBuffer =
                    new Size(this.Width + 1, this.Height + 1);

                try
                {
                    managedBackBuffer =
                    graphicManager.Allocate(this.CreateGraphics(),
                                      ClientRectangle);
                }
                catch
                {


                }
            }
            // 放入内存缓冲
            DrawToBuffer(managedBackBuffer.Graphics);

            // 画图像到屏幕
            managedBackBuffer.Render(pe.Graphics);
        }

 protected void DrawToBuffer(Graphics g)
        {
           //这儿开始画图
        } --------------------编程问答--------------------
引用 3 楼  的回复:
private BufferedGraphicsContext graphicManager;
 private BufferedGraphics managedBackBuffer;

构造函数中加下面代买 
SetStyle(
  ControlStyles.OptimizedDoubleBuffer
  | ControlStyles.ResizeRedraw
  | Cont……

恩  这些我基本都了解,不过我只会在自定义控件里在构造函数中加下面代吗,及重写控件方法。 
要加这些东西,只能自定义一个继承于panel的控件吗?
    再次验证了一句话: 很多 nb的人  都是晚上不睡觉的。 --------------------编程问答--------------------
引用 3 楼  的回复:
private BufferedGraphicsContext graphicManager;
 private BufferedGraphics managedBackBuffer;

构造函数中加下面代买 
SetStyle(
  ControlStyles.OptimizedDoubleBuffer
  | ControlStyles.ResizeRedraw
  | Cont……


试了一下!!  不过我要画的东西,在程序运行中是不停的变化的。  要怎么把值传进去!! --------------------编程问答-------------------- 我把数据传进去了  然后 Refresh()刷新 依然闪。 --------------------编程问答-------------------- 为什么非要去继承panel呢,你在自定义控件类上加上
[System.ComponentModel.Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design ")]
标志不就行了吗。

另外如果是控件本身上面画图应该是能有效地避免闪烁,如果你是把控件当绘图的元素或者要画得内容太多,则可能会有闪烁。下图也是一个我以前的一个项目的截图,也是即时更新数据的3D曲线,基本上是没闪烁。
--------------------编程问答-------------------- 期待答案
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,