模态、非模态对话框
在应用程序中我们经常碰到这样的问题,我们用Create创建一个非模态对话框,但是我们想它具有模态的特点,那么这个问题是怎么实现的呢? 其实MFC源码中模态对话框的实现就是将父窗口Disable掉就行了。下面我们来看一个例子:
创建一个基于对话框的MFC应用程序,然后添加一个对话框资源,作为子窗口。
主要代码如下:
void CTestDlg::OnOK()
{
// m_pDlgChild --- 子窗口类指针
if ( m_pDlgChild == NULL )
{
m_pDlgChild = new CDlgChild; // 为新的子窗口类的实例分配内存
m_pDlgChild->Create(CDlgChild::IDD); // 创建子窗口,非模态的
m_pDlgChild->GetParent()->EnableWindow(FALSE); // 将父窗口(程序主窗口)Disable掉
// 这时,新创建的子窗口就变成了模态的了
}
m_pDlgChild->ShowWindow(SW_SHOWNORMAL); // 显示创建的子窗口
}
// 销毁创建的子窗口,并释放资源
void CTestDlg::DestroyChild()
{
if ( m_pDlgChild != NULL )
{
m_pDlgChild->DestroyWindow();
delete m_pDlgChild;
m_pDlgChild= NULL; // 销毁子窗口,释放资源
AfxGetMainWnd()->EnableWindow(); // 将主窗口Enable,否则就不能对主窗口进行操作了
AfxGetMainWnd()->SetFocus(); // 将主窗口置于焦点,否则子窗口关闭,就不能处于焦点
}
}
// 子窗口关闭时销毁子窗口
void CDlgChild::OnClose()
{
CWnd *pWnd = AfxGetMainWnd();
CTestDlg *pDlg = (CTestDlg*)pWnd; // 获得主窗口类指针
pDlg->DestroyChild(); // 调用主窗口类的成员函数销毁子窗口
}
阅读(1497) | 评论(0) | 转发(0) |