プロが教えるわが家の防犯対策術!

オーナー描画ボタンの更新速度について質問です。

ボタンの更新(ボタンの座標を変えた時)の時に、
ボタンの数が多い場合、更新が遅い(40個の時は約5秒)のですが、
何か原因があるのでしょうか?
それとも、元々更新が遅いのでしょうか?

ボタンの数は、増えたり減ったりするので多い場合でも更新を速くしたいです。
ソースは長いので載せる事が出来ません。

ちなみに、ボタンはこのサイトに載ってる様なものです。
http://wisdom.sakura.ne.jp/system/winapi/win32/w …

開発環境
XP
Visual Studio 2005
C、C++でWindowsAPIを使用しています。

A 回答 (3件)

複数のボタンの移動を開始する前に


SendMessage(ボタンが置いてあるフォームのウィンドウハンドル, WM_SETREDRAW, 0, 0);
で、ボタンが置いてあるフォームのウィンドウの再描画を抑止し、全ボタンをSetWindowPos()で移動。
全ボタンの移動が終わったら
SendMessage(ボタンが置いてあるフォームのウィンドウハンドル, WM_SETREDRAW, 1, 0);
で再描画の抑止を解除。
解除後、InvalidateRectで親フォームのウィンドウを無効化して強制的に親フォームを再描画させる。

とすれば「1個のボタンを移動するたびに親フォームを再描画しなくなり、最後に1回だけ親フォームを再描画する」ので、高速になると思います。
    • good
    • 0
この回答へのお礼

出来ました。

描画処理に問題があるみたいで、ちらつきはありますけど、
再描画が速くなりました。
ちらつきは、調整すればちらつかなくなると思います。
もし、ちらつきが直らないようであれば、再度質問させて頂きます。

ありがとうございます。

お礼日時:2009/07/05 15:15

 こんばんは。



 SetWindowPos()で無数のボタン達を移動して重たくなっているのならば、恐らく各ボタンが移動される度に、再描画メッセージが発生して大変な事になっているのではないでしょうか。

 以下はあくまで「賭け」と言う事になりますが、SetWindowPos()で移動する前に最後のパラメータへSWP_NOREDRAWのフラグを付加して、
 http://msdn.microsoft.com/ja-jp/library/cc411206 …

 ボタンに再描画をさせない様に抑止をしてから移動を行います。
 全ての移動が終わった後、再描画が成されないので、ボタンの表面が欠けたりします。
 此れを防ぐ為、再描画メッセージとは関係なく、呼び出し一つで存在するボタンを総当りに描写して行く外部関数を準備しておき、其の関数で描画する・・・、と言ったところでしょうか。

 勿論の事ながら、WM_DRAWITEM内には別方向からの再描画要求に応える為に、従来通りの描画処理が必要です。
    • good
    • 0
この回答へのお礼

出来ました。

教えて頂いた「SWP_NOREDRAW」のフラグの追加は、
どこか間違っていたのかもしれませんが、
出来なかったので、「chie65535」様の回答の「SendMessage()」を使って出来ました。

>恐らく各ボタンが移動される度に、再描画メッセージが発生して大変な事になっているのではないでしょうか。
確かにその通りです。
前からそれが気になっていたのですが、そういう物なんだと思ってました。

再描画の時にちらつきはありますが、プログラムを修正すれば直ると思います。
もし、直らないようであれば再度質問させて頂きます。

ありがとうございます。

お礼日時:2009/07/05 15:27

オーナードローしたことはありませんが…



>ボタンの数が多い場合、更新が遅い(40個の時は約5秒)のですが、
>何か原因があるのでしょうか?
>それとも、元々更新が遅いのでしょうか?

いくら何でもそんなに遅いわけはないと思われます。
描画処理自体に無駄があるとかそういうことはないでしょうか?
# WM_DRAWITEMでどの程度時間掛かっているか、timeGetTime()等で確認してみてはどうでしょう?

40個のボタンが本当に必要…なのでしょうか?
画面レイアウトなどの整理によって最大数を減らせたりしないのですか?

この回答への補足

描画処理に無駄は無いと思います。
WindowsAPIのことはまだ詳しくは無いので、
何か無駄な処理があるのかもしれませんが。

描画処理時間は、1つ1つの時間は遅くない?のですが、
全ての経過時間を足すと時間がかかっています。

ボタンの数は、ランチャーを作っていて、
ボタンでソフトなどを起動するようにしているので40個以上必要な場合もあります。

補足日時:2009/07/04 19:39
    • good
    • 0
この回答へのお礼

調べてみた結果、SetWindowPos()で遅くなっているようでした。

何か処理速度を速くできるような方法はないでしょうか?
もし無理なようであればあきらめます。

お礼日時:2009/07/04 21:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!