VC MFC中关于非模态对话框的操作

来源:互联网 发布:淘宝 大类目小类目 编辑:程序博客网 时间:2024/04/30 20:17


最近遇到一个问题,就是用对话框编程,对话框中有一个按钮,点击后会弹出一个非模态的对话框,但是这个对话框是每单击一次就会弹出一个,有时候会不小心点上好几个,怎么能只弹出一个对话框呢?

先对要使用的类进行说明:

CMainDlg   主界面对话框

CChildDlg 子对话框(就是非模态弹出的对话框)


1.在CMainDlg.h中增加#include<ChildDlg.h>

2.在Public:下增加CChildDlg *m_pChildDlg;   

3.在CMainDlg.cpp中初始化m_pChildDlg = NULL;

4.在主对话框按钮的单击事件中增加下面的代码



if(m_pChildDlg )m_pChildDlg ->SetActiveWindow();else{m_pChildDlg = new CAGCCfg();m_pChildDlg ->Create(IDD_AGC_CFG,this);      m_pChildDlg ->ShowWindow(SW_SHOW);m_pChildDlg ->CenterWindow();}


5.在CChildDlg中增加

void CChildDlg ::PostNcDestroy(){delete this;CDialog::PostNcDestroy();}void CChildDlg ::OnBnClickedCancel(){DestroyWindow();}

写完上面的代码就可以让非模态对话框只能打开一个,但是还有一个问题,就是当这个非模态对话框关闭后,再打开的时候却发现打不开了,是什么原因呢?


调试一下就会发现,当子对话框关闭后,m_pChildDlg这个指针还没有赋空值

所以还要在修改第5步中的代码

void CAGCCfg::OnBnClickedCancel()
{
((CMainDlg *)GetParent())->m_pChildDlg= NULL;
DestroyWindow();
}

按照上面的步骤完成就可以实现只打开一个非模态对话框啦