在窗口上面放置TImage对象,窗口创建Create同时,动态加载JPG图片,发现在切换不同带有Image的窗口时,闪烁特别严重。这是否和加载JPG图片时,TImage控件要先换算JPG成BMP,最后再显示有关?如何解决窗口与Image同步显示,这样看起来感觉可能会快些?!
大致代码如下:constructor TFamOrderBySpell.Create(AOwner: TComponent);
begin inherited Create(AOwner);
BackGround.Picture.LoadFromFile('BackGround\Spell.jpg');end;TFamOrderBySpell = class(TFrame)
...
大致代码如下:constructor TFamOrderBySpell.Create(AOwner: TComponent);
begin inherited Create(AOwner);
BackGround.Picture.LoadFromFile('BackGround\Spell.jpg');end;TFamOrderBySpell = class(TFrame)
...
如果直接在Image.Canvas上画,效果差不多。如果直接可以在Frame上面画,效果可能会好些,该如何实现?
constructor TFamOrderBySpell.Create(AOwner: TComponent);
va
Jpeg: TJpegImage;
begin Jpeg := TJpegImage.Create;
Jpeg.LoadFromFile('BackGround\Spell.jpg');
inherited Create(AOwner);
//BackGround.Picture.LoadFromFile('BackGround\Spell.jpg');
BackGround.Canvas.StretchDraw(Rect(0,0,800,565),Jpeg);
Jpeg.Free;end;
效果的确比原来有明显的改善,大家有没有更好的办法?多献点点子吧。
如果Image是放在form1上面那就在oncreate事件写:form1.doublebuffer:=true;
就可以解决你那个问题了.
T C a n v a s对象与拷贝位图有关的是C o p y M o d e属性和C o p y R e c t方法,其中C o p y M o d e定义拷
贝的模式,而C o p y R e c t执行位图拷贝的操作。当C o p y M o d e定义为缺省值c m S r c C o p y时,
C o p y R e c t将源画布上的一部分位图拷贝到目标画布上的一个矩形区域内。C o p y R e c t的过程声明
及参数意义如下:
p r o c e d u r e C o p y R e c t ( D e s t : T R e c t ; C a n v a s : T C a n v a s ; S o u r c e : T R e c t ) ;
其中:
• Dest 目标画布上的矩形区域。
• Canvas 源画布。
• Source 源画布上的矩形区域。
例程S10_3 该例程以一个拉动特技的实现为例,说明如何用C o p y R e c t方法实现特技。
创建一个新的应用程序工程,在其中添加一个B u t t o n组件。添加B u t t o n组件的O n C l i c k事件
的处理过程如下:
procedure TForm1.Button1Click(Sender: TO b j e c t ) ;
c o n s t
S t e p = 2 0 0 ;
X0=20; // 左边界
Y0=20; // 上边界
v a r
B i t m a p : T B i t m a p ;
M i d X : I n t e g e r ; // 中间变量,当前步骤所拷贝位图的宽
R a t i o X : R e a l ; // 每步位图宽度增加量
I : I n t e g e r ;
Rect1,Rect2:TRect; // 源、目标矩形区域
b e g i n
B i t m a p : = T B i t m a p . C r e a t e ;
Bitmap.LoadFromFile('S10_3.bmp'); // 装入位图文件
R a t i o X : = B i t m a p . Wi d t h / S t e p ;
for I:=0 to Step do
b e g i n
M i d X : = R o u n d ( R a t i o X*I ) ;
with Rect1 do
b e g i n
L e f t : = B i t m a p . Wi d t h - M i d X ;
To p : = 0 ;
R i g h t : = B i t m a p . Wi d t h ;
B o t t o m : = B i t m a p . H e i g h t ;
e n d ;
with Rect2 do
b e g i n
L e f t : = X 0 ;
To p : = Y 0 ;
R i g h t : = X 0 + M i d X ;
B o t t o m : = Y 0 + B i t m a p . H e i g h t ;
e n d ;
Canvas.CopyRect(Rect2,Bitmap.Canvas,Rect1); // 复制位图
e n d ;
Bitmap.Free; // 释放位图资源
e n d ;
当单击B u t t o n组件后,位图从左侧出现并逐渐向右侧移动,好像位图被从左向右拉动一样,
拉动结束后位图左上角坐标为( X 0 , Y 0 )。
注意,运行前应该在工程文件所在的目录中创建一个名为S 1 0 _ 3 . B M P的位图文件。再有就是用bitblt函数(API)也一样!绝对不闪!