- ベストアンサー
ボタンの更新速度について
オーナー描画ボタンの更新速度について質問です。 ボタンの更新(ボタンの座標を変えた時)の時に、 ボタンの数が多い場合、更新が遅い(40個の時は約5秒)のですが、 何か原因があるのでしょうか? それとも、元々更新が遅いのでしょうか? ボタンの数は、増えたり減ったりするので多い場合でも更新を速くしたいです。 ソースは長いので載せる事が出来ません。 ちなみに、ボタンはこのサイトに載ってる様なものです。 http://wisdom.sakura.ne.jp/system/winapi/win32/win61.html 開発環境 XP Visual Studio 2005 C、C++でWindowsAPIを使用しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
複数のボタンの移動を開始する前に SendMessage(ボタンが置いてあるフォームのウィンドウハンドル, WM_SETREDRAW, 0, 0); で、ボタンが置いてあるフォームのウィンドウの再描画を抑止し、全ボタンをSetWindowPos()で移動。 全ボタンの移動が終わったら SendMessage(ボタンが置いてあるフォームのウィンドウハンドル, WM_SETREDRAW, 1, 0); で再描画の抑止を解除。 解除後、InvalidateRectで親フォームのウィンドウを無効化して強制的に親フォームを再描画させる。 とすれば「1個のボタンを移動するたびに親フォームを再描画しなくなり、最後に1回だけ親フォームを再描画する」ので、高速になると思います。
その他の回答 (2)
- machongola
- ベストアンサー率60% (434/720)
こんばんは。 SetWindowPos()で無数のボタン達を移動して重たくなっているのならば、恐らく各ボタンが移動される度に、再描画メッセージが発生して大変な事になっているのではないでしょうか。 以下はあくまで「賭け」と言う事になりますが、SetWindowPos()で移動する前に最後のパラメータへSWP_NOREDRAWのフラグを付加して、 http://msdn.microsoft.com/ja-jp/library/cc411206.aspx ボタンに再描画をさせない様に抑止をしてから移動を行います。 全ての移動が終わった後、再描画が成されないので、ボタンの表面が欠けたりします。 此れを防ぐ為、再描画メッセージとは関係なく、呼び出し一つで存在するボタンを総当りに描写して行く外部関数を準備しておき、其の関数で描画する・・・、と言ったところでしょうか。 勿論の事ながら、WM_DRAWITEM内には別方向からの再描画要求に応える為に、従来通りの描画処理が必要です。
お礼
出来ました。 教えて頂いた「SWP_NOREDRAW」のフラグの追加は、 どこか間違っていたのかもしれませんが、 出来なかったので、「chie65535」様の回答の「SendMessage()」を使って出来ました。 >恐らく各ボタンが移動される度に、再描画メッセージが発生して大変な事になっているのではないでしょうか。 確かにその通りです。 前からそれが気になっていたのですが、そういう物なんだと思ってました。 再描画の時にちらつきはありますが、プログラムを修正すれば直ると思います。 もし、直らないようであれば再度質問させて頂きます。 ありがとうございます。
- Wr5
- ベストアンサー率53% (2173/4061)
オーナードローしたことはありませんが… >ボタンの数が多い場合、更新が遅い(40個の時は約5秒)のですが、 >何か原因があるのでしょうか? >それとも、元々更新が遅いのでしょうか? いくら何でもそんなに遅いわけはないと思われます。 描画処理自体に無駄があるとかそういうことはないでしょうか? # WM_DRAWITEMでどの程度時間掛かっているか、timeGetTime()等で確認してみてはどうでしょう? 40個のボタンが本当に必要…なのでしょうか? 画面レイアウトなどの整理によって最大数を減らせたりしないのですか?
お礼
調べてみた結果、SetWindowPos()で遅くなっているようでした。 何か処理速度を速くできるような方法はないでしょうか? もし無理なようであればあきらめます。
補足
描画処理に無駄は無いと思います。 WindowsAPIのことはまだ詳しくは無いので、 何か無駄な処理があるのかもしれませんが。 描画処理時間は、1つ1つの時間は遅くない?のですが、 全ての経過時間を足すと時間がかかっています。 ボタンの数は、ランチャーを作っていて、 ボタンでソフトなどを起動するようにしているので40個以上必要な場合もあります。
お礼
出来ました。 描画処理に問題があるみたいで、ちらつきはありますけど、 再描画が速くなりました。 ちらつきは、調整すればちらつかなくなると思います。 もし、ちらつきが直らないようであれば、再度質問させて頂きます。 ありがとうございます。