我觉得单纯使用delphi的doublebuffered不是一个很好的解决方案。
因为doublebuffered时, form上所有控件(不管是否需要更新的)都将重画,当然它是重画到后台内存中。
即使form上只有一个点像素发生了改变也将引起整个from的所有子控件重画到后台图片中--包括那些被其它wincontrol遮住的部分,然后再将后台图片中改变的那个点重画到前台(这个是windows根据UpdateRegion决定的),这种情况下99%的重画工作都是浪费的。
尽管所有control重画前都将通过RectVisible这个api检测自己是否有必要重画,但由于doublebuffered时后台图片没有设定clipregion, 因此这个检测的结果总是要重画的(尽管事实上它是被整个遮住了), 这将造成极大的浪费(尤其是form上充满各种需要复杂处理的图片时)。
所以一个变通的办法就是截获form的WM_PAINT消息, 在BeginPaint前获取UpdateRegion,然后用doublebuffered的实现方法--建立后台图片,将获取的UpdateRegion作为这个图片的ClipRegion然后调用WM_ERASEBKGND和原来的PaintHandler方法。这样可以大幅减少不必要的重画过程(根本不必担心未重画的部分造成后台图片不正确, 因为这部分永远不会出现在屏幕上)。