在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);
}

请问怎么办?
...全文
214 点赞 收藏 15
写回复
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]
或者放某个方法里面,想画时调用方法
回复 点赞
whrspsoft3723 2010年12月10日
1 2 楼的都很好。
如样这样还嫌慢,那就把位图保存成类变量,即时刷新。 需要画线时,再更新位图。
回复 点赞
#blackheart 2010年12月10日
把下面代码放其他控件的事件里,比如Button,让某个事件去触发绘制线条

Graphics g = panel1.CreateGraphics();//用控件创建
g.DrawLine(new Pen(Color.Red), new Point(15, 15), new Point(15, 100));//画
回复 点赞
龍过鸡年 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);
}
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.4w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告