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

lulianqi 2012-09-19 12:46:23
代码如下

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填充一下就闪了?
求解!!
...全文
252 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
baoty1977 2012-09-23
  • 打赏
  • 举报
回复
期待答案
zypine 2012-09-23
  • 打赏
  • 举报
回复
为什么非要去继承panel呢,你在自定义控件类上加上
[System.ComponentModel.Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design ")]
标志不就行了吗。

另外如果是控件本身上面画图应该是能有效地避免闪烁,如果你是把控件当绘图的元素或者要画得内容太多,则可能会有闪烁。下图也是一个我以前的一个项目的截图,也是即时更新数据的3D曲线,基本上是没闪烁。
lulianqi 2012-09-21
  • 打赏
  • 举报
回复
我把数据传进去了 然后 Refresh()刷新 依然闪。
lulianqi 2012-09-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
private BufferedGraphicsContext graphicManager;
private BufferedGraphics managedBackBuffer;

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

试了一下!! 不过我要画的东西,在程序运行中是不停的变化的。 要怎么把值传进去!!
lulianqi 2012-09-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
private BufferedGraphicsContext graphicManager;
private BufferedGraphics managedBackBuffer;

构造函数中加下面代买
SetStyle(
ControlStyles.OptimizedDoubleBuffer
| ControlStyles.ResizeRedraw
| Cont……
[/Quote]
恩 这些我基本都了解,不过我只会在自定义控件里在构造函数中加下面代吗,及重写控件方法。
要加这些东西,只能自定义一个继承于panel的控件吗?
再次验证了一句话: 很多 nb的人 都是晚上不睡觉的。
zypine 2012-09-20
  • 打赏
  • 举报
回复
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)
{
//这儿开始画图
}
lulianqi 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
如果你想在panel上画,就在panel的OnPaint中画,并设置panel的doublebuffer = true
[/Quote]
要重写onpaint 及设置 控件的doublebuffer 是不是只能重新自定义一个控件,继承与panel
bdmh 2012-09-19
  • 打赏
  • 举报
回复
如果你想在panel上画,就在panel的OnPaint中画,并设置panel的doublebuffer = true

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