• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:メッセージボックスが表示されないのですが?)

メッセージボックスが表示されないのですが?

このQ&Aのポイント
  • Win98 VC++6.0 MFCで作成したプログラムで、AfxMessageBox関数を使用してメッセージボックスを表示していますが、メッセージボックスが表示されません。原因を教えてください。
  • Win98 VC++6.0 MFCで作成したプログラムで、AfxMessageBox関数を追加しても、メッセージボックスが表示されません。どうしてなのでしょうか?ご教示ください。
  • Win98のVC++6.0で作成したMFCプロジェクトで、AfxMessageBox関数を使用してメッセージボックスを表示したいのですが、何度試しても表示されません。どうすれば表示されるようになるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • darksky
  • ベストアンサー率66% (38/57)
回答No.1

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) { }

VitaminBB
質問者

お礼

darkskyさん 回答ありがとうございます。 なかなかレスが付かず困っていました。 確認したところちゃんと作動しました。

VitaminBB
質問者

補足

ところで、darkskyさんはどうやってこのような知識を身につけられたのですか? 良かったら教えていただけませんか? そもそもデフォルトのコードに以下のような注記があるにもかかわらず、これはバグですか? if (nResponse == IDOK) { // TODO: ダイアログが <OK> で消された時のコードを // 記述してください。

その他の回答 (1)

  • darksky
  • ベストアンサー率66% (38/57)
回答No.2

補足にいただいた質問への回答です。 私はWindows3.0の頃からWindowsプログラムをしていたこともあり、C+SDKを使っていました。 もちろんMFCなどはありませんし、書籍もほとんどありませんでしたが、 「プログラミングWindows Version 3.1」 という本を読んでWindowsの仕組みを学びました。 (数回改定されていて、Windows95版もあったと思います。16bitと32bitではパラメータなどが違うので、これから読むならWindows95版ですね。) やはり仕組みがわかっているのとわからないのでは問題が発生したときの対応が全然違うと思います。 VC++とMFCでWindowsプログラムをはじめた方は読んでおいて損はない書籍だと思います。 C+SDKでプログラムまでする必要はなく、読むだけでもいいかと思います。 今でもSpy(今はSpy++)を使って動きを確認することが多く、いろいろと勉強になります。 多くのプログラムを書くことを経験すれば自然と身についてくると思います。 今回の現象は、GetMessageやPeekMessageによるディスパッチが発生しなければ、アプリは終了することはありませんが、バグだとは思います。仕様だとはいい難いし・・・

VitaminBB
質問者

お礼

どうもありがとうございました。

関連するQ&A