• 締切済み

MFC モーダルダイアログ表示中に

MFCでプログラムを組んでいます。 以下のような状態なのですが、解決できる方法はありますか? (1) メインアプリケーションクラス(CWinAppクラスの派生クラス)から、フレームウィンドウを表示。 表示方法:CreateNewFrame()実行 → InitialUpdateFrame()実行 (2) (1)で表示されたウィンドウからモーダルダイアログを表示。 表示方法:モーダルダイアログクラスのDoModal()実行。 (3) メインアプリケーションクラスから(1)で表示されたウィンドウに対して、WM_CLOSEをSendMessage()。 (3)の実行後 (1)、(2)で表示された画面は両方とも閉じますが、モーダルダイアログでアサートします。 目的は、両方の画面が表示されている状態でメインアプリケーションを終了するときに、両方の画面をアサートすることなく閉じることです。 そもそもモーダルダイアログを外部から閉じること自体できるのかどうかわからないのですが、 もしできないとしたら、目的を達成するためにはどうすれば良いのでしょうか? よろしくお願いします。

みんなの回答

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.1

>(3)の実行後 (1)、(2)で表示された画面は両方とも閉じますが、 >モーダルダイアログでアサートします。 ASSERTなら条件があるはずです。 ( ASSERT (n >= 0) とか....) どういうASEERTになっているかわからないと 適切なアドバイスができませんので 詳しく教えてください

real_neo
質問者

お礼

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

real_neo
質問者

補足

>ASSERTなら条件があるはずです。 失礼しました。 確かアサートは、(ASSERT(m_hwd))のような感じで、 ウィンドウハンドルを参照してたと思います。 見たときは、画面が閉じられたんでそりゃアサートするわ、と思いました。 ただ、同じようなつくりの画面では発生しないので 何か回避方法があるのでは、と思って投稿しました。

