
delphi 图形显示
我在做delphi图形显示界面,类似于示波器的功能。用内存设备画的图形。实时采集到的数据存在一个链表里,然后用定时器查询链表绘图。波形的横向跟垂向大小可以改变。现在是如果...
我在做delphi图形显示界面,类似于示波器的功能。用内存设备画的图形。实时采集到的数据存在一个链表里,然后用定时器查询链表绘图。波形的横向跟垂向大小可以改变。现在是如果一次绘图点数少的话,波形移动很快,甚至有抖动现象,如果多的话就慢了下来,不知道这个问题可以怎么解决,望能指导。
展开
1个回答
展开全部
最近工作搞一个控件,界面比较花哨,所以闪屏,双缓冲,结果一些问题。
ps:delphi双缓冲的最简单方法直接设置:doubleBuffered:=true;注意这个属性只有继承自TCustomControl的才有。
所以使用的时候一定要看看类的继承图。
正题,结果还有一个面板在闪,我已经设置了doublebuffered了。网上看了些资料,结合自己的情况,这个面板的没有用DRaw方法在上面绘图,直接设置的背景色,这个和网上说的擦除有一定的关系。
PS:
//----------------------------------------------------------------------
窗口重绘时,会先发送WM_ERASEBKGND,再发送WM_PAINT,前者负责刷背景为底色,后者负责绘图。正因为窗口重绘的两次绘图操作,才造成了画面闪烁的结果。
双缓冲的意义和方法:
将两次绘图操作并为一次,即可结果闪烁的问题。
所以首先响应WM_ERASEBKGND,直接返回TRUE或者FALSE都可以,不要做多余的动作。
在WM_PAINT的响应函数里面(文档类在OnDraw()里面),先创建一张大小合适的位图和一个兼容的内存DC,将位图选到内存DC里面,将此内存DC刷为背景色,所有绘图操作往它身上砸,砸完以后,用BitBlt一次性画到窗口DC上即可解决闪烁问题。
关键:
尽量减少对窗口DC的操作次数!
//-----------------------------------------------------------------------------
上面的话不是我说的。
解决方法:
重载procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
把这句写在类的声明区域
然后ctl+shift+c(别说你没有用过这个组合键)。
procedure TRight2BarControl.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
Message.Result:=1;
end;
这样写了,果然有变化,之前面板闪的是白条,现在是黑条了,因为面板是深灰色滴,所以黑条没有那么刺眼。可是不能就这样结束了。
继续分析代码,发现要这个控件重绘的代码是:
ffff.repaint;然后继续看repaint方法,结果发现这个没有重载,他直接用的TWinControl的repaint方法
procedure TWinControl.Repaint;
begin
Invalidate;
Update;
end;
先屏蔽ffff.repaint;发现果然面板什么事都不敢了,连我们想要他干的他也不干了。
ok,重载他
procedure repaint;override; ctrl+shift+c
现在在里面写上我想要的效果,就四边的边缘 绘图,中间区域什么都不弄,好滴,果然不闪了。
搞了这么多天终于搞定了。
ps:delphi双缓冲的最简单方法直接设置:doubleBuffered:=true;注意这个属性只有继承自TCustomControl的才有。
所以使用的时候一定要看看类的继承图。
正题,结果还有一个面板在闪,我已经设置了doublebuffered了。网上看了些资料,结合自己的情况,这个面板的没有用DRaw方法在上面绘图,直接设置的背景色,这个和网上说的擦除有一定的关系。
PS:
//----------------------------------------------------------------------
窗口重绘时,会先发送WM_ERASEBKGND,再发送WM_PAINT,前者负责刷背景为底色,后者负责绘图。正因为窗口重绘的两次绘图操作,才造成了画面闪烁的结果。
双缓冲的意义和方法:
将两次绘图操作并为一次,即可结果闪烁的问题。
所以首先响应WM_ERASEBKGND,直接返回TRUE或者FALSE都可以,不要做多余的动作。
在WM_PAINT的响应函数里面(文档类在OnDraw()里面),先创建一张大小合适的位图和一个兼容的内存DC,将位图选到内存DC里面,将此内存DC刷为背景色,所有绘图操作往它身上砸,砸完以后,用BitBlt一次性画到窗口DC上即可解决闪烁问题。
关键:
尽量减少对窗口DC的操作次数!
//-----------------------------------------------------------------------------
上面的话不是我说的。
解决方法:
重载procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
把这句写在类的声明区域
然后ctl+shift+c(别说你没有用过这个组合键)。
procedure TRight2BarControl.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
Message.Result:=1;
end;
这样写了,果然有变化,之前面板闪的是白条,现在是黑条了,因为面板是深灰色滴,所以黑条没有那么刺眼。可是不能就这样结束了。
继续分析代码,发现要这个控件重绘的代码是:
ffff.repaint;然后继续看repaint方法,结果发现这个没有重载,他直接用的TWinControl的repaint方法
procedure TWinControl.Repaint;
begin
Invalidate;
Update;
end;
先屏蔽ffff.repaint;发现果然面板什么事都不敢了,连我们想要他干的他也不干了。
ok,重载他
procedure repaint;override; ctrl+shift+c
现在在里面写上我想要的效果,就四边的边缘 绘图,中间区域什么都不弄,好滴,果然不闪了。
搞了这么多天终于搞定了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询