关于SetParent的问题
本帖最后由 liuzpzp007 于 2013-03-27 10:08:29 编辑 新人请教:
建立一个基于对话框的工程,主对话框类为CDialog1。然后再插入一个对话框CDialog2.
在CDialog1头文件中,加入成员变量CDialog2 m_dlg;
现在我要实现在CDialog1显示之前先显示CDialog2.
在InitInstance()函数中,修改代码为:
CDialog1 dlg;
dlg.m_dlg.SetParent(&dlg);
dlg.m_dlg.Create(IDD_DIALOG2,&dlg);
dlg.m_dlg.ShowWindow(SW_SHOW);
dlg.m_dlg.UpdateWindow();
m_pMainWnd=&dlg;
int nResponse=dlg.DoModal();
现在这句话有问题dlg.m_dlg.SetParent(&dlg)。错误就出在这句上。想知道是为什么。
注意:我这个程序是仿造别人的能够正常运行的程序,为什么我仿照过来就不能正常了。。
网上有人也遇到类似问题,他用一下方法解决:
dlg.m_dlg.SetParent(&dlg);
dlg.m_dlg.Create(IDD_DIALOG2,&dlg);
你试试这两句的顺序换一下,先
dlg.m_dlg.Create(IDD_DIALOG2,&dlg);
再
dlg.m_dlg.SetParent(&dlg);
但我的还是不行?
调试时出错,点重试进入:AFXWIN2.INL:
{ ASSERT(::IsWindow(m_hWnd)); return CWnd::FromHandle(::SetParent(m_hWnd,
pWndNewParent->GetSafeHwnd())); }
然后找到这个帖子:
http://bbs.csdn.net/topics/20268542
我怀疑是FromHandle出错导致,
改为Release试一下,居然没事,回去Debug问题照旧?
百思不得其解啊!
[解决办法]
你SetParent()的时候,你的父窗口还没有创建出来(你的父窗口是DoModal()出来的),所以肯定错误。
你直接在InitInstance()中
CDialog2 dlg2;
dlg2.Create(CDialog2::IDD);
dlg2.ShowWindow(SW_SHOW);
...
CDialog1 dlg;
m_pMaindWnd = &dlg;
dlg.DoModal();