- PR -

描画時のちらつき抑制について

投稿者投稿内容
会議室デビュー日: 2006/12/11
投稿数: 4
投稿日時: 2006-12-11 15:00

何時も拝見させていただいています。
今回、画面描画時のちらつきについて問題が発生し、
その抑制方法についてお知恵を拝借したく投稿いたしました。

環境はOSがXP、言語がC#、Windowsフォームです。

コンテナコントロールの上に50個のボタンコントロールを配置し
実行したところ、初期表示時、コンテナのVisible変更時に
ボタンがパラパラと表示されてしまいます。

ダブルバッファを適用すればちらつきが抑制されるらしいので
コンテナ、ボタンを継承して独自にコントロールを作り、
ダブルバッファを適用してみてもパラパラと表示されるのは直らず
ならばコンテナ側のOnPaintにてボタンを自分で描画すれば
ちらつきには感じないのではないかと思い試してみたのですが
ボタンの描画処理のせいかボタンの領域が一度クリアされ
結局パラパラと表示されてしまいます。

ネットでちらつきに関して検索してもダブルバッファや
Graphicsによる自力描画についてで解決の糸口が掴めません。
#私の検索の仕方が悪いのかもしれませんが

このような問題について何か知っておられれば
情報を教えていただきたくお願い申し上げます。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2006-12-11 15:57

  1. パフォーマンスに関する場合、CPU(種類、クロック数)、搭載メモリも提示した方がいいかもしれない。
    場合によっては、搭載メモリの増設によって解決するかもしれないから。
  2. 開発環境のバージョンがかかれていない。もし.net framework 2.0なら、From.DoubleBufferedというプロパティがあるので、試してみては?


引用:

コンテナコントロールの上に50個のボタンコントロールを配置し
(snip)


この時点で、既にイタタタだけど、あえて言及はしない。
会議室デビュー日: 2006/12/11
投稿数: 4
投稿日時: 2006-12-11 16:34
返信ありがとうございます。
情報が足りませんでした、申し訳ありません。

引用:

かずくんさんの書き込み (2006-12-11 15:57) より:

  1. パフォーマンスに関する場合、CPU(種類、クロック数)、搭載メモリも提示した方がいいかもしれない。
    場合によっては、搭載メモリの増設によって解決するかもしれないから。
  2. 開発環境のバージョンがかかれていない。もし.net framework 2.0なら、From.DoubleBufferedというプロパティがあるので、試してみては?



 1.Intel Celeron 1GHz 512Mです。
   メモリの増設は業務的に不可能です。
   
 2..NET framework 2.0で開発しています。
   ダブルバッファの設定は上記プロパティにて行っています。
   フォームにも設定してあるのですが綺麗に表示されません。

引用:

引用:

コンテナコントロールの上に50個のボタンコントロールを配置し
(snip)


この時点で、既にイタタタだけど、あえて言及はしない。


 これも言葉足らずでした。
 これはちらつきが発生したのでテスト用に作ったものです。
 分かりやすく大量のコントロールを配置してちらつきテストしていました。

全てのコントロールの描画が終わるまで表示を待つ。
といった事は出来ないものなのでしょうか?
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2006-12-11 18:00
昔から知られている方法は、

  1. 低レベルWindowイベント、WM_SETREDRAWを送る。引数0で送れば描画停止、引数1で送れば描画再開
  2. LockWindowUpdateで描画を止めるたり、再開したりする。


どちらも、低レベル処理(直接Windows APIに触る)になるので、敷居は高くなります。
また、Windows限定になります。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-12-11 18:27
引用:

唄さんの書き込み (2006-12-11 16:34) より:
全てのコントロールの描画が終わるまで表示を待つ。
といった事は出来ないものなのでしょうか?


Invalidate→Updateとかはダメかいな。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-12-11 18:55
引用:

全てのコントロールの描画が終わるまで表示を待つ。
といった事は出来ないものなのでしょうか?


SuspendLayout→ResumeLayoutとかはダメかいな。
#自信なし。
_________________
囚人のジレンマな日々
しましま
常連さん
会議室デビュー日: 2005/01/08
投稿数: 41
投稿日時: 2006-12-11 19:28
.NETはそれほど詳しい訳ではないのですが。

Form.DoubleBufferedプロパティって、正確にはControl.DoubleBufferedプロパティですよね?
.NETでは、というかWin32APIでは、コントロールを載せているFormも、そのコントロール自体であるButtonも同じControlで、描画もControl単位で個別に行われているようですから、DoubleBufferedを設定しても、50個あるButtonが個別にダブルバッファするだけで、50個トータルでダブルバッファになっている訳ではなさそうですね〜。

たぶんこれは、.NETの、というかWin32APIの仕様のように見えるので、正攻法での解決は難しいのではないかと思います。

綺麗にダブルバッファ処理をするなら、Controlを継承しない独自のコントロールを作ってFormの内部を描画する形になるのかな。とっても面倒ですが。
会議室デビュー日: 2006/12/11
投稿数: 4
投稿日時: 2006-12-12 14:55
返事が遅くなりまして申し訳ありません。
別件で障害が発生し対応に追われていました。

皆様から教えて頂いた方法を試してみて
ちらつきが抑制されるか試してみたいと思います。

結果についてはまた後ほど御報告させていただきます。

スキルアップ/キャリアアップ(JOB@IT)