Modal()後に、別のダイアログをModal()する方法 – プログラミング – Home

Modal()後に、別のダイアログをM...
 
通知
すべてクリア

[解決済] Modal()後に、別のダイアログをModal()する方法


黛
 黛
(@黛)
ゲスト
結合: 18年前
投稿: 4
Topic starter  

はじめまして。

MFC使うのが10年ぶりの黛と申します。

ダイアログベースのアプリケーションを作っているのですが、アプリケーションクラスの
InitInstance()で規定のダイアログがDoModal()されています。

このダイアログクラス名を変更すると、規定のダイアログクラス以外のダイアログが表示
されることは理解できたのです。
そこでDoMoal()された戻り値をチェックするif文内部で、別の(変更する前の規定の)ダ
イアログをDoModal()しようとすると、一瞬表示されるだけで処理が止まってくれませ
ん。というか、最初のDoMoal()の直後に別のDoModal()を入れても同様です。
AfxMessageBox()も表示してくれません。

アプリケーションクラス内でのDoModal()実行において、繰り返しDoModal()を実行する方
法はないのでしょうか。
あちこち情報を探したのですが、見つからず質問にいたりました。

よろしくご指導お願いします。


引用未解決
トピックタグ
黛
 黛
(@黛)
ゲスト
結合: 18年前
投稿: 4
Topic starter  

すいません、開発環境です。

WinXP(SP1) VC6++ MFCです。

よろしくお願いします。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

もともとあるDoModalを後から表示するダイアログするのはだめでしょうか?

つまり

AfxMessageBox( _T( " ) ); // これなら表示できる

CXXXXDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: ダイアログが <OK> で消された時のコードを
// 記述してください。
}
else if (nResponse == IDCANCEL)
{
// TODO: ダイアログが <キャンセル> で消された時のコードを
// 記述してください。
}


返信引用
黛
 黛
(@黛)
ゲスト
結合: 18年前
投稿: 4
Topic starter  

そうなのです。
もともとあるダイアログを、後から表示したいのです。
複雑な状況を、提示コードもなしにご説明していたかもしれません。
こういうことなのです。

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()にもしてみたのです
が、それでもだめだったということなのですが。

よろしくお願いいたします。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

最初の
>m_pMainWnd = &dlg;
が不味いようです。

<MSDN>
CWinThread::m_pMainWnd
解説

スレッドのメイン ウィンドウ オブジェクトへのポインタを格納します。
Microsoft Foundation Class は、m_pMainWnd が参照しているウィンドウが閉じられる
と自動的にスレッドを終了します。
</MSDN>


返信引用
黛
 黛
(@黛)
ゲスト
結合: 18年前
投稿: 4
Topic starter  

解決しました。

なるほど、チェックしてませんでした。
先のウィザードコード部分を、次のようなコードに置き換えて実行してみると、こちらで
も動かなかったので、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: ダイアログが <キャンセル> で消された時のコードを
// 記述してください。
}
--------------------------------------------------------------------------------
本当にありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました