首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

为什么小弟我用双缓冲了,绘图还是有闪烁,用的GDI+

2013-02-15 
为什么我用双缓冲了,绘图还是有闪烁,用的GDI+想绘制上面的圆圈的旋转,在内存中,用bitmap绘制,然后绘制好了

为什么我用双缓冲了,绘图还是有闪烁,用的GDI+


想绘制上面的圆圈的旋转,在内存中,用bitmap绘制,然后绘制好了,一次性用BitBlp绘制,让圆圈旋转,可是发现旋转的时候,图形会闪烁,到底怎么样才能不闪烁呢?



procedure TForm1.Tmr_2Timer(Sender: TObject);
var
  aImg:TBitmap ;
  CirImage:TGPImage ;
  gpImg:TGPGraphics ;
  pbleft,pbtop:single ;
  RotateP:TGPPointF ;
  gpMatrix:TGPMatrix;
  gpRec:TGPRectF ;
begin
  rotateAngle :=rotateAngle -10;
  aImg:= TBitmap.Create ;
  aImg.Width :=140;
  aImg.Height:=140;
  CirImage :=TGPImage.Create(WideString(ExtractFilePath(ParamStr(0))+'Images\66.png'));
  gpImg:=TGPGraphics.Create(aImg.Canvas.Handle );
  RotateP.X :=20+60;
  RotateP.Y :=20+60;
  gpMatrix :=TGPMatrix.Create ;
  gpMatrix.RotateAt(rotateAngle,RotateP ) ;
  gpImg.SetTransform(gpMatrix );
  gpRec.X :=20;
  gpRec.Y :=20;
  gpRec.Width :=120;
  gpRec.Height :=120;
  gpImg.DrawImage(CirImage,gprec) ;
  Self.Refresh ;//强行刷新窗体,让原来画的图清除
  BitBlt(Self.Canvas.Handle  ,0,0,140,140,aImg.Canvas.Handle ,0,0,SRCAND) ;
  aImg.Free ;
  CirImage.Free ;
  gpImg.Free ;

end;

[解决办法]
把事件写到paintbox里的Onpaint
定时器 传入参数和重画
  Self.Refresh ;//强行刷新窗体,让原来画的图清除   
这句不要
试试看。
[解决办法]
同意6楼,OnTimer事件里只写 Form.Repaint;
而在FormOnPaint中用Canvas.Draw就行了.
[解决办法]
你的InvalidateRect函数的最后一个参数是TRUE,就是要求擦除背景,只要有背景擦除一定会闪烁的,这个和你用不用多缓冲没关系,即使你不要求擦除背景,也难保delphi不会在哪一个函数里擦除背景,所以所有无效化或者会造成无效化的函数最好都不要用了。
其实最简单的办法就是重写WM_ERASEBKGND(上面的少了个GND,没记住呵呵),直接返回TRUE或者什么都不写(这只会影响到PAINTSTRUCT的一个参数,但都不会重绘背景),在WM_PAINT中进行缓冲区复制,这样就不会闪烁了。

热点排行