関連するQ&A

  • ダイアログを自分の好きな位置に表示したい

    VCで簡単なプログラムを造っています。 ダイアログベースです。 EXE を実行した時に表示されるダイアログを、自分の指定した位置に 表示させる方法はあるでしょうか。 また、そのダイアログから DoModal関数で別のダイアログを表示する場合、 同様に、自分の指定した位置に表示させる方法はあるでしょうか。 デフォルトのままだと、1つ目のダイアログは画面の中央に、 DoModal関数で表示させたダイアログは、1つ目のダイアログの上に なります。

  • ダイアログ間のメッセージの送信について

    いつもお世話になっております。 現在、Visual Studio 2005にてMFCのダイアログベースのアプリケーションを作成しており、メッセージの送信の件で詰まった箇所があり質問させて頂きました。 現在のアプリケーションの全体像なのですが、 ダイアログベースなので、アプリケーション立ち上げ時に1つメインダイアログが表示されます。 そのメインダイアログ内にボタンを設置したとして、それぞれのボタン1,ボタン2からダイアログ1,ダイアログ2をDoModal()で表示させます。 それぞれのダイアログ1,2にはボタンが1つずつ設置されているとします。 質問させて頂きたいことは メインダイアログへダイアログ1,2からメッセージ送信をする場合には ::SendMessage(GetParent()->GetSafeHwnd(),MYMSG,0); でメッセージ送信をすることは出来ました。 しかしメインダイアログから呼び出されるダイアログ1,2間でメッセージを送信する場合に,例えばダイアログ1からダイアログ2へメッセージを送信させたいときに void C****1Dlg::OnBnClicked(){ C****2Dlg m_dlg2; ::SendMessage(m_dlg2.GetSafeHwnd(),MYMSG,0); とダイアログ1のボタンクリック時の関数内にコードを入力してもダイアログ2へメッセージは送信されず(ダイアログ2内のメッセージ受信関数OnMyMsg()が呼ばれず)、そのままスルーされるようなのです。 上述のコードで何か間違えている箇所があるでしょうか? メッセージを扱うのは初めてで、とにかく相手先のウィンドウのハンドルを取得できればいいのかなと思ってコードを書いてみたのですが。。 ご存知の方がいらっしゃいましたら、ご意見宜しくお願い致します。 尚、開発環境は Windows CE 6.0 Visual Studio 2005 です。

  • ダイアログの非表示が遅い

    ダイアログの非表示が遅い Windows CE上で動作するソフトを作成中で、約2cm×2cmほどのボタンだけのダイアログが1つ(メインのダイアログ)、約2cm×1cmほどのボタンだけのダイアログが3つあります。(ダイアログの大きさは、それぞれのボタンと同じサイズで、メイン以外はモーダレスです。) その中の1つを押すと、別の全画面サイズのダイアログを表示し、そのダイアログ上のボタンを押すと、元のボタンだけになるようにしています。 全て、メインのダイアログのOnInitDiarog()で生成しておき、ShowWindow(SW_SHOW)で表示し、ShowWindow(SW_HIDE)で非表示にしているのですが、全画面サイズのダイアログを非表示にする際、表示が消える前に、ボタンのダイアログが表示されてしまい、見た目がかなり悪いのです。 Windows CEは遅いと聞いた事はあるのですが、どうにか対処する方法はないのでしょうか? どなたか助言をお願い致します。 環境は以下の通りです。 ・Windows CE 5.0 ・Visual C++ 2005 ・MFCスマートデバイス 以上、よろしくお願いします。

  • VC++.NET DLLからのダイアログの表示

    こんばんは。 VC++.NETでDLLを作成しました。 内容はダイアログを表示させるだけの単純なもので DLLの種類はMFC拡張DLLで作成しました。 (CDIALOGを継承したクラスTESTDIALOGのコンストラクタ、デストラクタがあるだけのもの) これをテスト用の単純なMFCアプリケーションで呼び出したところ ダイアログを表示させることができましたが 別の複雑なアプリケーション(DLLからDLLを呼ぶなどしている)で 呼び出したところダイアログが表示されません。 コンパイルエラーなどもでないし 何がいけないのか分かりません。 呼び出し側ではメニューにイベントハンドラを作ってそこで TESTDIALOG dlg; dlg.DoModal(); としているだけなのですが・・・ (デバッガで追ったところMFCのdlgcore.cppのCDialog::DoModalの m_lpDialogTemplateNameが不適切なptrとなる辺りに原因はありそうなのですが何故そうなるのかわかりません。) どなたかダイアログが表示されない原因がお分かりになる方 よろしくお願いします。

  • VC++でダイアログ表示について

    VC++初心者です。 MFCアプリケーションでダイアログベースのアプリケーションを作ったのですが、ボタンクリック時にもう一つダイアログを表示しようと思っています。 以下のコードだと、うまく表示されずに画面がフリーズしてしまいます。どこを直したらいいのでしょうか。ご教授願います。 環境は、xp、Visual Studio.net 2003です。 void CMFCtestDlg::OnBnClickedButton1() {   //   CmyDialog myDL;   myDL.DoModal(); } MFCtestDlg.cpp内、#include "myDialog.h" は記述してあります。 VBの経験はあるのですが、VC++はまったくわかりません。 よろしくお願いします。

  • ダイアログを終了させてもハンドルが1つ増加したまま。。。

    VC++のMFCを使ってダイアログベースのEXEを造っています。 ハンドルのリークが発生し、困っています。 <動作内容> メインのダイアログで、ボタン押下により別のダイアログを表示します。 DoModal()でモーダルダイアログを作成します。 別のプロセスからブロードキャストされるメッセージを処理したいため、 ボタン押下のルーチンで DoModal() せずに、スレッドを作成し、 そのスレッドで DoModal() を実行しています。 スレッド作成は AfxBeginThread() を使用しています。 <サンプルソース> ●メインダイアログ // ボタン押下のルーチン void CTestModalDlg::OnButton1() { AfxBeginThread( TestDlgThread, (LPVOID)this, THREAD_PRIORITY_NORMAL ); } // スレッド static UINT TestDlgThread(LPVOID pThis) { CTestDlg1 Dlg; Dlg.DoModal(); } ●DoModal() で表示されるダイアログ 何も手を加えてない、デフォルトのまま。 <結果> DoModal() で表示されたダイアログを CDialog::OnCancel() で終了させ、 メインのスレッドが終了しても、ハンドルカウントが1つ増加しています。 Sleep() を入れて値をみてみると、 ・スレッド作成:2増加 ・DoModal() でダイアログ表示:1増加 ・OnCancel() で終了:増減なし ・スレッド終了:2減少 =>結果、1増加となっていました。 以下のパターンでは問題ありませんでした。 ・スレッドを作成+終了(ダイアログ表示しない) ・スレッドを作成せずに、ボタン押下ルーチンから DoModal() でダイアログ表示+終了 ということで、AfxBeginThread()、DoModal() 自体は問題ないのですが、 スレッドを作成して DoModal() するとリークが発生します。 識者の方、原因、対策など、ご教授願います。

  • ダイアログのボタンが押せない

    環境:WinXP+VC6(SP5)+MFC アプリケーションクラスで、ダイアログを次のように表示しています。 BOOL CXXXXApp::InitInstance() { ・・・・ CXXXXDlg dlg(AfxGetMainWnd()->GetDesktopWindow()); dlg.DoModal(); ・・・・ } で、ダイアログは表示されるのですが、クリックできません。 (ディスクトップもクリックできません。) Enterなどキーイベントは問題なく処理されます。 どうすれば、クリックできるようになるでしょうか? おかしな質問で申し訳ありませんが、よろしくお願いします。

  • スレッド処理からダイアログを表示するには?

    Windows XPとVC++ 6.0で 時間のかかる大量の計算をするプログラムを作っています。 計算部分はスレッド処理にして 進捗ダイアログ(CDialogにCProgressCtrlを貼り付けたもの) を表示します。 ・CWinAppのInitInstanceで計算処理開始(AfxBeginThread) ・計算処理内で進捗ダイアログをCreate ・計算の進み具合によって進捗ダイアログのプログレスバーを更新 上記の流れではうまくいっていたのですが 以下のように変更したところ、進捗ダイアログをCreateするところで プログラムが応答なしになってしまうようになりました。 ・メインダイアログ(モーダル) ・メインダイアログのAボタンクリックでダイアログAを開く(モーダル) ・ダイアログAの実行ボタンクリックで計算処理開始(AfxBeginThread) ・計算処理内で進捗ダイアログをCreate ・計算の進み具合によって進捗ダイアログのプログレスバーを更新 MFC Wizardでダイアログベースで作成、MFCの共有DLLを使用しています。 モーダルダイアログ→スレッド→CDialog.Createに 制限があったりするのでしょうか。 どうかご教授ください。

  • ダイアログ最前面表示時の後ろの画面操作について

    はじめまして。 お世話になります。 開発環境:WindowsXP VC++6.0 MFC使用 ダイアログベースで画面を作成(A.exe CDialogベース)し、その画面でボタンを押下し 子画面(A_Child)を表示させます。表示方法はDoModal()で。 そのA_ChildはCDialogベースです。 A_Childダイアログが表示されている間(最前面)は、デスクトップ上の操作を 何も出来ない様にしたいのですが、方法はありますでしょうか? (例:スタート→ログオフでダイアログが表示しますよね。 その時ってそのダイアログ以外は触れないですよね。) せめて、自分たちが作成したアプリだけでも操作不可能にしたいのです。 SetWindowPos()、ModifyStyle()、色々試しましたが上手くいきません。 DoModalで表示させるのがそもそもまちがいののでしょうか? 何か方法が有りましたらよろしくお願いします。 説明が下手ですみません。

  • メインダイアログを表示させずにファイル選択ダイアログを表示

    VC++2005のMFCダイアログベースでプログラムを作成しています。 自動生成されたプログラムを何も変更しないまま実行すると、 メインのダイアログが表示されますが、 そのダイアログを表示させずに、ファイル選択ダイアログを表示させたいのです。 自分で実装しビルド実行したところ、期待動作をしましたが、 ファイル選択ダイアログを閉じた後に、画像のようなエラーが発生してしまいます。 エラーを発生させず、期待動作をさせる良い実装方法をご存知の方おられましたら、 ご教示お願い致します。 【変更実装(エラー発生)】 BOOL CtestApp::InitInstance() { … CtestDlg dlg; m_pMainWnd = &dlg; // INT_PTR nResponse = dlg.DoModal(); //コメントアウト dlg.OnBnClickedButton1(); //ファイル選択ダイアログを表示する関数 //if (nResponse == IDOK) //コメントアウト //else if (nResponse == IDCANCEL) //コメントアウト … } void CtestDlg::OnBnClickedButton1() { CFileDialog ReadDlg( TRUE, NULL, "*.txt", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, "txtファイル(*.txt)", this ); … }

専門家に質問してみよう