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、在CFirstDlg.h头文件中添加消息处理函数定义:
afx_msg LRESULT OnMsMessage(WPARAM wParam, LPARAM lParam);
3、在CFirstDlg.cpp实现文件中添加消息映射:
BEGIN_MESSAGE_MAP(CFirstDlg, CDialog)
ON_MESSAGE(WM_MS_MESSAGE, &CFirstDlg::OnMsMessage)
END_MESSAGE_MAP()
4、在CFirstDlg.cpp实现文件中添加消息处理函数:
LRESULT CFirstDlg::OnMsMessage(WPARAM wParam, LPARAM lParam)
{
this->ShowWindow(SW_SHOW); //接收到非模式对话框发送来的消息,显示自身(主对话框)
return 0;
}