結局Bitmapを仮想画面として用意し、描画はそこに行います。そして、ApplicationのIdle時に一定間隔でOnPaintを呼び出し(実際にはInvalidate()を呼ぶ)、その中で、ビットマップをフォームのCanvasに直接描画する方法で解決しました。
ただしデフォルトの状態ではフォームは描画されるたびにクリアされ、そのたびにマップが点滅してしまうので、それを回避するためには以下の方法を使いました。
void __fastcall WMEraseBkgnd(TWMEraseBkgnd
&msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_ERASEBKGND,TWMEraseBkgnd,WMEraseBkgnd)
END_MESSAGE_MAP(TForm)
void __fastcall TMDIChild::WMEraseBkgnd(TWMEraseBkgnd
&msg)
{
msg.Result= 1;
}
コレで背景がいちいち消されなくなります。
この手法はC++Builderによるプログラミングのページの『マップメーカー』のソースを参考にさせていただきました。というか、そのままです(笑)