对话框工程中,有一个主窗口A,我又加入一个对话框B,
在A的类的头文件中声明B类,在A的InitDialog中,创建并显示B窗口,而且B是A的一个子窗口(在属性中有选择child)在A上有按钮G,其OnClick中,想使B销毁后重新创建并显示,但总是不成功:
调用B的Destroy不行,调用SendMessage(WM_CLOSE)也一样不行,以前的窗口可以销失,但是新创建的窗口还是原来的最后状态

解决方案 »

  1.   

    如果想要不同状态的话,可以b是指针,然后通过new来分配。在关闭后delete b再重新new一个。
    可以用OnOK()来关闭。
      

  2.   

    一般用
    b->DestroyWindow();
    但是新创建的窗口还是原来的最后状态是指什么??是否调了b的ShowWindow
      

  3.   

    在B显示的时候,按上边的Canel或者右上角的“X”都可以使B消失,但是,仅仅是消失而不是销毁,其实就是隐藏了,在G的OnClick中可以直接用ShowWindow来显示出来而我要的是销毁,即如果不再重新创建的话,就不能用ShowWindow来重新显示我调用的就是B的DestroyWindow原来的状态,是指上次对B操作的状态,即比如B上你原来设置了某一个控件的text了,那么这次“重新创建”后再显示,还是原来我设置的那个text以下是我的源码:
    void CDirect1523Dlg::OnToolsRemittance() 
    {
    //*
    if( g_PubFun.m_DlgRemittance.m_hWnd != NULL )
    {
                      //这里用SendMessage或者DestroyWindow都是一样的效果,可以把窗口隐藏但不能销毁,即它的m_hWnd不是空。我这里手动设置成NULL,是没有作用的
    g_PubFun.m_DlgRemittance.SendMessage( WM_CLOSE );
    g_PubFun.m_DlgRemittance.m_hWnd = NULL;
    }
    //*/ //if ( g_PubFun.m_DlgRemittance.m_hWnd == NULL )
    //{
    g_PubFun.m_DlgRemittance.Create( IDD_DLG_MONEY_REMITTANCE );
    g_PubFun.m_DlgRemittance.CenterWindow();
    //} g_PubFun.m_DlgRemittance.ShowWindow( SW_SHOW );
    g_PubFun.m_DlgRemittance.ShowWindow( SW_RESTORE );
    g_PubFun.m_DlgRemittance.BringWindowToTop();
    }
      

  4.   

    改为:void CDirect1523Dlg::OnToolsRemittance() 
    {
             HWND hWnd = g_PubFun.m_DlgRemittance.m_hWnd;
    if( hWnd != NULL && ::IsWindow(hWnd) )
    {
    g_PubFun.m_DlgRemittance.SendMessage( WM_CLOSE );
    g_PubFun.m_DlgRemittance.m_hWnd = NULL;
    }          hWnd = g_PubFun.m_DlgRemittance.m_hWnd;
    if( hWnd == NULL || !(::IsWindow(hWnd)) )
    {
         g_PubFun.m_DlgRemittance.Create( IDD_DLG_MONEY_REMITTANCE );
         g_PubFun.m_DlgRemittance.CenterWindow();
    } g_PubFun.m_DlgRemittance.ShowWindow( SW_SHOW );
    g_PubFun.m_DlgRemittance.ShowWindow( SW_RESTORE );
    g_PubFun.m_DlgRemittance.BringWindowToTop();
    }
      

  5.   

    如楼上所说,你这个m_DlgRemittance应该改成指针的,销毁窗口后delete之,创建之前new之。因为你的类没有销毁,只是销毁了窗口对象,而类里的数据还是原来的,所谓的最后的状态,这是你的窗口显示的依据。或者,可以设计一个B类的初始化成员函数initdata(),销毁窗口之后或重新创建之前,可以调用这个函数initdata()对B类的关键成员进行初始化。
      

  6.   

    好了,我用指针可以了:void CDirect1523Dlg::OnToolsRemittance() 
    {
    if( g_PubFun.m_pDlgRemittance != NULL )
    {
    g_PubFun.m_pDlgRemittance->DestroyWindow();
    delete g_PubFun.m_pDlgRemittance;
    g_PubFun.m_pDlgRemittance = NULL;
    } g_PubFun.m_pDlgRemittance = new CDlgRemittance();
    g_PubFun.m_pDlgRemittance->Create( IDD_DLG_MONEY_REMITTANCE );
    g_PubFun.m_pDlgRemittance->CenterWindow(); g_PubFun.m_pDlgRemittance->GetRate();
    g_PubFun.m_pDlgRemittance->ShowWindow( SW_SHOW );
    g_PubFun.m_pDlgRemittance->ShowWindow( SW_RESTORE );
    g_PubFun.m_pDlgRemittance->BringWindowToTop();
    }
      

  7.   

    其实可以这样做:
    void CDddDlg::OnButton1() 
    {
    // 
    HWND hWnd = aaadlg.GetSafeHwnd();
    if (hWnd != NULL)
    {
    aaadlg.DestroyWindow();//消毁以前的对话框
    aaa tempdlg;//建立一个新的对象
    tempdlg.Create(IDD_DIALOG1,this);
    aaadlg.Attach(tempdlg.Detach());//这里应该没有内存泄漏,要查一查才知道。
    aaadlg.ShowWindow(SW_SHOW);
    }
    }
      

  8.   

    to : 回复人: zxyjyzxyjy(星星) 
    你说的有道理。