hur.cn - 华软网

 热门搜索

子对话框调用父对话框成员函数的问题

  作者:未知    来源:网络    更新时间:2010/12/7
我在主对话框中创建了子对话框:
m_DlgChild.Create(IDD_DIALOG_CHILD,GetDlgItem(IDC_MAIN_PARENT)); //m_DlgChild是主对话框的成员

子对话框中有对应接受父对话框的构造函数:
DlgChild::DlgChild(CWnd* pParent /*=NULL*/)
: CDialog(DlgChild::IDD, pParent)
{

}


在子对话框的OnInitDialog中调用父对话框的成员函数:

((CParentDlg*)GetParent())->fun(); //fun是父对话框的成员函数。

以上代码编译没问题,然则执行到上面那句的时候会有断言毛病,不知道是哪不对呢?
---华软 网友回答---
直接包括主对话框的.H 创建对象调用就行
---华软网友回复---
m_DlgChild.Create(IDD_DIALOG_CHILD,GetDlgItem(IDC_MAIN_PARENT)); 
-->
m_DlgChild.Create(IDD_DIALOG_CHILD,this); 
---华软网友回复---
引用 2 楼 visualeleven 的回复:
m_DlgChild.Create(IDD_DIALOG_CHILD,GetDlgItem(IDC_MAIN_PARENT)); 
-->
m_DlgChild.Create(IDD_DIALOG_CHILD,this);


这样改后程序启用就犯错了,传 GetDlgItem(IDC_MAIN_PARENT) 应该是对的。这个前往的是CWnd对象,子窗口的构造函数中接收的也是CWnd对象。
---华软网友回复---
主对话框已经包括了子对话框的头资料,子对话框再包括主对话框的头资料,编译有错。
---华软网友回复---
m_DlgChild.Create(IDD_DIALOG_CHILD,GetDlgItem(IDC_MAIN_PARENT));  
-->
m_DlgChild.Create(IDD_DIALOG_CHILD,this); 
没错啊

除非m_DlgChild不是CParentDlg的成员

CParentDlg的基类是CDialog,CDialog的基类是CWnd,当然能够传

你传给m_DlgChild的父窗口是GetDlgItem(IDC_MAIN_PARENT),GetParent()获得的就是GetDlgItem(IDC_MAIN_PARENT)了,而不是CParentDlg了
话说回来IDC_MAIN_PARENT究竟是个什么东东?如果是CParentDlg的ID的话,很负疚,可能前往的是NULL,不信你调试看看
---华软网友回复---
另外你到底什么时候调用的
m_DlgChild.Create(IDD_DIALOG_CHILD,this); 的
别是在CParentDlg的构造函数中吧,CParentDlg窗口都还没建立,就会犯错,
你至少得在CParentDlg Create之后
---华软网友回复---
引用 5 楼 xiaoqiqixiao 的回复:
m_DlgChild.Create(IDD_DIALOG_CHILD,GetDlgItem(IDC_MAIN_PARENT));  
-->
m_DlgChild.Create(IDD_DIALOG_CHILD,this); 
没错啊

除非m_DlgChild不是CParentDlg的成员

CParentDlg的基类是CDialog,CDialog的基类是CWnd,当然能够传
……


IDC_MAIN_PARENT确实是CParentDlg的ID,传到子对话框时我在子对话框的
DlgChild::DlgChild(CWnd* pParent /*=NULL*/)
: CDialog(DlgChild::IDD, pParent)
{

}
构造函数中断点调试pParent 不是null,是个正常的指针。

另外m_DlgChild.Create是在父对话框的OnInitDialog中实现的。
---华软网友回复---
我传this程序也能够运行,然则执行到调用父对话框的成员函数时((CParentDlg*)GetParent())->fun();照旧报错。
---华软网友回复---
我试了一下,现在发现原因不是参数的问题,传this和ID都能够,而是调用的父对话框的成员函数的问题。
父对话框的这个成员函数有对父对话框的状态栏举行更新的举措,代码以下:
m_wndStatusBar.SetPaneText(0,"新的状态栏数据"); //m_wndStatusBar 是父对话框的状态栏成员
如果不执行该句,在子对话框能够正常调用。

难道是子对话框调用父对话框的成员函数时该成员函数不能有对父对话框窗口的操作吗?
---华软网友回复---
断点、单步调试,看看问题到底在那里。
---华软网友回复---
最后断点到MFC内部了,看陌生了。。。

if (!AfxIsValidAddress(pOb, pOb->GetRuntimeClass()->m_nObjectSize, FALSE))
---华软网友回复---
不知道什么原因内存毛病,调用父对话框的那个成员函数只是更新了状态栏的显示数据,其余什么也没做。
我在父窗口中调用这个成员函数是正常的。
---华软网友回复---
CParentDlg* m_pDlg = (CParentDlg*)AfxGetMainWnd();这样就没问题了,你试试!
---华软网友回复---
谢谢大家的回复,是我的失误,我对话框传错了。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。