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; }