我做了一个控件,继承自TGraphicControl,在paint中采用了先创建一个兼容的Bitmap,然后在这里画图,最后将Bitmap中画好的图再BitBlt到当前Canvas中。使用这样的双缓存的方法就是想解决刷新时屏幕闪动的问题,可是依然闪动。各位高人有何办法?
具体代码:
    MemBitmap := CreateCompatibleBitmap(Canvas.Handle, ClientRect.Right, ClientRect.Bottom);
    MemDC := CreateCompatibleDC(Canvas.Handle);
    OldBitmap := SelectObject(MemDC, MemBitmap);
    DC:=Canvas.Handle;
    //为了避免再创建一个Canvas,就使用类中的,只是将DC付给了它
    Canvas.Handle:=MemDC;    BeginPaint(WindowFromDC(DC), PS);
    //使用Canvas绘图
    //将Canvas的HDC恢复
    //BitBlt
    EndPaint(WindowFromDC(DC), PS);    SelectObject(MemDC, OldBitmap);
    DeleteDC(MemDC);
    DeleteObject(MemBitmap);

解决方案 »

  1.   

    我来回答。你把图形控件放在PANEL控件中,再把PANEL控件的缓存属性设置为TRUE,这样能解决闪动。但如果图片很大的话,也许效果不太好
      

  2.   

    可以考虑继承自TWinControl,然后在控件的create的时候设定 DoubleBuffered := True
    我以前也写了一个控件,自己写paint部分的代码,后来发现也是闪的比较厉害.constructor TCustomCellGrid.Create(AOwner: TComponent);
    var
      i,j:integer;
    begin
      inherited;
      DoubleBuffered := True;
      

  3.   

    哦,非常巧,我也做过这样的工作!
    我是在form1.canvas是作图,作好后再copy到一个image控件上。
    作图时一点也没有屏幕闪动,但copy时,要闪动一次,这大概无法避免吧!
      

  4.   

    DoubleBuffered := True;
    如果有其他控件的绘制,设该控件的缓冲为假。
      

  5.   

    to: zzwu(未名)
    你的那次闪动是IMAGE自动重绘产生的.用PAINTBOX就没了!