- ベストアンサー
「VC++6」ウィンドウの再描画
VC++6を使って簡単なプログラムをダイアログベース作っています。 内容はリストを読み込み、1件ずつDBにSQLを発行して情報を取得していくという内容です。 画面には、プログレスバーも設置しており、普通に操作すると正常に、プログレスバーも動きます。しかし、いったん別のウィンドウをアクティブにして、作成した動作中のプログラムを再選択しても、画面は壊れたまま再描画されません。しばらくまって、リストのSQL発行が終わって、画面に結果が表示されたら、きちんと再描画されます。 そこまで処理が終わったら、他のウィンドウに切り替えて戻ってきても画面が壊れることはありません。 時間がかかるプログラムなので、動作中に別の仕事をするため、アクティブでなくても、きちんとウィンドウを更新したいのです。 ちなみに、ループ処理中にRedrawWindow();を入れてみましたがダメでした。 アドバイスよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
★アドバイス 1.ループの中でメッセージを処理すれば良いでしょう。 2.スレッドを1つ用意してDBをここで読み込む。 1の方法が簡単なので下のソースでもループ中に入れれば良い。 サンプル: MSG msg; while ( PeekMessage(&msg,hDlg,0,0,PM_REMOVE) ){ TranslateMessage( &msg ); DispatchMessage( &msg ); } ※『hDlg』はダイアログのウインドウ・ハンドルです。
その他の回答 (2)
- titokani
- ベストアンサー率19% (341/1726)
>ちなみに、ループ処理中にRedrawWindow();を入れてみましたがダメでした。 RedrawWindowにRDW_UPDATENOWは指定しましたか?
お礼
アドバイスありがとうございました。 やってみたのですが、エラーが出てしまいました。 #1、#2さんのアドバイスのやり方でとりあえずは問題解決いたしました。ありがとうございました。
- edge_wind
- ベストアンサー率55% (44/79)
正しい処理かはわかりませんが…。 私の場合は、処理が長くなりそうなループの中に MSG msg; if(::PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } を追加してウィンドウを再描画しています。 本職ではないので、間違っていたらすみません。
お礼
アドバイスありがとうございました。 無事解決いたしました。
お礼
アドバイスありがとうございました。 無事解決いたしました。 しかし、マウスカーソルを砂時計にしていたのが元に戻ってしまいましたが・・・ とりあえず、プログレスバーを見れば作業中かどうかわかるので、一応解決いたしました。ありがとうございました。