バックグラウンドイベントの消去を無効にします。wxWidgetsが表示を更新したい場合、2つのイベントを発行します。背景の消去イベントとペイントイベントです。バックグラウンド消去イベントには空のメソッドを実装する必要があります(つまり、EVT_ERASE_BACKGROUNDイベントをインターセプトし、event.Skip()を呼び出さないでください)。
ビットマップはパネル全体をカバーするため、背景を消去する必要はありません。
wxClientDCを使用する理由は、「EVT_PAINT()ハンドラー内でwxPaintDCを使用すると、クリッピング領域がウィンドウの損傷した領域に自動的に設定されるためです。この領域の外側に描画しようとしても表示されません。」
クリッピング領域に問題があるため、クリッピング領域を無視すると問題が解決します。
これについては、wxPaintDCおよびwxClientDCクラスリファレンスドキュメントの詳細な説明セクションで説明されています。
これが「より良い」答えのスケッチです。これは、タイマーとすべてのソリューションを再描画するよりもはるかに複雑ですが、システムリソースがはるかに質素であるという意味で優れているため、アプリケーションの応答性が向上します。
2つのことが必要です。
ビットマップを表示するためのより高速な方法
ビットマップの損傷した領域のみを再描画します。
(注:wxPaintDCでDrawBitmapを使用すると、実際にはビットマップ全体が処理され、出力がクリップされます)
ビットマップの一部の表示を高速化するには、ビットマップをメモリDCに描画し、これをどこかに手元に置いておく必要があります(このソリューションはメモリに問題はありませんが、最近のコンピュータでは通常問題にはなりません)。必要な部分をwxPaintDCにブリットすることができます。
wxMemoryDC memdc;
memdc.SelectObject(bitmap);
dc.Blit( ...
Blitパラメータの説明は次のとおりですhttp://docs.wxwidgets.org/2.8/wx_wxdc.html#wxdcblit
損傷した領域だけを処理するには、GetUpdateRegionを呼び出して、リージョンイテレータを使用してreutunを処理する必要があります。スクロールされたパネルを使用しているようです。更新領域は、ビットマップの論理領域ではなく、ウィンドウのクライアント領域に基づいているため、これを考慮する必要があります。
wxRegionIterator upd(GetUpdateRegion());
while ( upd )
{ wxRect rect(upd,GetRect());
// calculate damaged rectangle in terms of your complete bitmap
...
// blit the calculated rectangle from bitmap in memoryDC to damaged recatngle in wxPaintDC
...
upd++;
{