用Image1.Canvas.CopyRect速度最快,不会闪烁
解决方案 »
- 求大神给个例子delphi7如何往sybaseESP5.1上发送数据呢,没装sybase数据库(50分求个例子)
- delphi怎么解压*.zip文件啊
- 如何禁止WebBrowser执行脚本?
- 怎么用rave 做报表
- listview如何实现换行?在线等待...
- 把一个自已做的复合控件放在窗口上,改变大小后怎么能拦节消息?
- delphi比java强在那??各位大侠指点一下,有理者立即得分
- 高分,散分
- 怎么知道Microsoft Outlook或著Oulook Express已经打开了?如果打开了,怎样关闭它?
- 请问一个memo控件的问题
- 重载窗体的Create方法时出现错误!
- WINDOWS消息和HANDLE在帮助的那个位置?
那我告诉你吧!你用3个Image!
第一个和第二个不显示。动态重绘时,把第一个Assign给第二个,在第二个上面重画,然后把第二个Assign给第三个。绝对不会闪烁!
我需要这样动态重绘画布:
1:画布上有很多图元;
2: 我选择一个或者多个图元;
3:在MouseMove事件中,移动图元;移动方式为:
A:清除原来的图元;
B: 根据新的坐标重绘此图元这时候会发生背景图可见,但在移动过程中,全部的图元都看不见,
只有在MouseUp后,图元才可见。
很简单,改用DelphiX控件
应该是BitBlt吧!只有用双缓冲技术了,DFW上应该有
刷新快还是有
用paintbox如果移动窗体到屏幕外再回来,图会被擦掉!
需要动态重画屏幕而不闪烁,是要用 PaintBox,不然直接显示在 Form 上也行,呵呵…… 为什么呢?因为 Image 没有 OnPaint 这个事件,如果用 Draw 或是 RePaint 方法,都会产生闪烁,即使用 PaintBox 也一样!
要消除闪烁,当然要用 BitBlt 这个API函数,而对 Image 用这个函数有什么问题呢?BitBlt 过去的位图不显示!只有在 RePaint/Refresh 以后才会显示,而这时闪烁就发生了。用 PaintBox 就一切 OK 了。
“用paintbox如果移动窗体到屏幕外再回来,图会被擦掉!”——没错!因为这时,Image 也好,PaintBox 也好,都被 RePaint 了。所以,就要用到 OnPaint 这个事件了。
总之,Image 控件是用来显示位图的,而 PainBox 是用来画图的,掌握了它们的特性,才能得心应手。
var
Form1: TForm1;
ly,lx:integer;
mygraphy:Tbitmap;
implementation{$R *.DFM}procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
PaintBox1.canvas.Draw(lx,ly,mygraphy);
end;procedure TForm1.Timer1Timer(Sender: TObject);
begin
lx:=lx+1;
ly:=ly+1;
paintbox1.Repaint ;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
mygraphy:=Tbitmap.Create;
mygraphy.LoadFromFile('C:\WINDOWS\Desktop\ww.bmp');
end;procedure TForm1.BitBtn1Click(Sender: TObject);
begin
timer1.Enabled :=not timer1.Enabled;
end;
Tpaintbox 没有这个属性呀!!
1、 holoboy ()、hxshanji(洪兴山鸡)、shadowno(龙门无影)、都是你吧,你到底有几个名字?
2、上面就是全部源代码吗?好坏姑且不说,这样的程序会产生内存泄露啊!
3、你的思路不对。用 Draw 重画,用 Repaint 擦除?不闪烁才有鬼啦!
4、前面说的,你到底有没有在看啊!
不是。我就是我。
我有一个方法,也许不闪烁
back: TBitmap; ///背景层
tran: TBitmap; ///过渡层
ibmp: TBitmap; ///其它图元procedure TForm1.MouseMove(...)
begin
/////先拷贝背景图
tran.Canvas.CopyRect(Rect(0,0,back.Width,back.Height),
tran.Canvas,Rect0,0,back.Width,back.Height));
////拷贝你的图元,可以设置透明
tran.Canvas.Transprent := true;
tran.Canvas.TransprentColor := Tran.Canvas.Pixls[1,1];
tran.Canvas.CopyRect(rect(..),ibmp,
Rect(0,0,ibmp.Width,ibmp.Height));
end;/////Timer的Interval设有40ms,要保证每秒最少有25帧
procedure TForm1.Timer1Timer(Sender: TObject);
begin
PaintBox1.canvas.Draw(lx,ly,tran);
end;
正如楼上所说,使用内存中的TBitmap控件是一个比较有效的方法.至于是否使用PaintBox我倒是觉得无关痛痒.此外如果看不到刷新后的图像的话,调用一下父窗口的Refresh或者Invalidate就可以了.其实速度还是很快的.