はじめまして。
MFC使うのが10年ぶりの黛と申します。
ダイアログベースのアプリケーションを作っているのですが、アプリケーションクラスの
InitInstance()で規定のダイアログがDoModal()されています。
このダイアログクラス名を変更すると、規定のダイアログクラス以外のダイアログが表示
されることは理解できたのです。
そこでDoMoal()された戻り値をチェックするif文内部で、別の(変更する前の規定の)ダ
イアログをDoModal()しようとすると、一瞬表示されるだけで処理が止まってくれませ
ん。というか、最初のDoMoal()の直後に別のDoModal()を入れても同様です。
AfxMessageBox()も表示してくれません。
アプリケーションクラス内でのDoModal()実行において、繰り返しDoModal()を実行する方
法はないのでしょうか。
あちこち情報を探したのですが、見つからず質問にいたりました。
よろしくご指導お願いします。
すいません、開発環境です。
WinXP(SP1) VC6++ MFCです。
よろしくお願いします。
もともとあるDoModalを後から表示するダイアログするのはだめでしょうか?
つまり
AfxMessageBox( _T( " ) ); // これなら表示できる
CXXXXDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: ダイアログが <OK> で消された時のコードを
// 記述してください。
}
else if (nResponse == IDCANCEL)
{
// TODO: ダイアログが <キャンセル> で消された時のコードを
// 記述してください。
}
そうなのです。
もともとあるダイアログを、後から表示したいのです。
複雑な状況を、提示コードもなしにご説明していたかもしれません。
こういうことなのです。
CChangeDlg dlg; // 後から作成したダイアログ(クラス名を変えてある)
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: ダイアログが <OK> で消された時のコードを
// 記述してください。
--- この部分が動かないのです ---------------------------------------------------
COrgDlg dlgorg; // ウィザード規定のダイアログ
m_pMainWnd = &dlgorg;
nResponse = dlgorg.DoModal();
--------------------------------------------------------------------------------
}
else if (nResponse == IDCANCEL)
{
// TODO: ダイアログが <キャンセル> で消された時のコードを
// 記述してください。
}
私のコードがおかしいのかと思って、点線の範囲をAfxMessageBox()にもしてみたのです
が、それでもだめだったということなのですが。
よろしくお願いいたします。
最初の
>m_pMainWnd = &dlg;
が不味いようです。
<MSDN>
CWinThread::m_pMainWnd
解説
スレッドのメイン ウィンドウ オブジェクトへのポインタを格納します。
Microsoft Foundation Class は、m_pMainWnd が参照しているウィンドウが閉じられる
と自動的にスレッドを終了します。
</MSDN>
解決しました。
なるほど、チェックしてませんでした。
先のウィザードコード部分を、次のようなコードに置き換えて実行してみると、こちらで
も動かなかったので、m_pMainWndが要因ではないと考えていました。
何かほかのコードが影響していたのかもしれません。
CxxxOpt dlg;
dlg.DoModal();
dlg.DoModal();
1番目のDoModal()コールの際にm_pMainWndを設定しないことで解決するようです。
--------------------------------------------------------------------------------
CChangeDlg dlg; // 後から作成したダイアログ(クラス名を変えてある)
// m_pMainWnd = &dlg; // 最初のDoModal()の際には設定しない
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: ダイアログが <OK> で消された時のコードを
// 記述してください。
COrgDlg dlgorg; // ウィザード規定のダイアログ
m_pMainWnd = &dlgorg;
nResponse = dlgorg.DoModal();
}
else if (nResponse == IDCANCEL)
{
// TODO: ダイアログが <キャンセル> で消された時のコードを
// 記述してください。
}
--------------------------------------------------------------------------------
本当にありがとうございました。