- PR -

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

投稿者投稿内容
会議室デビュー日: 2006/12/11
投稿数: 4
投稿日時: 2006-12-12 16:08
結果報告です。

WM_SETREDRAW
LockWindowUpdate
SuspendLayout→ResumeLayout
Invalidate→Update

上記4つをVisible変更処理の前後に記述して
試してみましたがやはりパラパラと表示されてしまいました。

描画は止められるのですが、再開後に描画が終わっているワケではなく
停止しているものが再開されるので結局パラパラと表示されてしまいます。

しましまさんの言うように正攻法での解決は難しいんですかね。
独自のコントロールを作るというのは出来るだけ避けたいです。

もう少し色々調べてみます。
みなさま情報ありがとうございました。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2006-12-12 19:36
唄さん、こんばんは。

↓以前、似たような話がありました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8950&forum=7&start=8
k_kazu
常連さん
会議室デビュー日: 2006/02/11
投稿数: 25
投稿日時: 2006-12-13 11:23
わたくしも、どうしてもちらつきを無くした描画を行いたいため、現在 WPF を使う方法を検討しています。
引用:

↓以前、似たような話がありました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8950&forum=7&start=8


ここで紹介されているコードでは、画面のプロパティーで Windows XP スタイルが選択されている場合に 描画が無限Loopしたり、Windows Vistaではボタンの廻りに黒っぽい領域が残った現象が発生しました。(描画の順番を無理やり「フォーム」→「ボタン」から「ボタン」→「フォーム」の順番に行ったことが原因でしょう。またすべてのボタンの描画終了タイミングを検出する方法も問題があります。)

一度は、独自コンポーネントを作って半透明&重ね合わせの可能なボタン・ラベルを作成したのですが、コンポーネントが自動で行ってくれる領域判定や、イベント処理を独自に実装しないと、使い勝手の良いコントロールにはならず、メンテナンス性が良くなかったので、結局採用しませんでした。

業務アプリケーション等で、画面のデザインが重視されない場合にはボタンのちらつきは我慢してもらって、見た目が重要視されるアプリケーションでは WPF を利用するのがいい案かと思います。
ひとつのアプリケーションの中で、Windows From と WPF フォームの相互運用もできそうなので必要に応じて使い分けるとよいかもしれません。
参考URL
Windows Presentation Foundation ガイド ツアー
http://www.microsoft.com/japan/msdn/windowsvista/general/wpf101.aspx
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2006-12-13 12:14
引用:

k_kazuさんの書き込み (2006-12-13 11:23) より:
ここで紹介されているコードでは、画面のプロパティーで Windows XP スタイルが選択されている場合に 描画が無限Loopしたり、


と、いうような事がありますので、

引用:

きくちゃんの書き込み (2004-01-30 12:33) より:
念のために補足しますが、前回提示したコードはあくまでもサンプルなので、適切に修正して下さい。あのままだとFormのPaintイベントが発生するたびに Form1_Paint が実行されてしまいますので...。

k_kazu
常連さん
会議室デビュー日: 2006/02/11
投稿数: 25
投稿日時: 2006-12-13 13:35
私も、きくちゃん さんの提示された方法でちらつきが防止されるなら・・と思って試してみたのですが、その結果 うまくいかなかった点を報告しただけで・・。
引用:

Windows XP スタイルが選択されている場合に 描画が無限Loopしたり、


これは、コーディングの仕方で回避できかもしれませんが、Windowsのメッセージループの処理中に別のWindowsメッセージを処理する事になり安定してどんな場合でも動作させえるコーディングは難易度が高いと感じました。
引用:

Windows Vistaではボタンの廻りに黒っぽい領域が残った現象が発生しました。


Vista で実行すると なぜか、ボタンの周りに黒っぽい縁が残りました、マウスを上に持っていくと黒い縁が消えるので、Paint処理の中で Application.DoEvents を呼び出した事が原因で、予期しない順番でWindowsメッセージが呼ばれたために発生した現象だと思いました。

以上 参考まで
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2006-12-13 20:56
k_kazuさん、こんばんは。

引用:

私も、きくちゃん さんの提示された方法でちらつきが防止されるなら・・と思って試してみたのですが、その結果 うまくいかなかった点を報告しただけで・・。


ああ、済みません、別に絡んでいるわけではありません。
そのまま使わないでね、という事を念押ししたかっただけです。

と、いうわけで取り敢えず元のサンプルは若干、修正しました。
(が、あくまでもサンプルはサンプルという事で、どーかひとつ)

引用:

Vista で実行すると なぜか、ボタンの周りに黒っぽい縁が残りました、


Vista の方については、Orcas がリリースされた後にでも試してみたいと思います。

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