こんばんは。
VC6++,MFC,Windows2000で作業しています。
あるボタンを押すと、モードレスダイアログが表示され、SetTimerします。
OnTimerで「タイムアウトしました。」のダイアログボックスを表示します。
この後、モードレスダイアログを自動的に破棄したいのですが、
どこで破棄したらいいのでしょうか?
いい考えが浮かびません。
どなたかご教授ください。
「タイムアウトしました」と表示する前にKillTimerし、別のタイマーを用意する。適当
な時間経った後に呼ばれるタイマー関数にモードレスダイアログを破棄させる。
...というのはどうでしょう?
OnTimerで拾うのではなくて、タイマー関数をつくるということですね。
なるほど。
タイマー関数は、関数内でDestroyWindowしても平気なのでしょうか?
やってみますね。
> OnTimerで「タイムアウトしました。」のダイアログボックスを表示します。
> この後、モードレスダイアログを自動的に破棄したいのですが、
「この後」というのは、いつでしょうか?
ダイアログボックス表示直後ですか?
それともダイアログボックスにOKボタンがついていて、それを押した後ですか?
後者でしたら、OnTimer中で、メッセージボックスを表示し、OKボタンが押された後
DestoryWindowすれば良いのではないかと思います。
OnTimerの中でDestroyWindowすると、アクセスバイオレーションが発生します。
OnTimerを抜けてからじゃないとダメみたいなのですが。。。
「タイムアウトしました」のダイアログもモードレスであれば、
DestroyWindowではなく、EndDialogを呼びます。
「タイムアウトしました」はMessageBoxです。
MessageBoxではまずいでしょうか?
結局ですね、この質問には
a. TimeOutが発生する。
b. タイムアウトしましたというメッセージボックスが表示される。
c. ユーザーがメッセージボックスを消す。
という一連の流れは読みとれるのに、「aの前」「aとbの間」「bとcの間」「cの後」のど
のタイミングでモードレスダイアログを破棄させたいのかが読みとれないことと、
メッセージボックスがモーダルダイアログなのか、モードレスダイアログなのかが明記さ
れていないために、対処法を的確に示しづらいという問題があるのです。
先の書き込みでメッセージボックスはモーダルらしいということが解りました。当初私は、
>...ダイアログボックスを表示します。
>この後、モードレスダイアログを...
という文面から「bとcの間」と解釈してあのようなレスをしました。
まずはあなたが「何をしたいのか」を明確にすることだと思います。
今試してみましたが、
・TimeOutのメッセージボックスはモーダル
・「bとcの間」でモードレスダイアログをDestroyWindow()する
で、モードレスダイアログを無事破棄できましたよ?
・TimeOutのメッセージボックスはモーダル
・「bとcの間」でモードレスダイアログをDestroyWindow()する
の方法でうまくいきました。
cの部分でDestroyWindow()すると、エラーになります。
しかし、bでもcでも同じですので、tibさんの方法をとろうと思います。
ご対応ありがとうございました。