我建立了一个对话框项目,其中有XXXDlg.cpp在这里面是管理员的界面,用户的界面是另外一个对话框,它俩没有关系,当我关闭用户的界面时,管理员的界面就会弹出,我想用户的界面关闭后所有窗口都关闭了,不知道明白没有

解决方案 »

  1.   

    http://blog.csdn.net/sj19890401/article/details/43017337
      

  2.   

    虽然觉得不合理,但你既然这么弄就随你吧实现其实很简单:
    你在你的用户界面类中保存管理员的界面类对象的HWND,并为你的用户界面类添加WM_CLOSE消息,在关闭用户界面的时候向主界面发送WM_CLOSE消息即可:void CUserDlg::OnClose()
    {
    ::PostMessage(m_hMain,WM_CLOSE,0,0);
    CDialog::OnClose();
    }
      

  3.   

    虽然觉得不合理,但你既然这么弄就随你吧实现其实很简单:
    你在你的用户界面类中保存管理员的界面类对象的HWND,并为你的用户界面类添加WM_CLOSE消息,在关闭用户界面的时候向主界面发送WM_CLOSE消息即可:void CUserDlg::OnClose()
    {
    ::PostMessage(m_hMain,WM_CLOSE,0,0);
    CDialog::OnClose();
    }

    +1+1
      

  4.   

    虽然觉得不合理,但你既然这么弄就随你吧实现其实很简单:
    你在你的用户界面类中保存管理员的界面类对象的HWND,并为你的用户界面类添加WM_CLOSE消息,在关闭用户界面的时候向主界面发送WM_CLOSE消息即可:void CUserDlg::OnClose()
    {
    ::PostMessage(m_hMain,WM_CLOSE,0,0);
    CDialog::OnClose();
    }

    其实我最初的想法是不管是管理员还是用户都进入XXXDlg中,其中XXXDlg中有一个Tab控件,管理员进入之后可以操作所有的选项卡,而用户仅可以操作其中一部分选项卡,因为我不太会控制Tab控件的显示,所以为用户又新建了一个对话框,如何控制Tab控件的选项卡,有没有好的建议呢,请教大神
      

  5.   

    你这种想法是不可以的,因为Tab控件会同时包含管理员界面和用户界面两个选项卡(只是只有一个当前显示罢了),然而根据用户属性的区别只能显示一个,那么不需要显示出来的你为什么要暴露出来呢?即使你做了显示处理,比如非管理员用户如果去手动单击/切换 管理员界面tab选项卡时你不去显示管理员界面,那也是不合理的!不需要的东西就不要暴露出来,更何况你暴露出来给用户,用户却什么也做不了,如果你是用户,你会怎么想这么一个设计?——烂其实你这个功能也很好实现啊,弄一个主对话框dlg,然后写两个派生于CPropertyPage的两个对话框CPageUser、CPageManager(属性:Border:None;Style:Child),在主对话框dlg的OnInitDialog函数中根据当前登录用户的属性Create相应的CPageUser或者CPageManager就可以了
      

  6.   

    虽然觉得不合理,但你既然这么弄就随你吧实现其实很简单:
    你在你的用户界面类中保存管理员的界面类对象的HWND,并为你的用户界面类添加WM_CLOSE消息,在关闭用户界面的时候向主界面发送WM_CLOSE消息即可:void CUserDlg::OnClose()
    {
    ::PostMessage(m_hMain,WM_CLOSE,0,0);
    CDialog::OnClose();
    }

    +1+1
    我这样写的但是还是出现管理员的界面,其中m_dlg是管理员对话框类 对象
      

  7.   

    其中m_dlg是管理员对话框类 对象
    ----------------------------------------------------
    你在用户界面类中保存的m_dlg对象?不是指针?? 把你的设置m_dlg的代码贴出来看看?
      

  8.   


    CICDlg m_dlg;CICDlg这是管理员界面的类
      

  9.   

    CICDlg m_dlg这个是你在用户界面类中声明的?
      

  10.   

    我以前是先建立一个登陆对话框,然后建立两个对话框,一个是管理员一个是用户,然后能够
    ---------------------------------------------------------------------------------------------------------------------------
    貌似你还是没有领会精神,那就算了吧CICDlg m_dlg;CICDlg这是管理员界面的类
    --------------------------------------------------------
    这个问题,我该怎么说呢.... 举个例子吧:管理员操作类:CICDlg
    普通用户类:CUserDlg,其中有个CICDlg m_dlg成员变量声明定义两个变量用于显示管理员界面和普通用户界面:
    CICDlg   ManagerDlg;
    CUserDlg   UserDlg;
    你的逻辑是UserDlg关闭的时候要去关闭ManagerDlg,你这么写::PostMessage(m_dlg.m_hWnd,WM_CLOSE,0,0);
    那么请问 UserDlg.m_dlg.m_hWnd 和 ManagerDlg.m_hWnd是同一个HWND吗??很显然不是啊!姑且就接着你的思路来吧:
    class CUserDlg : public CDialog
    {
    CUserDlg(HWND hManger = NULL) : m_hManger(hManger)
    {
    }
    //.......
    void SetHwndManger(HWND hManger) { m_hManger = hManger; } void OnClose()
    {
         ::PostMessage(m_hManger,WM_CLOSE,0,0);
         CDialog::OnClose();
    }
    private:
    HWND m_hManger;
    }CICDlg   ManagerDlg;
    CUserDlg   UserDlg;
    //.....
    //.....
    //ManagerDlg.DoModal()之后,即窗口创建出来之后(窗口创建之后才会有窗口句柄)
    UserDlg.SetHwndManger(ManagerDlg.GetSafeHwnd);
      

  11.   

    登录后,使用domodal 遮住主对话框?如果是这样,CUserDlg类建一个带参数构造函数,使用语句CUserDlg dlg(this);  CUserDlg保存主对话框指针,然后关闭时发一个消息到主对话框
      

  12.   


    class CUserDlg : public CDialog
    {
    CUserDlg(HWND hManger = NULL) : m_hManger(hManger)
    {
    }
    //.......
    void SetHwndManger(HWND hManger) { m_hManger = hManger; } void OnClose()
    {
    ::PostMessage(m_hManger,WM_CLOSE,0,0);
    CDialog::OnClose();
    }
    private:
    HWND  m_hManger;
    };CICDlg   ManagerDlg;
    CUserDlg   UserDlg;
    //.....
    //.....
    //ManagerDlg.DoModal()之后,即窗口创建出来之后(窗口创建之后才会有窗口句柄)
    UserDlg.SetHwndManger(ManagerDlg.GetSafeHwnd);
      

  13.   

    或者你直接保存一个CICDlg 指针也可以,这样一来就不比等主窗口DoModal之后再去设置HWND了。但一定要是指针,指向你先前那个主窗口!class CUserDlg : public CDialog
    {
        CUserDlg(CICDlg *pManger = NULL) : m_pManger(pManger)
        {
        }
        //.......
        void SetManger(CICDlg *pManger) { m_pManger = pManger; }
     
        void OnClose()
        {
            ::PostMessage(pManger->GetSafeHwnd(),WM_CLOSE,0,0);
            CDialog::OnClose();
        }
    private:
        CICDlg     *m_pManger;
    };
     
    CICDlg   ManagerDlg;
    CUserDlg   UserDlg(&ManagerDlg); //当之后ManagerDlg.DoModal()后,其中就有窗口句柄了,UserDlg.m_pManger的窗口句柄也有了,因为m_pManger指向ManagerDlg,操作m_pManger就相当操作ManagerDlg,它俩才是同一个东西!
    //CUserDlg   UserDlg;
    //UserDlg.SetManger(&ManagerDlg);
    //.....
    //.....
    PS:但不建议这么做,虽然设置参数逻辑简单了许多,但是CICDlg类 和 CUserDlg类 之间的耦合性太大!
      

  14.   


    CICDlg   ManagerDlg;
    CUserDlg   UserDlg;
    //.....
    //.....
    //ManagerDlg.DoModal()之后,即窗口创建出来之后(窗口创建之后才会有窗口句柄)
    UserDlg.SetHwndManger(ManagerDlg.GetSafeHwnd);这几句要放在CUserDlg.cpp文件中吗?
      

  15.   

    UserDlg.SetHwndManger(ManagerDlg.GetSafeHwnd);这几句要放在CUserDlg.cpp文件中吗?
    -----------------------------------------------------------------------------------------------------------------------------
    从这一句你应该可以看到,通过UserDlg对象调用其成员函数SetHwndManger,显然是在你应用UserDlg的地方呀,怎么会是在UserDlg类的实现文件CUserDlg.cpp中呢说白了就是你定义CUserDlg   UserDlg;这句的cpp中(或者说在声明UserDlg对象的头文件对应的cpp文件中)弱弱的问一下LZ,你学编程(C++)多久了?
      

  16.   

    没有积分,不能下载啊
    我可以发给你 一样的问题 发到哪里
    发到我邮箱吧,[email protected],谢了
      

  17.   

    你的意思就当用户点击关闭时让程序直接退出了么
      直接在onbuttondown中 exit(0);