我做了一个控件,继承自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);
具体代码:
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);
我以前也写了一个控件,自己写paint部分的代码,后来发现也是闪的比较厉害.constructor TCustomCellGrid.Create(AOwner: TComponent);
var
i,j:integer;
begin
inherited;
DoubleBuffered := True;
我是在form1.canvas是作图,作好后再copy到一个image控件上。
作图时一点也没有屏幕闪动,但copy时,要闪动一次,这大概无法避免吧!
如果有其他控件的绘制,设该控件的缓冲为假。
你的那次闪动是IMAGE自动重绘产生的.用PAINTBOX就没了!