- ベストアンサー
メッセージボックスが表示されないのですが?
- Win98 VC++6.0 MFCで作成したプログラムで、AfxMessageBox関数を使用してメッセージボックスを表示していますが、メッセージボックスが表示されません。原因を教えてください。
- Win98 VC++6.0 MFCで作成したプログラムで、AfxMessageBox関数を追加しても、メッセージボックスが表示されません。どうしてなのでしょうか?ご教示ください。
- Win98のVC++6.0で作成したMFCプロジェクトで、AfxMessageBox関数を使用してメッセージボックスを表示したいのですが、何度試しても表示されません。どうすれば表示されるようになるのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
MFCは、モーダルダイアログを生成する場合でもCreateDlgIndirect APIを使用しています。 (CDialog::DoModal()のソースで確認できます。) その影響かは確認していませんが、DoModal()が終了した後、メッセージキューにWM_QUITが残ったままになっており、AfxMessageBoxでメッセージを表示してもWM_QUITが処理され、アプリケーション自体が終了してしまいます。 CDialog::DoModal()の後、メッセージキューをチェックするタイミングでアプリケーションが終了というわけです。 DoModal()の後に以下のコードを挿入することで、メッセージキューが空になるため、AfxMessageBoxが動作するようになります。 int nResponse = dlg.DoModal(); // メッセージキューを空にする MSG msg; while(TRUE){ if(0 == ::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ break; } } AfxMessageBox("3",MB_OK);//■追加 if (nResponse == IDOK) { AfxMessageBox("3",MB_OK);//■追加 } else if (nResponse == IDCANCEL) { }
その他の回答 (1)
- darksky
- ベストアンサー率66% (38/57)
補足にいただいた質問への回答です。 私はWindows3.0の頃からWindowsプログラムをしていたこともあり、C+SDKを使っていました。 もちろんMFCなどはありませんし、書籍もほとんどありませんでしたが、 「プログラミングWindows Version 3.1」 という本を読んでWindowsの仕組みを学びました。 (数回改定されていて、Windows95版もあったと思います。16bitと32bitではパラメータなどが違うので、これから読むならWindows95版ですね。) やはり仕組みがわかっているのとわからないのでは問題が発生したときの対応が全然違うと思います。 VC++とMFCでWindowsプログラムをはじめた方は読んでおいて損はない書籍だと思います。 C+SDKでプログラムまでする必要はなく、読むだけでもいいかと思います。 今でもSpy(今はSpy++)を使って動きを確認することが多く、いろいろと勉強になります。 多くのプログラムを書くことを経験すれば自然と身についてくると思います。 今回の現象は、GetMessageやPeekMessageによるディスパッチが発生しなければ、アプリは終了することはありませんが、バグだとは思います。仕様だとはいい難いし・・・
お礼
どうもありがとうございました。
お礼
darkskyさん 回答ありがとうございます。 なかなかレスが付かず困っていました。 確認したところちゃんと作動しました。
補足
ところで、darkskyさんはどうやってこのような知識を身につけられたのですか? 良かったら教えていただけませんか? そもそもデフォルトのコードに以下のような注記があるにもかかわらず、これはバグですか? if (nResponse == IDOK) { // TODO: ダイアログが <OK> で消された時のコードを // 記述してください。