本帖最后由 flyinskylo 于 2012-10-31 10:51:47 编辑

解决方案 »

  1.   

    CStationMonitorDlg 你的这个是怎么写的??
      

  2.   

    void CBusConDlg::OnGridDblClick(NMHDR *pNotifyStruct, LRESULT* pResult)
    {
      CStationMonitorDlg*pDlg = new CStationMonitorDlg(); 
      pDlg->Create(IDD_STATION_MONITOR);
    pDlg->ShowWindow(SW_SHOW);
    }
    不要这样写,因为pDlg可能会作为函数中的局部指针变量,除了函数作用域,出现什么情况就不好控制了。
    pDlg最好作为类CBusConDlg的成员变量提前插入声明下,然后在这个OnGridDblClick函数中再new出来,
      

  3.   

    CStationMonitorDlg  这个类就是个对话框的界面 
      

  4.   

    CStationMonitorDlg*pDlg
    改在CBusConDlg.h 中申明了还是第二个对话框出现失败
      

  5.   

    这样:
    在CBusConDlg.h中这样声明
    CStationMonitorDlg * m_Dlg;
    vector<CStationMonitorDlg*> m_vec_pDlg;然后,在CBusConDlg的构造函数中,初始化m_Dlg = NULL;
    void CBusConDlg::OnGridDblClick(NMHDR *pNotifyStruct, LRESULT* pResult)
    {
      m_pDlg = new CStationMonitorDlg();  
      m_pDlg->Create(IDD_STATION_MONITOR);
      m_pDlg->ShowWindow(SW_SHOW);
      m_vec_pDlg.push_back(m_pDlg);
    }
    在析构函数中
    CBusConDlg::~CBusConDlg()
    {
      m_pDlg = NULL;
     for (vector<CStationMonitorDlg*>::iterator iter = m_vec_Dlg.begin();iter!= m_vec_Dlg.end();iter++)
       {
    m_pDlg = *iter;
    delete m_pDlg;
       }
    }
      

  6.   

    CStationMonitorDlg * m_Dlg;
    和这里
     for (vector<CStationMonitorDlg*>::iterator iter = m_vec_Dlg.begin();iter!= m_vec_Dlg.end();iter++)
    应该是m_pDlg和m_vec_pDlg,写掉了~
      

  7.   

    按5楼说的做了,
    退出时未出现错误,但是有个提示
    CBusConDlg::~CBusConDlg()
    {
    m_pDlg = NULL;
    这里   for (vector<CStationMonitorDlg*>::iterator iter = m_vec_pDlg.begin();iter!= m_vec_pDlg.end();iter++)
    {
    m_pDlg = *iter;
    delete m_pDlg;
    }}
    monitor.exe 中的 0x00000000 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
      

  8.   

    删了这段,暂时行了,好像不太安全。有没有其他的方法,vector我不太熟,我熟悉熟悉,多个窗口时还会出现对话框重叠部分灰色背景变白的问题,是不是应该相应下CStationMonitorDlg的鼠标点击消息,让对话框重绘
      

  9.   

    按5楼说的,还是不行,release模式下忽略错误,但是有重叠部分灰色背景变白问题
      

  10.   

    你的需求是不是要这个对话框在ONCANCLE以后,然后还可以再SHOW出来?对话框里是否有状态需要保存?
    如果这样的话,不用都加到VECTOR里。
    void CBusConDlg::OnGridDblClick(NMHDR *pNotifyStruct, LRESULT* pResult)
    {if(NULL != m_pDlg)
    {  
      m_pDlg = new CStationMonitorDlg();   
      m_pDlg->Create(IDD_STATION_MONITOR);
    }
      m_pDlg->ShowWindow(SW_SHOW);
    }析构的时候删这一个就可以了。注意在CBusConDlg构造的时候 m_pDlg = NULL;
      

  11.   

    不是,我需要的是可以开几个非模态对话框CStationMonitorDlg,现在开第二个就报错
      

  12.   

    帖子不要沉啊,谁能帮我想想办法,非模态对话框我要开多个,我尝试用CArray管理指针但是还是在create的时候提示那个只能做一次绑定的中断。我见别人在单文档模式下,可以开很多,我想这个应该不难吧。release下也能开多个,但是debug老报错,还是方法不对
      

  13.   

    析构函数加个判断:判断vector是否为空
    CBusConDlg::~CBusConDlg()
    {
      if(!m_vec_Dlg.empty())
      {
       m_pDlg = NULL;
      for (vector<CStationMonitorDlg*>::iterator iter = m_vec_Dlg.begin();iter!= m_vec_Dlg.end();iter++)
       {
     m_pDlg = *iter;
     delete m_pDlg;
       }
      }
    }
      

  14.   

    主要不是在销毁时候出的问题,是在create的时候出来个
    ASSERT(pWnd->m_hWnd == NULL);   // only do once
    中断
      

  15.   

    你在每次new之前都赋为NULL
    m_pDlg = NULL;
    m_pDlg = new CStationMonitorDlg();   
      

  16.   

    ASSERT(pWnd->m_hWnd == NULL); // only do once
    意思就是pWnd已经有窗口了。if(pWnd->IsWindow())
    {
    pWnd->DestroyWindow();
    ..实际:
    你在每次new之前:if(m_pDlg->IsWindow()) m_pDlg->DestroyWindow();
    m_pDlg = new CStationMonitorDlg();   
      

  17.   

    如果是 多个 m_pDlg 那么 这个 m_pDlg 应该是个数组。(或 CPPtrArray)
    CXxxxxDlg *m_apDlg[MAX];
    new时:
    m_apDlg【id】=new CXxxxxDlg;不要时:for(int kk=0;kk< Now;kk ++)
    {
    if(m_apDlg[kk]->IsWindow())
    {
    m_apDlg[kk]->DestroyWindow();
    }delete [] m_apDlg;}
      

  18.   

    感谢大家的帮助,我学到了很多,仔细查了下代码,我发现这个不是非模态对话框创建的错误,
    是非模态对话框中包含了一个Tab控件里面有两个对话框:
    以m_xxxDlg.Create(IDD_BUS_CONDITON,&m_tab_base);的形式创建的,
    其中m_xxxDlg是在.cpp中定义的全局变量。
    我想应该是m_xxxDlg.Create(IDD_BUS_CONDITON,&m_tab_base);只能做一次吧
    YI_RIVER_LOVE 
    和schlafenhamster 
    说的很好。
    此贴结了吧,非对话框的创建删除的问题解决了,另外Tab控件解决方法我还没有想到,
    各位前辈帮我一下