用Image1.Canvas.CopyRect速度最快,不会闪烁

解决方案 »

  1.   

    你的条件真苛刻。
    那我告诉你吧!你用3个Image!
    第一个和第二个不显示。动态重绘时,把第一个Assign给第二个,在第二个上面重画,然后把第二个Assign给第三个。绝对不会闪烁!
      

  2.   

    我将问题说清楚一点:
    我需要这样动态重绘画布:
    1:画布上有很多图元;
    2: 我选择一个或者多个图元;
    3:在MouseMove事件中,移动图元;移动方式为:
       A:清除原来的图元;
       B: 根据新的坐标重绘此图元这时候会发生背景图可见,但在移动过程中,全部的图元都看不见,
    只有在MouseUp后,图元才可见。
      

  3.   


    很简单,改用DelphiX控件
      

  4.   

    改用DelphiX控件?是什么?那里有?
      

  5.   

    Image1.Canvas.CopyRect很快?
    应该是BitBlt吧!只有用双缓冲技术了,DFW上应该有
      

  6.   

    哎,把Image改成TPaintBox,就什么问题都没有了。
      

  7.   

    to:Kingron(对CSDN愤怒中……) 
    刷新快还是有
      

  8.   

    一,不要用autosize, 二,不要用stretch什么的将image设整成比真实的图像小一点点,也就是有一点点不显示,over
      

  9.   

    to:Kingron(对CSDN愤怒中……) 
    用paintbox如果移动窗体到屏幕外再回来,图会被擦掉!
      

  10.   

    哈哈,这两天我刚好在搞类似的咚咚,交流一下……
    需要动态重画屏幕而不闪烁,是要用 PaintBox,不然直接显示在 Form 上也行,呵呵…… 为什么呢?因为 Image 没有 OnPaint 这个事件,如果用 Draw 或是 RePaint 方法,都会产生闪烁,即使用 PaintBox 也一样!
    要消除闪烁,当然要用 BitBlt 这个API函数,而对 Image 用这个函数有什么问题呢?BitBlt 过去的位图不显示!只有在 RePaint/Refresh 以后才会显示,而这时闪烁就发生了。用 PaintBox 就一切 OK 了。
    “用paintbox如果移动窗体到屏幕外再回来,图会被擦掉!”——没错!因为这时,Image 也好,PaintBox 也好,都被 RePaint 了。所以,就要用到 OnPaint 这个事件了。
    总之,Image 控件是用来显示位图的,而 PainBox 是用来画图的,掌握了它们的特性,才能得心应手。
      

  11.   

    你用Delphi 6吗,我用Delphi 5做类似的程序不会出现这样的问题,但在Delphi 6下就会严重闪烁。
      

  12.   

    我的全部原代码如下:为什么还是会闪烁!!!!
    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;
      

  13.   

    怎么设置??????????
    Tpaintbox 没有这个属性呀!!
      

  14.   

    几点意见:
    1、 holoboy ()、hxshanji(洪兴山鸡)、shadowno(龙门无影)、都是你吧,你到底有几个名字?
    2、上面就是全部源代码吗?好坏姑且不说,这样的程序会产生内存泄露啊!
    3、你的思路不对。用 Draw 重画,用 Repaint 擦除?不闪烁才有鬼啦!
    4、前面说的,你到底有没有在看啊!
      

  15.   

    holoboy ()、hxshanji(洪兴山鸡)、shadowno(龙门无影)、都是你吧????
    不是。我就是我。
      

  16.   


    我有一个方法,也许不闪烁
    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;
      

  17.   

    在处理不需要直接显示的图形时,应该尽量避免使用TImage空间,
    正如楼上所说,使用内存中的TBitmap控件是一个比较有效的方法.至于是否使用PaintBox我倒是觉得无关痛痒.此外如果看不到刷新后的图像的话,调用一下父窗口的Refresh或者Invalidate就可以了.其实速度还是很快的.