ダイアログの消滅タイミング

[戻る]
ダイアナ 2002/12/05(木) 21:58:10
こんばんは。
VC6++,MFC,Windows2000で作業しています。

あるボタンを押すと、モードレスダイアログが表示され、SetTimerします。
OnTimerで「タイムアウトしました。」のダイアログボックスを表示します。
この後、モードレスダイアログを自動的に破棄したいのですが、
どこで破棄したらいいのでしょうか?
いい考えが浮かびません。
どなたかご教授ください。

tib 2002/12/05(木) 22:19:00
「タイムアウトしました」と表示する前にKillTimerし、別のタイマーを用意する。適当
な時間経った後に呼ばれるタイマー関数にモードレスダイアログを破棄させる。

...というのはどうでしょう?

ダイアナ 2002/12/05(木) 22:29:19
OnTimerで拾うのではなくて、タイマー関数をつくるということですね。
なるほど。
タイマー関数は、関数内でDestroyWindowしても平気なのでしょうか?
やってみますね。

MASATO [E-Mail] [HomePage] 2002/12/06(金) 01:27:38
> OnTimerで「タイムアウトしました。」のダイアログボックスを表示します。
> この後、モードレスダイアログを自動的に破棄したいのですが、
「この後」というのは、いつでしょうか?
ダイアログボックス表示直後ですか?
それともダイアログボックスにOKボタンがついていて、それを押した後ですか?

後者でしたら、OnTimer中で、メッセージボックスを表示し、OKボタンが押された後
DestoryWindowすれば良いのではないかと思います。

ダイアナ 2002/12/06(金) 08:45:22
OnTimerの中でDestroyWindowすると、アクセスバイオレーションが発生します。
OnTimerを抜けてからじゃないとダメみたいなのですが。。。

dairygoods 2002/12/06(金) 10:55:52
「タイムアウトしました」のダイアログもモードレスであれば、
DestroyWindowではなく、EndDialogを呼びます。

ダイアナ 2002/12/06(金) 12:05:46
「タイムアウトしました」はMessageBoxです。
MessageBoxではまずいでしょうか?

tib 2002/12/06(金) 12:28:16
結局ですね、この質問には

a. TimeOutが発生する。
b. タイムアウトしましたというメッセージボックスが表示される。
c. ユーザーがメッセージボックスを消す。

という一連の流れは読みとれるのに、「aの前」「aとbの間」「bとcの間」「cの後」のど
のタイミングでモードレスダイアログを破棄させたいのかが読みとれないことと、

メッセージボックスがモーダルダイアログなのか、モードレスダイアログなのかが明記さ
れていないために、対処法を的確に示しづらいという問題があるのです。

先の書き込みでメッセージボックスはモーダルらしいということが解りました。当初私は、

>...ダイアログボックスを表示します。
>この後、モードレスダイアログを...
という文面から「bとcの間」と解釈してあのようなレスをしました。

まずはあなたが「何をしたいのか」を明確にすることだと思います。

tib 2002/12/06(金) 12:44:00
今試してみましたが、

・TimeOutのメッセージボックスはモーダル
・「bとcの間」でモードレスダイアログをDestroyWindow()する

で、モードレスダイアログを無事破棄できましたよ?

ダイアナ 2002/12/06(金) 13:23:45
[[解決]]
・TimeOutのメッセージボックスはモーダル
・「bとcの間」でモードレスダイアログをDestroyWindow()する
の方法でうまくいきました。
cの部分でDestroyWindow()すると、エラーになります。
しかし、bでもcでも同じですので、tibさんの方法をとろうと思います。

ご対応ありがとうございました。

古いスレッドには追加発言できません。