问一个关于绘制折线的问题(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 --------------------编程问答--------------------
要重写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)
{
//这儿开始画图
} --------------------编程问答--------------------
恩 这些我基本都了解,不过我只会在自定义控件里在构造函数中加下面代吗,及重写控件方法。
要加这些东西,只能自定义一个继承于panel的控件吗?
再次验证了一句话: 很多 nb的人 都是晚上不睡觉的。 --------------------编程问答--------------------
试了一下!! 不过我要画的东西,在程序运行中是不停的变化的。 要怎么把值传进去!! --------------------编程问答-------------------- 我把数据传进去了 然后 Refresh()刷新 依然闪。 --------------------编程问答-------------------- 为什么非要去继承panel呢,你在自定义控件类上加上
[System.ComponentModel.Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design ")]
标志不就行了吗。
另外如果是控件本身上面画图应该是能有效地避免闪烁,如果你是把控件当绘图的元素或者要画得内容太多,则可能会有闪烁。下图也是一个我以前的一个项目的截图,也是即时更新数据的3D曲线,基本上是没闪烁。
--------------------编程问答-------------------- 期待答案
补充:.NET技术 , C#