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

解決


ココ  2006-05-30 01:45:01  No: 61992

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


Blue  2006-05-30 01:53:19  No: 61993

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


ココ  2006-05-30 02:26:21  No: 61994

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


Blue  2006-05-30 02:27:55  No: 61995

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


ココ  2006-05-30 20:41:05  No: 61996

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


Blue  2006-05-30 20:50:57  No: 61997

ダイアログ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-31 00:20:54  No: 61998

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

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


ココ  2006-05-31 04:12:14  No: 61999

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加