对话框是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 的成员函数中完成,采用上面的方法就可以顺利解决此类问题。