一个关于清除现有屏幕,重新画屏的问题,有源码参考,请各位进来看看! ( 积分: 50 )

  • 主题发起人 主题发起人 hehaidaxue
  • 开始时间 开始时间
H

hehaidaxue

Unregistered / Unconfirmed
GUEST, unregistred user!
请教各位:下面是我在屏幕上的某一坐标范围类画的一些点
ADODS_TrendGraph.First;
X := (Img_TrendGraph.Width - 5 * 120) div 2 + 1;//46
while not ADODS_TrendGraph.Eof do
begin
DataValue := ADODS_TrendGraph['xl'];
Y := (Img_TrendGraph.Height - 30) - DataValue;//290-数据值
Img_TrendGraph.Canvas.Pixels[X, Y] := clWhite;
Img_TrendGraph.Canvas.Pixels[X + 1, Y] := clWhite;
Img_TrendGraph.Canvas.Pixels[X + 2, Y] := clWhite;
X := X + 5;
ADODS_TrendGraph.Next;
end;

我在下一次再画新的点的时候应该抹除上一个,于是我用了下面的语句:
Img_TrendGraph.Canvas.Brush.Style := bsClear;
Img_TrendGraph.Canvas.Brush.Style := bsSolid;
Img_TrendGraph.Canvas.Brush.Color := clblack;
Img_TrendGraph.Canvas.Rectangle(46, 20, 645, 290);//坐标范围
但是这样的效果不是很好,请教各位有没有更好的办法,谢谢。

说简单一些:在屏幕上的某一个坐标内画上一些离散的点,在发生某一事件的时候,清除现有坐标内的点,然后把新的点画上去。
 
请教各位:下面是我在屏幕上的某一坐标范围类画的一些点
ADODS_TrendGraph.First;
X := (Img_TrendGraph.Width - 5 * 120) div 2 + 1;//46
while not ADODS_TrendGraph.Eof do
begin
DataValue := ADODS_TrendGraph['xl'];
Y := (Img_TrendGraph.Height - 30) - DataValue;//290-数据值
Img_TrendGraph.Canvas.Pixels[X, Y] := clWhite;
Img_TrendGraph.Canvas.Pixels[X + 1, Y] := clWhite;
Img_TrendGraph.Canvas.Pixels[X + 2, Y] := clWhite;
X := X + 5;
ADODS_TrendGraph.Next;
end;

我在下一次再画新的点的时候应该抹除上一个,于是我用了下面的语句:
Img_TrendGraph.Canvas.Brush.Style := bsClear;
Img_TrendGraph.Canvas.Brush.Style := bsSolid;
Img_TrendGraph.Canvas.Brush.Color := clblack;
Img_TrendGraph.Canvas.Rectangle(46, 20, 645, 290);//坐标范围
但是这样的效果不是很好,请教各位有没有更好的办法,谢谢。

说简单一些:在屏幕上的某一个坐标内画上一些离散的点,在发生某一事件的时候,清除现有坐标内的点,然后把新的点画上去。
 
我想如果想要高速重绘的话,应该使用缓冲机制:
构造一个缓冲链,一般2个图面就好,然后一边绘制,一边翻转,就是把后台图画好,然后拷贝到窗口去,现在的显示卡都支持2维加速的,应该比你的方法快很多.DirectX一般就这么做.
 
Img_TrendGraph.Canvas.fillrect(rect(sx,sy,ex,ey));
 
清除现有点不要用Retangle或FillRect,可以把现有点用背景色重画一次,这样就不会产生闪烁了。
 
谢谢各位的指点。
survival的太高深了,我可能暂时用不上,不过很值得学学;
cui5555的方法我试了一下完全可以而且闪烁的不是很严重,因为我不需要频繁的刷屏;
yblee的方法也很好,但是我做不到重新用背景画,因为点很多,而且记录这些点的位置会花去程序的时间;
不知我的理解对不对,有不对的地方请指正,虽然结贴了,大家还可以发言的。
 
后退
顶部