プロが教える店舗&オフィスのセキュリティ対策術

VC++6を使って簡単なプログラムをダイアログベース作っています。
内容はリストを読み込み、1件ずつDBにSQLを発行して情報を取得していくという内容です。

画面には、プログレスバーも設置しており、普通に操作すると正常に、プログレスバーも動きます。しかし、いったん別のウィンドウをアクティブにして、作成した動作中のプログラムを再選択しても、画面は壊れたまま再描画されません。しばらくまって、リストのSQL発行が終わって、画面に結果が表示されたら、きちんと再描画されます。

そこまで処理が終わったら、他のウィンドウに切り替えて戻ってきても画面が壊れることはありません。

時間がかかるプログラムなので、動作中に別の仕事をするため、アクティブでなくても、きちんとウィンドウを更新したいのです。

ちなみに、ループ処理中にRedrawWindow();を入れてみましたがダメでした。

アドバイスよろしくお願いします。

A 回答 (3件)

>ちなみに、ループ処理中にRedrawWindow();を入れてみましたがダメでした。


RedrawWindowにRDW_UPDATENOWは指定しましたか?
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました。

やってみたのですが、エラーが出てしまいました。
#1、#2さんのアドバイスのやり方でとりあえずは問題解決いたしました。ありがとうございました。

お礼日時:2008/04/01 15:11

★アドバイス


 1.ループの中でメッセージを処理すれば良いでしょう。
 2.スレッドを1つ用意してDBをここで読み込む。
 1の方法が簡単なので下のソースでもループ中に入れれば良い。

サンプル:
MSG msg;

while ( PeekMessage(&msg,hDlg,0,0,PM_REMOVE) ){
 TranslateMessage( &msg );
 DispatchMessage( &msg );
}
※『hDlg』はダイアログのウインドウ・ハンドルです。
    • good
    • 1
この回答へのお礼

アドバイスありがとうございました。
無事解決いたしました。
しかし、マウスカーソルを砂時計にしていたのが元に戻ってしまいましたが・・・

とりあえず、プログレスバーを見れば作業中かどうかわかるので、一応解決いたしました。ありがとうございました。

お礼日時:2008/04/01 15:10

正しい処理かはわかりませんが…。



私の場合は、処理が長くなりそうなループの中に

MSG msg;
if(::PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}

を追加してウィンドウを再描画しています。
本職ではないので、間違っていたらすみません。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました。
無事解決いたしました。

お礼日時:2008/04/01 15:05

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