delphi 图形显示

我在做delphi图形显示界面,类似于示波器的功能。用内存设备画的图形。实时采集到的数据存在一个链表里,然后用定时器查询链表绘图。波形的横向跟垂向大小可以改变。现在是如果... 我在做delphi图形显示界面,类似于示波器的功能。用内存设备画的图形。实时采集到的数据存在一个链表里,然后用定时器查询链表绘图。波形的横向跟垂向大小可以改变。现在是如果一次绘图点数少的话,波形移动很快,甚至有抖动现象,如果多的话就慢了下来,不知道这个问题可以怎么解决,望能指导。 展开
 我来答
TheFiend
2009-09-01 · TA获得超过626个赞
知道大有可为答主
回答量:1346
采纳率:0%
帮助的人:1238万
展开全部
最近工作搞一个控件,界面比较花哨,所以闪屏,双缓冲,结果一些问题。

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

现在在里面写上我想要的效果,就四边的边缘 绘图,中间区域什么都不弄,好滴,果然不闪了。

搞了这么多天终于搞定了。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式