Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1613010
  • 博文数量: 441
  • 博客积分: 20087
  • 博客等级: 上将
  • 技术积分: 3562
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-19 15:35
文章分类

全部博文(441)

文章存档

2014年(1)

2012年(1)

2011年(8)

2010年(16)

2009年(15)

2008年(152)

2007年(178)

2006年(70)

分类: C/C++

2006-12-29 17:40:17

                                                           模态、非模态对话框
 
      在应用程序中我们经常碰到这样的问题,我们用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) |
给主人留下些什么吧!~~