2

背景SendMessage(): 私のクライアントには、C で効果的に実装された非常に広範な独自のフォーム ライブラリがあります (実際には、これは基本的に Windows コントロールをラップし、SetStyle()、 などと対話する独自のオブジェクト指向言語です)。

解決したい問題: 上記のフレームワークで実装されたアプリでトップレベル ウィンドウをドラッグ/サイズ変更 (またはスプリッターをドラッグ) すると、大きなちらつきが発生します。最上位のウィンドウが再描画され、そこに含まれるすべてのコントロールが再描画されます。

質問 1 : フォーム ライブラリに外科的にダブル バッファリングを導入する方法はありますか。特に、標準の Windows GDI 関数を使用してダブル バッファリングを実装できるかどうかを知りたいです。

たとえばトップ レベル ウィンドウのすべての子ウィンドウも自動的にダブル バッファリングされるように、トップ レベル ウィンドウをダブル バッファリングできるとします。さらに良い代替手段は、任意のウィンドウにダブルバッファリングを導入し、そのすべての子にこれを継承させることです。

最善の解決策はBeginPaint()、個々のコントロール クラスごとに特別なコードを記述する必要がないように、子コントロールの関数がオフスクリーン バック バッファーの DC にハンドルを返すようにすることです。

質問 2 : 一般的な Windows コントロール (EDIT、BUTTON など) をダブル バッファで描画させる方法 (フラグのセットなど) はありますか? これは、利用するためのバック バッファーをシームレスに提供するより一般的なアプローチよりも悪い解決策ですが、許容できる場合もあります。

すべてのヘルプは大歓迎です。何か明確にできることがあれば教えてください。

4

2 に答える 2

3

ウィンドウのダブルバッファリングを有効にする拡張ウィンドウ スタイルであるWS_EX_COMPOSITEDを調べます。コントロールの親にこのスタイルを設定するだけで十分な場合があります。

于 2013-05-13T16:22:17.670 に答える
0

実際には、すべてのウィンドウ描画コードを C# を実行する C でラップできる可能性があります。そうすれば、すでにダブル バッファーの実装ができています。

スクロール時にWindows.Formsカスタムコントロールのちらつきをなくすには?

于 2013-05-13T16:00:24.733 に答える