一个基于对话(dlg1)的应用,程序中用SetTimer(1,1000,NULL)开了一个定时器,在OnTimer()中检测一个外部事件的发生,若事件发生则弹出另外一个模式对话,但若在OnTimer()中用dlg2.DoModal()来显示dlg2,不仅会阻塞本次OnTimer()中dlg2.DoModal()以下的程序的执行,使本次OnTimer()无法返回;并且当下次(1秒后)OnTimer()执行时会发生什么?当dlg2退出返回时,还能返回吗?请问各位大侠有什么好办法?

解决方案 »

  1.   

    刚开始,我也用过非模式对话:
    dlg2 *pdlg2;
    pdlg2=new dlg2();
    if(pdlg2->GetSafeHwnd())
       pdlg2->DestroyWindow();
    pdlg2->Create(IDD_DIALOG2,NULL);但是,由于dlg2中定义有比较多的CBitmap,CBrush类型的对象,第一次显示dlg2时没有问题;第二次显示时,运行到CBitmap.LoadBitmap()时会出错,必须在CBitmap.LoadBitmap()之前调用CBitmap.DeleteObject()才行,这是为什么?我想CBitmap对象是dlg2的成员,既然dlg2已退出且销毁,为何CBitmap不能直接LoadBitmap();而用模式对话时,就不存在这样的问题?
      

  2.   

    不要每次都new一个,定义一个内部变量在h文件中
    CDialog* m_pDlg;
    BOOL m_bShowFlag;//显示标志
    ...//cpp中初始化
    m_pDlg = NULL;
    m_bShowFlag = FALSE;
        if(!m_pDlg)
         {
           m_pDlg = new dlg2();
          }
         if(m_bShowFlag)
          {
           m_pDlg->ShowWindow(SW_HIDE);//隐藏
          }
         else
         {
             m_pDlg->ShowWindow(SW_SHOW);//显示
         }
         m_bShowFlag = !m_bShowFlag;
    //在析构函数中删除
    if(m_pDlg)
       delete m_pDlg;
      

  3.   

    To:Captainlll(山上人)
    非常感谢,我用了new,但却没有delete,结果他还是驻留在内存中!