SDI工程:一个菜单里面有多个子菜单,单击每个子菜单都可打开一个对应的非模态对话框(视图的子窗口)。想实现的功能如下:当单击某一个子菜单1时,程序应能判断视图是否有已经打开的非模态对话框,如果有就关闭它,并delete其指针,同时,显示对应的非模态对话框。
    我知道比较笨的方法,即:逐一判断所有的已经定义的非模态对话框指针是否为NULL,如果不为NULL,就DestroyWindow(),然后delete 指针,再将指针赋值NULL。最后,根据需要创建并显示需要的非模态的对话框。
    由于涉及到的对话框太多,上述方法太麻烦,不知道各位大侠有没有简便的方法。
    谢谢。
    不知能否通过GetDlgItem( dlgID )获取指针,然后删除,好像不行,如果能行就好处理了。
     

解决方案 »

  1.   

    如果每次只显示一个非模态对话框的话,可以把对话框的指针赋值到一个变量中,没次要显示对话框时查看指针是否为空。
    如果每次可以显示多个对话框的话,可以把创建的对话框句柄写入一个map数组中,对话框销毁时从数组中删除。
      

  2.   

    不行呀。可能我没有把问题说清楚。是这样的:
    在CSampleView(FORMVIEW)头文件中定义了多个非模态对话框,作为视图的子窗体。
     CDLG1*  pdlg1;
     CDLG2*  pdlg2;
     CDLG3*  pdlg3;
     CDLG4*  pdlg4;
    .........
     CDLGn*  pdlgn;在视图构造函数中将它们都赋值为NULL。
    单击菜单i,创建pdlgi并显示。如果有打开的其它对话框,则删除该对话框,并delete其指针。
    问题是如何判断视图中是否有打开的对话框,如果挨个判断,又太笨,请问有没有其它方法。  
      

  3.   

    那个, 我很笨.
    这样可以不?PVOID pCurrentDlg = NULL;单击一个菜单后, 如果发现pCurrentDlg不为0就删除对话框.然后创建你需要的对话框, 然后 pCurrentDlg就赋值成 这个对话框的指针.可是这不是很容易吗?
    我看错了吗?
      

  4.   

    删除正在显示的对话框是不是这样呀?
    pCurrentDlg->DestroyWindow() 
    但是不行,出错。
      

  5.   

    楼上服了您了((YourDlg*)pCurrentDlg)->DestroyWindow();
      

  6.   

    如果你一次只显示一个对话框,不需要保存这么多指针的,只需要一个对话框指针,甚至是CWnd*指针就可以了。这样不是很简单么?创建的时候在你的不同的菜单消息里创建不同的对话框就可以了。
    C...Vew::OnCreateDlgA()
    {
    if (m_pDlg)
        delete m_pDlg;
    m_pDlg = new CDlgA(this);
    }C...View::OnCreateDlgB()
    {
    if (m_pDlg)
        delete m_pDlg;
    m_pDlg = new CDlgB(this);
    }
      

  7.   

    楼上,不要使用CWnd*指针 ,一般来说,如果他们重载DestroyWindow,不会把DestroyWindow设置为虚函数, , 那么你建议使用CWnd*指针来调用DestroyWindow就会错过自己的DestroyWindow, 所以我推荐 PVOID
      

  8.   

    8楼的不行,程序又不知道到底哪一个对话框在显示,何谈指针的转化。9楼的可行。不过需要的是对话框指针,如果是CWnd*会带来很多问题。谢谢