定义了一个对话框类CDlg  其中有一个列表控件,CListViewCtrl  m_cList;
        BEGIN_DDX_MAP(CDlg)
DDX_CONTROL_HANDLE(IDC_LIST1,m_cList)
END_DDX_MAP()在LRESULT CDlg::OnInitDialog(UINT, WPARAM, LPARAM, BOOL &)
{
CenterWindow(); DoDataExchange(FALSE); ATLASSERT(m_cList.IsWindow()); DWORD dwStyle = m_cList.GetExStyle();
dwStyle |= LVS_EX_FULLROWSELECT;
dwStyle |= LVS_EX_CHECKBOXES;
.............
}HWND CDlg::Create(HWND hwnd)
{
ATLASSERT(!IsWindow()); return CDialogImpl<CDlg>::Create(hwnd);
}void CDlg::Destroy()
{
if(IsWindow())
{
DestroyWindow();
}
}在主界面上定义了 CDlg m_Dlg;
m_Dlg.Create(m_hWnd);在自定义的对话框中,关闭,调用Destroy。
然后又在主界面上m_Dlg.Create(m_hWnd);   
就出问题,提示  ATLASSERT(m_cList.IsWindow());该如何解决?

解决方案 »

  1.   

    m_Dlg.Create(m_hWnd);
    在创建之前先判断一下
    if(m_Dlg.GetSafeHwnd())
    {
     m_Dlg.DestoryWindow();
    }
    m_Dlg.Create(...);确实也没有必要重复创建,非模态对话框你用ShowWindow(SW_SHOW/SW_HIDE);就可以了
      

  2.   

    ATLASSERT(IsWindow(m_cList.m_hWnd));
      

  3.   

    error C2039: “GetSafeHwnd”: 不是“CDlg”的成员
      

  4.   

    class CDlg : public CDialogImpl<CDlg>
       , public CWinDataExchange<CDlg>
    {
    .........
    };
      

  5.   

    在主界面上定义了 CDlg m_Dlg;
    全局变量?改成局部变量试试
      

  6.   


    那判断 m_Dlg.m_hWnd 有没有这个成员?莫非不是对话框的父类 那你定义一个BOOL 值 初始FALSE
    Create的时候 如果为FALSE 就赋值TRUE
    然后创建销毁的时候 赋值FALSE
      

  7.   

    第一次创建时候,,没有问题,但是销毁以后,重新创建,就提示m_cList  ATLASSERT(m_cList.IsWindow());这到底是为什么啊?
      

  8.   

    用的是wtl,看代码应该不会有什么问题,可能其他地方出问题了,上传工程,下载给你看看
      

  9.   

    m_Dlg 为什么不弄成成员指针变量呢?
      

  10.   

    估计是重复使用了m_Dlg的缘故吧?new它一次就可以了。
    #pragma push_macro("new")
    #undef new
    ::new (&m_Dlg);
    #pragma pop_macro("new")
    // 再次创建。
    m_Dlg.Create(m_hWnd);
      

  11.   


    提示 error C2059: 语法错误 : “new”
      

  12.   

    #include <new.h>#pragma push_macro("new")
    #undef new
    ::new (&m_Dlg);
    #pragma pop_macro("new")
    error C2059: 语法错误 : “new”还是不行
      

  13.   

    我把  CListViewCtrl  m_cList;  定义为局部变量   程序没有问题
      

  14.   

    行了   在Destroy()里 加上  m_cList.Detach();