我用了一个image控件,在image.canvans上画了一段曲线,但是这幅曲线要定时更新。请问我更新前,怎么把先前画的曲线擦除?同事说,vb里有专门的清屏语句,不知道delphi里有没有?
请各位大侠指点迷津阿!
请各位大侠指点迷津阿!
解决方案 »
- 如何用流把Stringgird导到做好的Excel模板
- delphi中怎样实现文件差异复制?
- 关于IE Bar 菜单问题
- 请问ehlib中的那个DEMO1中点击GRIDEH1时弹出另一个窗口是如何实现的?
- 这个问题,在我脑中都创建了1000个“线程”了,快崩溃了
- 如何访问oracle数据库中的数据表数据? -- 急!!!!
- 十万火急,在线等,一个小问题?
- 请问使用 IDPOP3 怎么样得到附件名称,大小,又该如何下载下来?
- 想查出当年,当月,当日的数据,sql怎么写
- 如何叛断当前目录下有一个指定目录?
- Delphi中怎样链接ORACLE,ADO可以吗?
- 回车可以用'key=#13'表示,那'Esc'可以用什么来表示啊?还有什么可以模拟'shift'键?在线等
procedure TForm1.drawtest();
var
i:integer;
x0:integer;
y0:=integer;
xexch: array[0..11]of integer;
mexch: array[0..11]of integer;
begin
x0:=0;
y0:=0;
for i:=0 to 11 do
begin
xexch[i]:=x0;
mexch[i]:=y0;
x0:=x0+10;
y0:=y0+10;
end; for i:=0 to 10 do
begin
image1.Canvas.MoveTo(xexch[i],mexch[i]);
image1.Canvas.LineTo(xexch[i+1],mexch[i+1]);
//连接各点画出曲线
end;
end;
begin
Brush.Color := clWHite; //白色
FillRect(Image1.ClientRect); //用白色填充
...下面画线
end
这样的方法我也想到过,可是,这只是用背景色把原先的曲线盖住了,我的定时器十秒钟更新
一次,这样子的话,会不会出问题,这方法很笨也不科学啊
谢谢你在百忙中,给我回复,不过我还是不太明白,可能我是初学者的原因,如果大侠不闲麻烦的话,能否在写得详细点,我在定时器计时procedure 中该怎么写。type
....
tmimage:timage;
...
procedure tform1.drawline();
var
i:integer;
xexch: array[0..11]of integer;
mexch: array[0..11]of integer;
begin
for i:=0 to 10 do
begin
tmimage[i] := image1
image1.Canvas.MoveTo(xexch[i],mexch[i]);
image1.Canvas.LineTo(xexch[i+1],mexch[i+1]);
//连接各点画出曲线
end;
end;
procedure tform1.timr1ontimer(...);
begin
end;
因为,做这个程序,不可能背景什么也没有!!!
让你擦来擦去,那背景呢?
给些有建设性的方法
我等了很多天了
------------
如果说背景不是单色,而是一幅图片,那也只怪你提问的时候没有说清楚。但是原理是一样,画一个BITMAP到画布上也花不了多少时间。
说用某个色彩填充背景(FillRect)的方法不科学,那么我真不知道科学的方法是什么了
说用某个色彩填充背景(FillRect)的方法不科学,那么我真不知道科学的方法是什么了
----------------------
是这样,我用了两个Timage重叠放置,上的transparent:=true;
如果不用擦除,fillrect会挡住下面的图,就是这么简单的原因
所以不能用fill的方法,我想用擦线的方法最好,还有
画bitmap到花布用不了多少时间是不假,但是在存在高像素,或高彩的时候,而且图像稍微一多,马上就能感觉到,
image1和image2
1是顶层,2是底层
RubberSize、Pic_X、Pic_Y是我自己设的变量
分别是image的大小和鼠标的位置
如果你想全部擦除,改变Pic_X、Pic_Y的值就行了Procedure TForm1.ClearUp;
Var
Bmp : TBITMAP;
Begin
Bmp := TBitmap.Create; //创建位图
Bmp.PixelFormat := Image2.Picture.Bitmap.PixelFormat; //设置位图格式
Bmp.Width := RubberSize; //设置位图大小
Bmp.Height := RubberSize;
BitBlt(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height,
Image2.Picture.Bitmap.Canvas.Handle, Pic_X - 5, Pic_Y -
5, SRCCOPY); //从地层拷贝位图到位图,
Image1.Canvas.Draw(Pic_X - 5, Pic_Y - 5, Bmp); //复制位图到顶层相应位置,达到擦除效果
Bmp.Free;
End;记得打开image容器的DoubleBuffered 例如
panel1.DoubleBuffered := True; //打开双缓冲,避免闪烁
Bmp : TBITMAP;
Begin
Bmp := TBitmap.Create; //创建位图
Bmp.PixelFormat := Image2.Picture.Bitmap.PixelFormat; //设置位图格式
Bmp.Width := Image1.Width; //设置位图大小
Bmp.Height := Image1.Height;
BitBlt(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height,
Image2.Picture.Bitmap.Canvas.Handle, 0,0, SRCCOPY); //从地层拷贝位图到位图,
Image1.Canvas.Draw(0, 0, Bmp); //复制位图到顶层相应位置,达到擦除效果
Bmp.Free;
end;
image.repaint;
array(x,y,color)
第一次画的时候:(x,y)纪录该点,color=该点原色 XOR 画笔颜色
下一次画之前:(x,y)点颜色=color XOR 画笔颜色