Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16496940
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:52:25

下载本文示例代码
p align="JUSTIFY">  对话框是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 的成员函数中完成,采用上面的方法就可以顺利解决此类问题。 p align="JUSTIFY">  对话框是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 的成员函数中完成,采用上面的方法就可以顺利解决此类问题。 下载本文示例代码


如何在对话框类中访问父窗口中的数据如何在对话框类中访问父窗口中的数据如何在对话框类中访问父窗口中的数据如何在对话框类中访问父窗口中的数据如何在对话框类中访问父窗口中的数据如何在对话框类中访问父窗口中的数据如何在对话框类中访问父窗口中的数据如何在对话框类中访问父窗口中的数据如何在对话框类中访问父窗口中的数据如何在对话框类中访问父窗口中的数据如何在对话框类中访问父窗口中的数据如何在对话框类中访问父窗口中的数据如何在对话框类中访问父窗口中的数据如何在对话框类中访问父窗口中的数据如何在对话框类中访问父窗口中的数据
阅读(105) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~