10

サイズが変更されるダイアログがあります。また、WM_ERASEBKGND 呼び出し (現在は FillSolidRect への単純な呼び出し) に応答してペイントするカスタム背景もあります。

ダイアログのサイズを変更すると、途方もないちらつきが発生します。ちらつきを減らすために、すべての子ウィンドウを列挙してクリッピング領域に追加します。これで少しは改善されたようです。今では、すべての子コントロールが再描画されるときにちらつきがほとんど明らかになっています。

サイズ変更中にダイアログがちらつかないようにするにはどうすればよいですか? ダブルバッファリングが役割を果たさなければならないと思いますが、子コントロールを持つダイアログでそれを行う方法がわかりません(すべての子コントロールをオーナー描画などにしないでください)。

純粋な Win32 ベースのソリューションは歓迎されますが、私は C++ (.NET ではない) と MFC を使用していることに注意してください :)

注:私が試したものの、うまくいかなかった(理由がわからない)ことの1つは次のとおりです。

CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.FillSolidRect(rect, backgroundColor);

pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
4

6 に答える 6

10

「FillSolidRect」が背景の消去であると仮定すると、WM_ERASEBKGND から TRUE が返されます。

コード フラグメントでほぼ行っているダブル バッファリングを行うには、CreateCompatibleBitmap を使用し、それを memDC に選択する必要があります。

于 2008-10-19T09:47:47.477 に答える
6

OnInitDialog 関数に次の行を追加してみてください。

    ModifyStyle(0, WS_CLIPCHILDREN, 0);
于 2008-10-02T23:04:24.250 に答える
5

WinXP以降を対象としている場合は、WS_EX_COMPOSITEDスタイルを使用して、このスタイルのトップレベルウィンドウのデフォルトでダブルバッファリングを有効にすることもできます。これには独自の制限があることに注意してください。具体的には、GetDCなどを使用してOnPaintサイクルを引き出す必要はありません。

于 2008-12-31T20:00:59.563 に答える
5

WM_ERASEBKGND 処理では何もせず、メインの WM_PAINT の一部として消去を行います。無効な領域のみを再描画するように賢くペイントするか、より簡単に描画をダブルバッファリングすることができます。

消去バックグラウンドで何もしないことで、すべての描画コードが 1 つの場所にあるため、他のユーザーが簡単にフォローして維持できるようになります。

于 2008-10-02T22:01:05.153 に答える
4

InvalidateRect メソッドへの呼び出しのパラメーターを false に設定できます。これにより、ウィンドウが再描画されるときに WM_ERASEBKGND を送信できなくなります。

于 2013-02-12T09:55:13.273 に答える
3

ダブルバッファリングは、これを機能させる唯一の方法です。

子コントロールは、あなたが確認している限り、自動的に処理されますCLIPCHILDREN

于 2008-10-02T21:49:56.897 に答える