不用找例子,TWinControl 源码中的 WMPaint 过程就是一个很好的例子。它用双缓冲的意义仅仅是响应 Paint 事件时不至于闪烁。你可以稍微修改一下,去掉无用的代码:
procedure TWinControl.WMPaint(var Message: TWMPaint);
var
DC, MemDC: HDC;
MemBitmap, OldBitmap: HBITMAP;
begin
if Assigned(Parent) and Parent.DoubleBuffered then
begin
inherited;
exit;
end;
DC := GetDC(0);
MemBitmap := CreateCompatibleBitmap(DC, Width, Height);
ReleaseDC(0, DC);
MemDC := CreateCompatibleDC(0);
OldBitmap := SelectObject(MemDC, MemBitmap);
try
DC := Message.DC;
在这里向 MemDC 上画图...
BitBlt(DC, 0, 0, Width, Height, MemDC, 0, 0, SRCCOPY);
finally
SelectObject(MemDC, OldBitmap);
DeleteDC(MemDC);
DeleteObject(MemBitmap);
end;
end;
如果你写的是一个画图的控件,那么你可以用一个预先定义好的 Bitmap 替换上面动态生成的 Bitmap,因为即时生成和销毁 Bitmap 要耗费很多系统资源,闪到是不闪了,拖动时会产生延迟...