在DrawLine时,如何禁止当前窗口被系统刷新或重绘?

chensan 2010-12-10 09:57:50
我的程序很简单,就是启动一个Timer,然后DrawLine重复画一条连续的折线。

因为效率的问题,我的程序不要求在窗口被覆盖时重绘,由此不要onPaint里重绘,但现在的问题是我的窗口在绘图时,当鼠标操作其他程序时,测试程序有时也会刷新,即使测试程序的窗口并没有被覆盖或者被影响。

网上有这样说,去掉Onpaint,但是也没有用:
protected override void OnPaint(PaintEventArgs e)
{
// base.OnPaint(e);
}
protected override void OnPaintBackground(PaintEventArgs e)
{
// base.OnPaintBackground(e);
}

请问怎么办?
...全文
349 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
chensan 2010-12-16
  • 打赏
  • 举报
回复
嗯,另外再加了个image,解决了,谢谢楼上的各位。
chensan 2010-12-10
  • 打赏
  • 举报
回复
update?不明白

刚才我加了输出,即使该窗口没有被覆盖,它的onpaint事件也会被执行,现在的问题应该是我如何避免这个事件?
flyerwing 2010-12-10
  • 打赏
  • 举报
回复
在UPDATE里写你的事件估计就不会了.
chensan 2010-12-10
  • 打赏
  • 举报
回复
我drawline的速度很快,类似医院那种心电图,每秒都要走几十个点,这样我的程序不要求重绘,即窗口被覆盖时可以清空,这样比加载整幅内存图片时速度快很多

但目前情况是,我在电脑上进行其他节目操作时,根本就没有覆盖画图的窗口,曲线有时也会被清空
bloodish 2010-12-10
  • 打赏
  • 举报
回复
你应该采用双缓冲绘图,楼上几位也提到了,先在内存中新建一个Bitmap对象,将曲线绘制到Bitmap中,Paint事件你是无法避免不被调用的,你要做的事情是在Paint事件中将Bitmap绘制出来,而在你的Timer中,控制是否需要更新Bitmap对象,比如:

判断是Active Form才去更新Bitmap

Timer t = new Timer();
t.Tick += delegate
{
if (Form.ActiveForm == this)
{
//update bitmap;
}
};
chensan 2010-12-10
  • 打赏
  • 举报
回复
被动刷新的意思:就是我的窗口只是在重复Drawline,窗口并没有被覆盖,但是当其他软件操作时,他偶尔还是会被重绘(准确说是被清空)
#blackheart 2010-12-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 nianhui 的回复:]

把下面代码放其他控件的事件里,比如Button,让某个事件去触发绘制线条
C# code

Graphics g = panel1.CreateGraphics();//用控件创建
g.DrawLine(new Pen(Color.Red), new Point(15, 15), new Point(15, 100));//画
[/Quote]
或者放某个方法里面,想画时调用方法
#blackheart 2010-12-10
  • 打赏
  • 举报
回复
把下面代码放其他控件的事件里,比如Button,让某个事件去触发绘制线条

Graphics g = panel1.CreateGraphics();//用控件创建
g.DrawLine(new Pen(Color.Red), new Point(15, 15), new Point(15, 100));//画
whrspsoft3723 2010-12-10
  • 打赏
  • 举报
回复
1 2 楼的都很好。
如样这样还嫌慢,那就把位图保存成类变量,即时刷新。 需要画线时,再更新位图。
龍过鸡年 2010-12-10
  • 打赏
  • 举报
回复
你指的被动刷新是什么意思?定时刷新?
chensan 2010-12-10
  • 打赏
  • 举报
回复
谢谢楼上的2位,但这样肯定要主动刷新整个背景吧?如果绘画的速度很快,并且折线很多,就很耗cpu了。
龍过鸡年 2010-12-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 youyubianyuan 的回复:]
自己在程序里画好图,然后然后返回一个bitbmp对象,建议参考zedGraph这个第三方控件.
[/Quote]

这个思路是对的,创建一个 Image 对象


Image img = new Bitmap(500, 500);
this.BackgroundImage = img;
using (Graphics g = Graphics.FromImage(img))
{
g.DrawLine(/*...*/);
g.Save();
}
youyubianyuan 2010-12-10
  • 打赏
  • 举报
回复
自己在程序里画好图,然后然后返回一个bitbmp对象,建议参考zedGraph这个第三方控件.
龍过鸡年 2010-12-10
  • 打赏
  • 举报
回复

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

111,092

社区成员

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

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

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