MFC对话框项目关闭对话框的相关问题 我建立了一个对话框项目,其中有XXXDlg.cpp在这里面是管理员的界面,用户的界面是另外一个对话框,它俩没有关系,当我关闭用户的界面时,管理员的界面就会弹出,我想用户的界面关闭后所有窗口都关闭了,不知道明白没有 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://blog.csdn.net/sj19890401/article/details/43017337 虽然觉得不合理,但你既然这么弄就随你吧实现其实很简单:你在你的用户界面类中保存管理员的界面类对象的HWND,并为你的用户界面类添加WM_CLOSE消息,在关闭用户界面的时候向主界面发送WM_CLOSE消息即可:void CUserDlg::OnClose(){ ::PostMessage(m_hMain,WM_CLOSE,0,0); CDialog::OnClose();} 虽然觉得不合理,但你既然这么弄就随你吧实现其实很简单:你在你的用户界面类中保存管理员的界面类对象的HWND,并为你的用户界面类添加WM_CLOSE消息,在关闭用户界面的时候向主界面发送WM_CLOSE消息即可:void CUserDlg::OnClose(){ ::PostMessage(m_hMain,WM_CLOSE,0,0); CDialog::OnClose();}+1+1 虽然觉得不合理,但你既然这么弄就随你吧实现其实很简单:你在你的用户界面类中保存管理员的界面类对象的HWND,并为你的用户界面类添加WM_CLOSE消息,在关闭用户界面的时候向主界面发送WM_CLOSE消息即可:void CUserDlg::OnClose(){ ::PostMessage(m_hMain,WM_CLOSE,0,0); CDialog::OnClose();}其实我最初的想法是不管是管理员还是用户都进入XXXDlg中,其中XXXDlg中有一个Tab控件,管理员进入之后可以操作所有的选项卡,而用户仅可以操作其中一部分选项卡,因为我不太会控制Tab控件的显示,所以为用户又新建了一个对话框,如何控制Tab控件的选项卡,有没有好的建议呢,请教大神 你这种想法是不可以的,因为Tab控件会同时包含管理员界面和用户界面两个选项卡(只是只有一个当前显示罢了),然而根据用户属性的区别只能显示一个,那么不需要显示出来的你为什么要暴露出来呢?即使你做了显示处理,比如非管理员用户如果去手动单击/切换 管理员界面tab选项卡时你不去显示管理员界面,那也是不合理的!不需要的东西就不要暴露出来,更何况你暴露出来给用户,用户却什么也做不了,如果你是用户,你会怎么想这么一个设计?——烂其实你这个功能也很好实现啊,弄一个主对话框dlg,然后写两个派生于CPropertyPage的两个对话框CPageUser、CPageManager(属性:Border:None;Style:Child),在主对话框dlg的OnInitDialog函数中根据当前登录用户的属性Create相应的CPageUser或者CPageManager就可以了 虽然觉得不合理,但你既然这么弄就随你吧实现其实很简单:你在你的用户界面类中保存管理员的界面类对象的HWND,并为你的用户界面类添加WM_CLOSE消息,在关闭用户界面的时候向主界面发送WM_CLOSE消息即可:void CUserDlg::OnClose(){ ::PostMessage(m_hMain,WM_CLOSE,0,0); CDialog::OnClose();}+1+1我这样写的但是还是出现管理员的界面,其中m_dlg是管理员对话框类 对象 其中m_dlg是管理员对话框类 对象----------------------------------------------------你在用户界面类中保存的m_dlg对象?不是指针?? 把你的设置m_dlg的代码贴出来看看? CICDlg m_dlg;CICDlg这是管理员界面的类 CICDlg m_dlg这个是你在用户界面类中声明的? 我以前是先建立一个登陆对话框,然后建立两个对话框,一个是管理员一个是用户,然后能够---------------------------------------------------------------------------------------------------------------------------貌似你还是没有领会精神,那就算了吧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); 登录后,使用domodal 遮住主对话框?如果是这样,CUserDlg类建一个带参数构造函数,使用语句CUserDlg dlg(this); CUserDlg保存主对话框指针,然后关闭时发一个消息到主对话框 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); 或者你直接保存一个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类 之间的耦合性太大! CICDlg ManagerDlg;CUserDlg UserDlg;//.....//.....//ManagerDlg.DoModal()之后,即窗口创建出来之后(窗口创建之后才会有窗口句柄)UserDlg.SetHwndManger(ManagerDlg.GetSafeHwnd);这几句要放在CUserDlg.cpp文件中吗? UserDlg.SetHwndManger(ManagerDlg.GetSafeHwnd);这几句要放在CUserDlg.cpp文件中吗?-----------------------------------------------------------------------------------------------------------------------------从这一句你应该可以看到,通过UserDlg对象调用其成员函数SetHwndManger,显然是在你应用UserDlg的地方呀,怎么会是在UserDlg类的实现文件CUserDlg.cpp中呢说白了就是你定义CUserDlg UserDlg;这句的cpp中(或者说在声明UserDlg对象的头文件对应的cpp文件中)弱弱的问一下LZ,你学编程(C++)多久了? 没有积分,不能下载啊我可以发给你 一样的问题 发到哪里发到我邮箱吧,[email protected],谢了 你的意思就当用户点击关闭时让程序直接退出了么 直接在onbuttondown中 exit(0); 基于对话框绘图 菜鸟提问:弹出对话框的方式 求socket编程的资料 MFC如何用ADO连接数据库 晕~~我的Blog怎么打不开啊? 字符串指纹问题 VC关于加载FLASH的问题,求助!!!!!!!!!!!!!!!!!!!!!!! 在MFC中AddWindowsMessageHandle和在class wizard中加入事件响应有什么区别? 怎样用VC++编写反安装程序? PDA有关GPS问题 请教关于difftime(time_t,time_t);的问题 我想创建可以在任何一个OnClick事件中调用的函数,怎么写?
你在你的用户界面类中保存管理员的界面类对象的HWND,并为你的用户界面类添加WM_CLOSE消息,在关闭用户界面的时候向主界面发送WM_CLOSE消息即可:void CUserDlg::OnClose()
{
::PostMessage(m_hMain,WM_CLOSE,0,0);
CDialog::OnClose();
}
你在你的用户界面类中保存管理员的界面类对象的HWND,并为你的用户界面类添加WM_CLOSE消息,在关闭用户界面的时候向主界面发送WM_CLOSE消息即可:void CUserDlg::OnClose()
{
::PostMessage(m_hMain,WM_CLOSE,0,0);
CDialog::OnClose();
}
+1+1
你在你的用户界面类中保存管理员的界面类对象的HWND,并为你的用户界面类添加WM_CLOSE消息,在关闭用户界面的时候向主界面发送WM_CLOSE消息即可:void CUserDlg::OnClose()
{
::PostMessage(m_hMain,WM_CLOSE,0,0);
CDialog::OnClose();
}
其实我最初的想法是不管是管理员还是用户都进入XXXDlg中,其中XXXDlg中有一个Tab控件,管理员进入之后可以操作所有的选项卡,而用户仅可以操作其中一部分选项卡,因为我不太会控制Tab控件的显示,所以为用户又新建了一个对话框,如何控制Tab控件的选项卡,有没有好的建议呢,请教大神
你在你的用户界面类中保存管理员的界面类对象的HWND,并为你的用户界面类添加WM_CLOSE消息,在关闭用户界面的时候向主界面发送WM_CLOSE消息即可:void CUserDlg::OnClose()
{
::PostMessage(m_hMain,WM_CLOSE,0,0);
CDialog::OnClose();
}
+1+1
我这样写的但是还是出现管理员的界面,其中m_dlg是管理员对话框类 对象
----------------------------------------------------
你在用户界面类中保存的m_dlg对象?不是指针?? 把你的设置m_dlg的代码贴出来看看?
CICDlg m_dlg;CICDlg这是管理员界面的类
---------------------------------------------------------------------------------------------------------------------------
貌似你还是没有领会精神,那就算了吧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);
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);
{
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类 之间的耦合性太大!
CICDlg ManagerDlg;
CUserDlg UserDlg;
//.....
//.....
//ManagerDlg.DoModal()之后,即窗口创建出来之后(窗口创建之后才会有窗口句柄)
UserDlg.SetHwndManger(ManagerDlg.GetSafeHwnd);这几句要放在CUserDlg.cpp文件中吗?
-----------------------------------------------------------------------------------------------------------------------------
从这一句你应该可以看到,通过UserDlg对象调用其成员函数SetHwndManger,显然是在你应用UserDlg的地方呀,怎么会是在UserDlg类的实现文件CUserDlg.cpp中呢说白了就是你定义CUserDlg UserDlg;这句的cpp中(或者说在声明UserDlg对象的头文件对应的cpp文件中)弱弱的问一下LZ,你学编程(C++)多久了?
我可以发给你 一样的问题 发到哪里
发到我邮箱吧,[email protected],谢了
直接在onbuttondown中 exit(0);