オーナー描画ボタンの更新速度について質問です。
ボタンの更新(ボタンの座標を変えた時)の時に、
ボタンの数が多い場合、更新が遅い(40個の時は約5秒)のですが、
何か原因があるのでしょうか?
それとも、元々更新が遅いのでしょうか?
ボタンの数は、増えたり減ったりするので多い場合でも更新を速くしたいです。
ソースは長いので載せる事が出来ません。
ちなみに、ボタンはこのサイトに載ってる様なものです。
http://wisdom.sakura.ne.jp/system/winapi/win32/w …
開発環境
XP
Visual Studio 2005
C、C++でWindowsAPIを使用しています。
No.1
- 回答日時:
オーナードローしたことはありませんが…
>ボタンの数が多い場合、更新が遅い(40個の時は約5秒)のですが、
>何か原因があるのでしょうか?
>それとも、元々更新が遅いのでしょうか?
いくら何でもそんなに遅いわけはないと思われます。
描画処理自体に無駄があるとかそういうことはないでしょうか?
# WM_DRAWITEMでどの程度時間掛かっているか、timeGetTime()等で確認してみてはどうでしょう?
40個のボタンが本当に必要…なのでしょうか?
画面レイアウトなどの整理によって最大数を減らせたりしないのですか?
この回答への補足
描画処理に無駄は無いと思います。
WindowsAPIのことはまだ詳しくは無いので、
何か無駄な処理があるのかもしれませんが。
描画処理時間は、1つ1つの時間は遅くない?のですが、
全ての経過時間を足すと時間がかかっています。
ボタンの数は、ランチャーを作っていて、
ボタンでソフトなどを起動するようにしているので40個以上必要な場合もあります。
調べてみた結果、SetWindowPos()で遅くなっているようでした。
何か処理速度を速くできるような方法はないでしょうか?
もし無理なようであればあきらめます。
No.2
- 回答日時:
こんばんは。
SetWindowPos()で無数のボタン達を移動して重たくなっているのならば、恐らく各ボタンが移動される度に、再描画メッセージが発生して大変な事になっているのではないでしょうか。
以下はあくまで「賭け」と言う事になりますが、SetWindowPos()で移動する前に最後のパラメータへSWP_NOREDRAWのフラグを付加して、
http://msdn.microsoft.com/ja-jp/library/cc411206 …
ボタンに再描画をさせない様に抑止をしてから移動を行います。
全ての移動が終わった後、再描画が成されないので、ボタンの表面が欠けたりします。
此れを防ぐ為、再描画メッセージとは関係なく、呼び出し一つで存在するボタンを総当りに描写して行く外部関数を準備しておき、其の関数で描画する・・・、と言ったところでしょうか。
勿論の事ながら、WM_DRAWITEM内には別方向からの再描画要求に応える為に、従来通りの描画処理が必要です。
出来ました。
教えて頂いた「SWP_NOREDRAW」のフラグの追加は、
どこか間違っていたのかもしれませんが、
出来なかったので、「chie65535」様の回答の「SendMessage()」を使って出来ました。
>恐らく各ボタンが移動される度に、再描画メッセージが発生して大変な事になっているのではないでしょうか。
確かにその通りです。
前からそれが気になっていたのですが、そういう物なんだと思ってました。
再描画の時にちらつきはありますが、プログラムを修正すれば直ると思います。
もし、直らないようであれば再度質問させて頂きます。
ありがとうございます。
No.3ベストアンサー
- 回答日時:
複数のボタンの移動を開始する前に
SendMessage(ボタンが置いてあるフォームのウィンドウハンドル, WM_SETREDRAW, 0, 0);
で、ボタンが置いてあるフォームのウィンドウの再描画を抑止し、全ボタンをSetWindowPos()で移動。
全ボタンの移動が終わったら
SendMessage(ボタンが置いてあるフォームのウィンドウハンドル, WM_SETREDRAW, 1, 0);
で再描画の抑止を解除。
解除後、InvalidateRectで親フォームのウィンドウを無効化して強制的に親フォームを再描画させる。
とすれば「1個のボタンを移動するたびに親フォームを再描画しなくなり、最後に1回だけ親フォームを再描画する」ので、高速になると思います。
出来ました。
描画処理に問題があるみたいで、ちらつきはありますけど、
再描画が速くなりました。
ちらつきは、調整すればちらつかなくなると思います。
もし、ちらつきが直らないようであれば、再度質問させて頂きます。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 ノートPCの「アップデートナビ」画面について 1 2023/07/04 21:27
- Google Drive GooglePlay開発者サービスの更新方法 1 2022/11/18 10:39
- メルカリ メルカリ。メルカリのメールアドレス変更をしたいのですが、個人情報から、メールアドレスを入れ、本来なら 2 2023/05/24 13:36
- Windows Me・NT・2000 パソコン終了 4 2022/05/09 09:05
- ノートパソコン DELLノートがスリープから復帰しない 5 2022/09/01 20:08
- 2ちゃんねる 2ちゃんで使ったことないので分からないことが… あれって更新ボタンを 何度か押さないと 新しいコメン 4 2022/07/01 00:25
- バス・高速バス・夜行バス 小湊バスに関し質問です 1 2023/03/08 18:46
- VR・AR YoutubeでVRゴーグル用の切り替えボタンが表示されない? VRゴーグル(中にスマホを入れるタイ 3 2022/10/20 10:27
- Access(アクセス) accessについて(超初心者です) 1 2023/02/11 11:18
- プリンタ・スキャナー キャノンmp490プリンター【エラー番号5400】で【プリンタートラブルが発生しました。電源を入れ直 2 2023/07/24 17:45
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
scilabでのグラフ描画時の軸設定
-
立方体をくるくる回転させるプ...
-
ビットマップに描画をしてピク...
-
win32api複数のタイマーを同時...
-
C#で壁の当たり判定と自キャラ...
-
画面に絵を出す方法
-
VC++2010 MFC EDIT に格子
-
VB2010にて、プロットエリア...
-
実行時エラー 438になった時の...
-
VBA シートのボタン名を変更し...
-
worksheetFunctionクラスのVloo...
-
ExcelVBA Range クラスの Page...
-
ADODB.Streamを使用してUTF-8を...
-
フォームの再読み込み
-
eclipseのデバッグ中に変数の値...
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
ユーザーフォーム上に現在日時...
-
なぜこんな初歩的なVBAのIf文で...
-
Access VBA でデータペーストを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ListBoxで改行したい
-
for文の実行速度を遅くしたいの...
-
Word 描画オブジェクトを削除...
-
C#を用いて描画する四角形の角...
-
ビットマップに描画をしてピク...
-
PowerPoint の VBA
-
給紙トレイをダイアログを使わ...
-
win32api複数のタイマーを同時...
-
画面に絵を出す方法
-
MFCでのコンボボックスについて
-
.NETのPictureBoxでウインドウ...
-
scilabでのグラフ描画時の軸設定
-
Excel VBA:コントロールボタン...
-
VC;;6.0のMFCで線を簡単に引け...
-
花火のアルゴリズム
-
VB.NETでグラフィックを描くと...
-
水平線の描画
-
Excel 2007で、フリーフォーム描画
-
C# DrawImage 物理サイズでな...
-
円の頂点の求め方を知りたいです。
おすすめ情報