2段階ダイアログの作成


1、メインダイアログをクリックしたときにメインダイアログボックスを非表示にし、非モードダイアログを生成します.
void CFirstDlg::OnBnClickedButton1()
{
	// TODO: Add your control notification handler code here
	this ->ShowWindow(SW_HIDE);			// 
	ModallessDlg = new CModallessDlg();  //
	ModallessDlg ->Create(IDD_DIALOG1,this);
	ModallessDlg ->ShowWindow(SW_SHOW);	// 
	
}

ここで、ModallessDlgは非モードダイアログのクラスインスタンスであり、メインダイアログのヘッダファイルに定義されます.
    
class CFirstDlg: public CDialog
{    ·····
     CModallessDlg * ModallessDlg ;
     ······
};

2、非モードダイアログをクリックした時に、SendMessageを呼び出してメインダイアログにメッセージを送り、同時に非モードダイアログを破棄する.メインダイアログボックスでこのメッセージを受信すると、自身(メインダイアログボックス)が表示されます.
void CSecondDlg ::OnBnClickedButton2()
{
	// TODO: Add your control notification handler code here
	GetParent()->SendMessage(WM_MS_MESSAGE,0,0);		// , ( )
	DestroyWindow();					// 
}

 
3、非モードダイアログのPostNcDestroy関数を再ロードし、この関数内で非モードダイアログのオブジェクトを削除します(delete this).
void CModallessDlg ::PostNcDestroy()
{
	// TODO: Add your specialized code here and/or call the base class

	CDialog::PostNcDestroy();
	delete this;// new 
}

 
そのうちWM_MS_MESSAGEはユーザーのためにメッセージをカスタマイズし、以下のように追加します.
1、staafx.hにメッセージ定義を追加する:
#define	WM_MS_MESSAGE	WM_USER+100 

2、CFRrstDlg.hヘッダファイルにメッセージ処理関数定義を追加する:
afx_msg LRESULT OnMsMessage(WPARAM wParam, LPARAM lParam);

3、CFRrstDlg.cppインプリメンテーションファイルにメッセージマッピングを追加するには:
BEGIN_MESSAGE_MAP(CFirstDlg, CDialog)
  ON_MESSAGE(WM_MS_MESSAGE, &CFirstDlg::OnMsMessage)
 END_MESSAGE_MAP()

4、CFRrstDlg.cppインプリメンテーションファイルにメッセージ処理関数を追加するには:
LRESULT CFirstDlg::OnMsMessage(WPARAM wParam, LPARAM lParam)
{
    this->ShowWindow(SW_SHOW);	// , ( )
     return 0;
}