DoModal窗口问题 现有一登录窗口Dlg1,成功登录之后以EndDialog方式销毁窗口Dlg1并以DoModal方式弹出窗口Dlg2。问题:Dlg2是Dlg1的子窗口,父窗口销毁之后子窗口还能存在么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 DoModal弹出,有指定父窗口为Dlg1吗? 以DoModal方式弹出的窗口不是前一窗口的子窗口么?那什么情况下两个窗口之间建立了父子关系? D1销毁后才起的D2,D1跟D2貌似一点关系都没吧,何来父子关系? 弹出窗口自然有父窗口,关键是定义Dlg2的代码是存在于哪里,也就是Dlg2是由那个窗口调用产生的。如果Dlg2在产生前,Dlg1已经销毁了,那么Dlg2的父窗口不可能是Dlg1。或者你的程序还有一个框架,负责产生处理各种模态对话框...希望LZ明示~ 我的MFC程序是这样的,程序运行时有一个登录窗口,成功登录之后弹出主窗口;而主窗口菜单中有个菜单项“财务系统”又需要进行登录后才能使用,此时点击该菜单项弹出另一登录窗口(即上面所述Dlg1),成功登录之后才能进入“财务系统”(即上面所述Dlg2)。那么这两个窗口的关系是怎么样的呢?什么情况下两个窗口之间建立了父子关系? 在主窗口上点“财务系统”时用DoModal弹出的登陆窗口就是主窗口的儿子了 建议楼主花5分钟做一个试验。对话框工程。dlg1:按一个按钮弹出dlg2dlg2:按一个按钮后,启动Timer(5秒,5秒后用EndDialog自杀)的同时,弹出dlg3。等待。5秒后看结果。 补充一下。 爹和儿子。1)dlg2想给dlg3当爹。在dlg2弹出dlg3之前,让dlg2作dlg3的爹。CDlg3 dlg(this);SetTimer(1,5000,NULL);.....执行,观察2)dlg3认爹。在资源里,把Dlg3的属性设成 甘当儿子的"child".执行,观察----------------作完了试验,估计你的疑虑完全消失了。哈哈! 晕,还是不太明白,按照13楼兄弟说的,只有人工设置指定才能具有父子关系,其它情况的窗口不存在关系?还有11楼kok202朋友的“‘财务’跟登录窗口是兄弟关系”是为什么? CDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL );这个构造函数默认的第二个参数为NULL,意思是main application window根据你的叙述,“程序运行时有一个登录窗口”,你的主程序窗口是这个登录窗口吧,那么看你的意思没有它并没有销毁,所以不会发生 要实现“先弹出登陆对话框,再弹出主对话框”的功能没那么复杂吧我在基于对话框的工程里试了一下,不知道是不是你想实现的:BOOL CtestApp::InitInstance(){ // 如果一个运行在 Windows XP 上的应用程序清单指定要 // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式, //则需要 InitCommonControls()。否则,将无法创建窗口。 InitCommonControls(); CWinApp::InitInstance(); AfxEnableControlContainer(); // 标准初始化 // 如果未使用这些功能并希望减小 // 最终可执行文件的大小,则应移除下列 // 不需要的特定初始化例程 // 更改用于存储设置的注册表项 // TODO: 应适当修改该字符串, // 例如修改为公司或组织名 SetRegistryKey(_T("应用程序向导生成的本地应用程序")); CNewDlg dlg1;//这个dlg1可以看作是登陆对话框, if(dlg1.DoModal()==IDOK) {//在CNewDlg中判断登陆是否成功,成功则返回IDOK,打开主对话框;否则,返回IDCANCEL,退出程序 CtestDlg dlg;//这个dlg就是登陆后看到的主界面对话框 m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: 在此放置处理何时用“确定”来关闭 //对话框的代码 } else if (nResponse == IDCANCEL) { // TODO: 在此放置处理何时用“取消”来关闭 //对话框的代码 } } //其余代码略} 谢谢anzheazhang朋友,我会实现“先弹出登陆对话框,再弹出主对话框”的功能。只是不明白父子窗口关系是怎么形成的,以及如何判定窗口之间的关系。 DOMODAL只是显示另外一个窗口而已。他们没有父子关系。父子关系是用Create创建时指定父窗口句柄才有的。 CMap<int,int,CPoint,CPoint> myMap(16);请问16代表什么? 急!窗体开发! 请问win32中线程临界区是怎么用的,我按自己的想法试着做了一个,可是不对,请大虾帮我看看. 为什么在Classwizard中看不到有些控件的ID ATL线程问题,高分!!! vc中跟vb中mid函数一样的功能的函数是什么呀 一个数组传递问题 高彩色工具条的问题:我如何把图像加到资源里面? 请问用SHBrowseForForder()怎样得知用户选择的目录? 谁有‘简历模板',提供点线索,多谢多谢,急!!今晚9:00就结帐 二维快速付立叶变换及反变换 关于指针转换问题
如果Dlg2在产生前,Dlg1已经销毁了,那么Dlg2的父窗口不可能是Dlg1。或者你的程序还有一个框架,
负责产生处理各种模态对话框...希望LZ明示~
我的MFC程序是这样的,程序运行时有一个登录窗口,成功登录之后弹出主窗口;而主窗口菜单中有个菜单项“财务系统”又需要进行登录后才能使用,此时点击该菜单项弹出另一登录窗口(即上面所述Dlg1),成功登录之后才能进入“财务系统”(即上面所述Dlg2)。那么这两个窗口的关系是怎么样的呢?什么情况下两个窗口之间建立了父子关系?
dlg1:按一个按钮弹出dlg2
dlg2:按一个按钮后,启动Timer(5秒,5秒后用EndDialog自杀)的同时,弹出dlg3。等待。5秒后看结果。
在dlg2弹出dlg3之前,让dlg2作dlg3的爹。
CDlg3 dlg(this);
SetTimer(1,5000,NULL);
.....执行,观察
2)dlg3认爹。
在资源里,把Dlg3的属性设成 甘当儿子的"child".执行,观察----------------
作完了试验,估计你的疑虑完全消失了。
哈哈!
UINT nIDTemplate,
CWnd* pParentWnd = NULL
);
这个构造函数默认的第二个参数为NULL,意思是main application window
根据你的叙述,“程序运行时有一个登录窗口”,你的主程序窗口是这个登录窗口吧,那么看你的意思没有它并没有销毁,所以不会发生
BOOL CtestApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControls()。否则,将无法创建窗口。
InitCommonControls(); CWinApp::InitInstance(); AfxEnableControlContainer(); // 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
CNewDlg dlg1;//这个dlg1可以看作是登陆对话框,
if(dlg1.DoModal()==IDOK)
{//在CNewDlg中判断登陆是否成功,成功则返回IDOK,打开主对话框;否则,返回IDCANCEL,退出程序
CtestDlg dlg;//这个dlg就是登陆后看到的主界面对话框
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用“确定”来关闭
//对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用“取消”来关闭
//对话框的代码
}
}
//其余代码略
}