メインウィンドウの処理ボタンを押すと、とある処理を行うプログラムです。
処理中にはモードレスダイアログで処理中表示とプログレスバーでの進捗状態を表示し、処理終了時にDestroyWindow()しています。
その処理中ダイアログ表示中に他のウィンドウで隠し、タスクバーをクリックしても、表示されません。
上に乗せたウィンドウを移動させた時には再描画されるのですが、タスクバーのクリック時には再描画されません。
処理中ダイアログ作成時に何か設定が必要なのでしょうか?
ちなみに、処理中の処理はthreadで動作しています。
初心者ゆえ、初歩的質問だったらすみません。
あちこち調べてみたのですが解りませんでした。
アドバイスお願いします m(_ _)m
スレッドを起動したあと,ダイアログプロシージャからちゃんと抜けていますか?
UIスレッドの制御がWindowsに戻っていないのではないかと思われます。
「メインウィンドウ」
「処理スレッド」
「表示ダイアログ」
の計3つの関係はどうなってるでしょうか?
A「メインウィンドウから処理スレッドをつくる。
さらに、その処理スレッド内から表示ダイアログをつくる」
B「メインウィンドウから、処理スレッドと表示ダイアログの2つを別々に造り、
処理スレッドの情報を、表示ダイアログになんらかの形で受け渡して表示」
解決する事が出来ました。
処理スレッド内でプログレスバーの更新&UpdateWindowを行っている箇所に
if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
を追加したら上手くいきました。
以下はお返事です。
>YuOさま
クラスを作ってCreateする形式なので、ダイアログプロシージャとかはないです。
>ryoさま
3つの関係は、Aです。
発言ありがとうございました m(_ _)m
お手を煩わせてしまって申し訳ありません。
もうみてないかもしれませんが・・・。
> クラスを作ってCreateする形式なので、ダイアログプロシージャとかはないです。
これは大間違い。
MFCは単にWin32をクラスというかたちでラッピングしてるだけで、
内部の機構が変わるわけではありません。
Win32のダイアログプロシージャはMFCでのOnXXXにあたります。
> 処理スレッド内でプログレスバーの更新&UpdateWindowを行っている箇所に
> if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
> ::TranslateMessage(&msg);
> ::DispatchMessage(&msg);
> }
これでも動きますが良い設計とは言えません。
場当たり的な対処は後の改修などをし辛くさせます。
本来は処理スレッドとダイアログ用のスレッドを分けるか
イベントハンドラ内でブロックしないようにすべきです。
またはメインダイアログ用のスレッドに処理中ダイアログの
表示などを統合したり、
メインダイアログのスレッド・処理スレッド・処理中ダイアログのスレッド
の3つのスレッド構成にすべきです。
ツイート | ![]() |