在窗口上面放置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)
...

解决方案 »

  1.   

    是否可以先读到一个tjpeg里,然后再画到画布上,你可以试试
      

  2.   

    delphi带的例子就是这样处理的
      

  3.   

    我的窗口是从TFrame派生,好像不具备Canvas。
    如果直接在Image.Canvas上画,效果差不多。如果直接可以在Frame上面画,效果可能会好些,该如何实现?
      

  4.   

    目前代码改进如下:
    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;
    效果的确比原来有明显的改善,大家有没有更好的办法?多献点点子吧。
      

  5.   

    我不知你的Image放在那里,如果是放在Panel上面,那在oncreate事件中写:panel.doublebuffer:=true;
    如果Image是放在form1上面那就在oncreate事件写:form1.doublebuffer:=true;
    就可以解决你那个问题了.
      

  6.   

    利用Form的Canvas属性
    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)也一样!绝对不闪!