オーナー描画ボタンの更新速度について質問です。
ボタンの更新(ボタンの座標を変えた時)の時に、
ボタンの数が多い場合、更新が遅い(40個の時は約5秒)のですが、
何か原因があるのでしょうか?
それとも、元々更新が遅いのでしょうか?
ボタンの数は、増えたり減ったりするので多い場合でも更新を速くしたいです。
ソースは長いので載せる事が出来ません。
ちなみに、ボタンはこのサイトに載ってる様なものです。
http://wisdom.sakura.ne.jp/system/winapi/win32/w …
開発環境
XP
Visual Studio 2005
C、C++でWindowsAPIを使用しています。
No.3ベストアンサー
- 回答日時:
複数のボタンの移動を開始する前に
SendMessage(ボタンが置いてあるフォームのウィンドウハンドル, WM_SETREDRAW, 0, 0);
で、ボタンが置いてあるフォームのウィンドウの再描画を抑止し、全ボタンをSetWindowPos()で移動。
全ボタンの移動が終わったら
SendMessage(ボタンが置いてあるフォームのウィンドウハンドル, WM_SETREDRAW, 1, 0);
で再描画の抑止を解除。
解除後、InvalidateRectで親フォームのウィンドウを無効化して強制的に親フォームを再描画させる。
とすれば「1個のボタンを移動するたびに親フォームを再描画しなくなり、最後に1回だけ親フォームを再描画する」ので、高速になると思います。
出来ました。
描画処理に問題があるみたいで、ちらつきはありますけど、
再描画が速くなりました。
ちらつきは、調整すればちらつかなくなると思います。
もし、ちらつきが直らないようであれば、再度質問させて頂きます。
ありがとうございます。
No.2
- 回答日時:
こんばんは。
SetWindowPos()で無数のボタン達を移動して重たくなっているのならば、恐らく各ボタンが移動される度に、再描画メッセージが発生して大変な事になっているのではないでしょうか。
以下はあくまで「賭け」と言う事になりますが、SetWindowPos()で移動する前に最後のパラメータへSWP_NOREDRAWのフラグを付加して、
http://msdn.microsoft.com/ja-jp/library/cc411206 …
ボタンに再描画をさせない様に抑止をしてから移動を行います。
全ての移動が終わった後、再描画が成されないので、ボタンの表面が欠けたりします。
此れを防ぐ為、再描画メッセージとは関係なく、呼び出し一つで存在するボタンを総当りに描写して行く外部関数を準備しておき、其の関数で描画する・・・、と言ったところでしょうか。
勿論の事ながら、WM_DRAWITEM内には別方向からの再描画要求に応える為に、従来通りの描画処理が必要です。
出来ました。
教えて頂いた「SWP_NOREDRAW」のフラグの追加は、
どこか間違っていたのかもしれませんが、
出来なかったので、「chie65535」様の回答の「SendMessage()」を使って出来ました。
>恐らく各ボタンが移動される度に、再描画メッセージが発生して大変な事になっているのではないでしょうか。
確かにその通りです。
前からそれが気になっていたのですが、そういう物なんだと思ってました。
再描画の時にちらつきはありますが、プログラムを修正すれば直ると思います。
もし、直らないようであれば再度質問させて頂きます。
ありがとうございます。
No.1
- 回答日時:
オーナードローしたことはありませんが…
>ボタンの数が多い場合、更新が遅い(40個の時は約5秒)のですが、
>何か原因があるのでしょうか?
>それとも、元々更新が遅いのでしょうか?
いくら何でもそんなに遅いわけはないと思われます。
描画処理自体に無駄があるとかそういうことはないでしょうか?
# WM_DRAWITEMでどの程度時間掛かっているか、timeGetTime()等で確認してみてはどうでしょう?
40個のボタンが本当に必要…なのでしょうか?
画面レイアウトなどの整理によって最大数を減らせたりしないのですか?
この回答への補足
描画処理に無駄は無いと思います。
WindowsAPIのことはまだ詳しくは無いので、
何か無駄な処理があるのかもしれませんが。
描画処理時間は、1つ1つの時間は遅くない?のですが、
全ての経過時間を足すと時間がかかっています。
ボタンの数は、ランチャーを作っていて、
ボタンでソフトなどを起動するようにしているので40個以上必要な場合もあります。
調べてみた結果、SetWindowPos()で遅くなっているようでした。
何か処理速度を速くできるような方法はないでしょうか?
もし無理なようであればあきらめます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
for文の実行速度を遅くしたいの...
-
ListBoxで改行したい
-
Excel VBA:コントロールボタン...
-
PowerPoint の VBA
-
iPhone開発にて 透過PNGを表示...
-
VC++ MFCチェックボックスの色...
-
VB 6.0 PictureBox のプロパテ...
-
Word 描画オブジェクトを削除...
-
VB.NETでグラフィックを描くと...
-
DrawLineで引いた線が消えてし...
-
VB2010のChartで、何本もの線を...
-
delphi 画面のちらつき
-
C++でゲーム
-
Linux上でのC++言語を用いたメ...
-
C#を用いて描画する四角形の角...
-
給紙トレイをダイアログを使わ...
-
アルゴリズム : 円描画
-
worksheetFunctionクラスのVloo...
-
パソコンへの「Dropbox...
-
VBA シートのボタン名を変更し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ListBoxで改行したい
-
for文の実行速度を遅くしたいの...
-
VB.NETでグラフィックを描くと...
-
C#でPictureBox内での図形移動...
-
Word 描画オブジェクトを削除...
-
PowerPoint の VBA
-
C#で壁の当たり判定と自キャラ...
-
ピクチャボックスに描画した画...
-
win32api複数のタイマーを同時...
-
C#を用いて描画する四角形の角...
-
円の頂点の求め方を知りたいです。
-
ビットマップに描画をしてピク...
-
給紙トレイをダイアログを使わ...
-
C# DrawImage 物理サイズでな...
-
C++/CLIを用いて画像をクリップ...
-
VB 6.0 PictureBox のプロパテ...
-
MFCでのコンボボックスについて
-
PictureBoxのダブルバッファリ...
-
VC++ MFCチェックボックスの色...
-
Excel 2007で、フリーフォーム描画
おすすめ情報