MFC 模态、非模态窗口引发的系列事件及函数

标题一:创建模态窗口

CAdditionDlg dlg;        // 定义对话框类CAdditionDlg的对象dlg   

INT_PTR nResponse = dlg.DoModal();//获取子窗口的结束方式  
switch(nResponse)
{
    case IDOK:
    case IDCANCEL:
    case IDDESTROY:
} 

标题二:创建非模态子窗口(完美解决非模态窗口单例问题)

步骤一:创建子窗口指针类型的公有成员
public:
    CMyTip* m_mytip;
步骤二:父类通过按钮显示非模态子窗口
void CMy2048Dlg::OnBnClickedButton11()
{
    if(NULL == m_mytip)//判断子窗口是否已经打开
    {
        m_mytip = new CMyTip();
        m_mytip->Create(IDD_DIALOG1,this);
        //m_mytip->DoModal;
        m_mytable->ShowWindow(SW_SHOW);
        //模态跟非模态区别的关键
    }   
    else{
        AfxMessageBox(TEXT("NO AGAIEN"));
    }
}
步骤三:父类析构函数,释放子类窗口指针
CMy2048Dlg:: ~CMy2048Dlg()
{
    if(NULL!= m_mytip)
    {
        delete m_mytip;
    }
}
步骤四://子窗口销毁时,子窗口指针赋NULL
void CMyTip::OnDestroy()//子窗口销毁时会调用
{
    CDialogEx::OnDestroy();//原有代码
    AfxMessageBox(TEXT("delete 4"));
    CMy2048Dlg* m_parent = (CMy2048Dlg*)GetParent();
    //关键:获取父窗口指针
    m_parent->m_mytip = NULL;
}

你可能感兴趣的:(VS/MFC)