对话框是VC++ 编程中一种经常用到的资源,同时它也是一种非常便捷地与用户沟通信息的方式。对话框基本上可以分为两大类:模态对话框和非模态对话框。如何从对话框中访问其父窗口中的数据将是我们下面要讨论的问题。
一。父窗口类为 CMainFrame , CChildFrame 和 CDialog 类:
当父窗口为主边框窗口类,子边框窗口类和对话框类时,我们可以在调用对话框类的构造函数时(也就是生成对话框对象时)为其指定父窗口;然后,在对话框类的 OnShowWindow() 函数中利用 函数 CWnd * GetParent ( ) const 得到父窗口的指针,利用该指针我们就可以访问父窗口中的数据。
下面举一个例子,对所述问题进行详细讲解。
第一步:生成一个 SDI 应用程序。
单击“File”中的“New”菜单项,选中“Project”标签中的“MFCAppWizard(EXE)”并在右边的“Project Name”中键入“Practice”按“确定”键,选中“Single Document ”,然后点击“完成”。
第二步:填加对话框资源,生成对话框类。
打开资源编辑器,为系统增加一新的对话框(ID :IDD_MYDLG),在该对话框中填加一 CEdit Box 控件(ID :IDC_EDIT);双击该对话框为该对话框生成一对话框类(CMydlg), 并在“ClassWizard”中为 CEdit Box 控件填加一 CString 型变量:m_str。
第三步: 生成并显示非模态对话框。
在 CMainFrame 类中添加下面两个成员变量:
CMydlg * pDlg ;
CString str("This is a Practice.") ;
在菜单中加入一 “DispDlg”菜单项(IDM_DISPDLG),并在 CMainFrame 类中为其加上响应函数OnDispDlg(),函数内容如下:
void CMainFrame :: OnDispDlg()
{
if(pDlg = = NULL)
{
pDlg = new CMydlg( this ) ;
// this 为 指向 CMainFrame 对象的指针
pDlg->Create(IDD_MYDLG) ;
}
pDlg->ShowWindow(SW_SHOW) ;
}
第四步:在对话框类中, 重载消息 WM_SHOWWINDOW 的响应函数 CMydlg :: OnShowWindow(BOOL bShow, UINT nStatus) ,并通过 GetParent ( ) 函数得到父窗口的指针,然后使用该指针访问父窗口中的数据。
void CMydlg :: OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog :: OnShowWindow(bShow, nStatus);
CMainFrame *pParent=(CMainFrame *)GetParent(); //加入语句
m_str = pParent->str; //加入语句
UpdateData(FALSE); //加入语句
return ;
}
编译运行后,点击菜单“OnDsipDlg”,弹出对话框,其中的CEdit Box 中将显示字符串“This is a Practice.”。
二。父窗口为视图类:
如果对话框的父窗口为视图类(CView 及其派生类),则情况稍有不同。需要在生成对话框以后用 void CWnd :: SetOwner( CWnd* pOwnerWnd ) 函数 为其指定父窗口类 , 并在该对话框中用 CWnd * GetOwner ( ) const 来得到父窗口类的指针.
仍接上例,按以下进行操作:
第五步:为视类(CpracticeView)添加一 CString 型变量 str ;删除主边框窗口中的OnDispDlg()函数,并在视类中重新为菜单项 DispDlg(IDM_DISPDLG)
加入响应函数 OnDispDlg( ),内容如下:
void CPracticeView :: OnDispDlg( )
{
CMydlg dlg;
dlg.SetOwner( this ) ;
dlg. DoModal();
}
第六步:将CMydlg :: OnShowWindow( ) 函数改为以下形式:
void CMydlg :: OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog :: OnShowWindow ( bShow, nStatus );
//修改语句
CPracticeView * pParent = (CPracitceView * ) GetOwner ( ); m_str = pParent ->str ;
UpdateData ( FALSE ) ;
return ;
}
编译运行后,点击菜单“OnDsipDlg”,将出现与上例相同的结果。
以上只是举了一个 CString 型变量赋值的例子,当然,我们本可以在 OnDispDlg ( ) 函数中通过 pDlg-$#@62;m_str=str 语句实现赋值,但是对于较复杂的情况:比如,在对话框中含有一个CListCtrl 控件,而该控件的初始化在OnDispDlg ( ) 中利用pDlg指针是无法间接完成的,只能在 CMydlg 的成员函数中完成,采用上面的方法就可以顺利解决此类问题。