DoModalで呼んだダイアログを消すには?

解決


ココ  2006-05-29 16:45:01  No: 61992  IP: 192.*.*.*

ダイアログAからDoModal()でダイアログBを呼ぶことはでき、
ダイアログAからダイアログBを削除したいのですが、
どうすればよろしいでしょうか?
ダイアログAはボタン2個配置し
ダイアログBにはボタン等を配置しないでstatic Editのみとしています。

編集 削除
Blue  2006-05-29 16:53:19  No: 61993  IP: 192.*.*.*

DoModalだと、ダイアログAが操作できないようですけど。
モードレスで立ち上げたのならばダイアログAが操作できますけど、、、

編集 削除
ココ  2006-05-29 17:26:21  No: 61994  IP: 192.*.*.*

モードレスというやり方がわからないのですが・・・おしえていただけますか・・・よろしくお願いします。

編集 削除
Blue  2006-05-29 17:27:55  No: 61995  IP: 192.*.*.*

わかりやすく解説したサイトです。参考にどうぞ。
http://www.vcppclub.com/kouza/memo/modeless.html

編集 削除
ココ  2006-05-30 11:41:05  No: 61996  IP: 192.*.*.*

上記のHPを参考にさせてもらいました。
追加質問をさせていただきます。
ダイアログAでボタンを2個配置し、
ボタンAでCreate()にてダイアログB(モードレス)を立ち上げ、
ボタンBでdeleteをし、ダイアログBは削除されましたが、
再度ボタンAを押すと以下メッセージが表示されてしまいます。
「test.exe の 0x7c290ab8 (mfc71d.dll) でハンドルされていない例外が発生しました : 0xC0000005: 場所 0xfeef002a を読み込み中にアクセス違反が発生しました。 。」
例外エラーをなくす方法はあるでしょうか?よろしくお願いします。

編集 削除
Blue  2006-05-30 11:50:57  No: 61997  IP: 192.*.*.*

ダイアログAのメンバ変数としてダイアログBをポインタとして持つとか。

例)
ダイアログA.h

class ダイアログA : public CDialog{
// 省略
private:
    ダイアログB* m_pBDlg; // 追加
};


ダイアログA.cpp

ダイアログA::ダイアログA(CWnd* pParent /*=NULL*/)
        : CDialog(CDirDlgDlg::IDD, pParent), m_pBDlg( NULL ) // 追加
{
// 省略


void ダイアログA::ダイアログB表示()
{
    if ( m_pBDlg != NULL )
    {
        AfxMessageBox( _T( "既にBは表示してあります。" ) );
        return;
    }
    m_pBDlg = new ダイアログB( this );
    m_pBDlg->Create();
}

void ダイアログA::ダイアログB閉じる()
{
    if ( m_pBDlg == NULL )
    {
        AfxMessageBox( _T( "Bは表示してません。" ) );
        return;
    }
    m_pBDlg->DestoryWindow();
    delete m_pBDlg;
    m_pBDlg = NULL;
}
他にも、ボタンを押したら、Enableにするとか方法はあります。

ダイアログB表示で複数表示したい場合は、工夫が必要です。

編集 削除
PATIO  2006-05-30 15:20:54  No: 61998  IP: 192.*.*.*

紹介されているHPはホントにモードレスを出したり消したりするという部分だけを
説明しているのでこれだけでプログラムを組んでしまうとおかしな事になりそうです。
すでにBlueさんがサンプルコードを提示されていますけれど、
newとdeleteがどんな事をする物で生成したオブジェクトの管理をどうする必要があるのかとかを良く考えないとうまく行きません。
例えば、ココさんのプログラムでボタンAを続けて二回押したらどうなりますか?
ボタンAを押さずにボタンBだけを押したら?
ボタンAを一回押してボタンBを二回続けて押したら?
ローカル変数にnewで生成したオブジェクトのアドレスを入れてしまうと
その関数から抜けた時に変数が開放されてアドレスがわからなくなりませんか?
等々。

実際にはココさんのソースが提示されていないので想像になりますが、
この辺の考え方はWindowsに限らない基本的な部分なので
この辺に自信がないのであれば、コンソールプログラムに立ち返って
この辺が納得できるまで勉強した方が良いですよ。
コンソールプログラムの方が簡単に試せるので色々やってみるには
こっちの方がお勧めです。

編集 削除
ココ  2006-05-30 19:12:14  No: 61999  IP: 192.*.*.*

Blue さんPATIO さんありがとうございました。
ご意見を参考にもうすこし考えてみます。

編集 削除