如何在VC++中两个对话框相互传递信息

上传人:新** 文档编号:564914535 上传时间:2022-11-09 格式:DOC 页数:5 大小:26.50KB
返回 下载 相关 举报
如何在VC++中两个对话框相互传递信息_第1页
第1页 / 共5页
如何在VC++中两个对话框相互传递信息_第2页
第2页 / 共5页
如何在VC++中两个对话框相互传递信息_第3页
第3页 / 共5页
如何在VC++中两个对话框相互传递信息_第4页
第4页 / 共5页
如何在VC++中两个对话框相互传递信息_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《如何在VC++中两个对话框相互传递信息》由会员分享,可在线阅读,更多相关《如何在VC++中两个对话框相互传递信息(5页珍藏版)》请在金锄头文库上搜索。

1、如何在VC+中两个对话框相互传递信息?在主对话框中,利用弹出一个新的对话框,在函数最后一个参数里传一个型的参数获得实例最后一个参数传值得到返回值用户点击了取消在新建对话框里初始化代码里得到参数将数据跟窗口关联起来(存起来),比全局变量更好的方法。在新建对话框里取回保存的数据并实现其他功能取用户数据在VC+中,打开对话框一般是用DoModal()函数调用模态对话框,但是模态对话框只能在对弹出的当前子窗口进行操作,而不能对父窗口进行操作,也无法传递数据到父窗口中,根据笔者的研究发现,采用非模态对话框的模式可以很好的解决这一问题。在VS2008中新建一个就有MFC应用程序的Project项目,在弹出

2、的MFC应用程序向导中选择基于对话框”取消使用Unicode库”单击完成。在资源视图里面添加一个对话框,默认ID为IDD_DIALOG1。双击IDD_DIALOG1对话框,在弹出的MFC类向导中,类名填写CSonDialog,基类选择CDialog,单击完成。这样我们就将新建的IDD_DIALOG1关联上一个基于CDialog的类了。在父窗口上添加一个按钮,双击,便可进入这个按钮的消息响应函数。在最上面包含CSonDialog的头文件incldeSonDialog。如果在消息响应函数中写入如下代码:CSonDialogSonWnd;SonWnd.DoModal();运行之后按下父窗口上的按钮,

3、可以发现弹出了IDD_DIALOG1,但是只能在IDD_DIALOG1上操作,无法操作父窗口。如果想要在弹出子窗口后还可以操作父窗口的话,需要采用非模态对话框的模式弹出子窗口。MFC在CDialog类中有一个Create(UINTnIDTemplate,CWnd*pParentWnd=0),这个函数可以创建一个Dialog,其中参数nIDTemplate为需要创建的Dialog的ID。同时还有一个函数ShowWindow(intnCmdShow),用来显示创建的这个Dialog。在消息响应函数中写入如下代码:CSonDialogSonWnd;SonWnd.Create(IDD_DIALOG1)

4、;SonWnd.ShowWindow(SW_SHOW);运行之后按下父窗口上的按钮发现窗口闪了一下,然后就消失了。这是因为对象SonWnd是一个局部对象,在运行完SonWnd.ShowWindow(SW_SHOW)这条语句之后便退出了消息响应函数,因此SonWnd对象也就被销毁了。如果想要退出消息响应函数之后窗口依然存在,则需要将SonWnd定义为一个全局变量。因此在ProjectDlg.h中添加一个CSonDialogSonWnd的定义,同时由于VC+在编译的时候预编译头文件,因此还需要在ProjectDIg.h中包含CSonDialog的头文件#山cldeSonDialog.h这样在Pro

5、jectDIg.cpp中,便可以把SonDialog.h删掉了。然后在按钮的消息响应函数中添加如下代码:SonWnd.Create(IDD_DIALOG1);SonWnd.ShowWindow(SW_SHOW);我们发现IDD_DIALOG1被创建出来,并且一直保留着。但是还是无法和父窗口进行数据交流。根据查找资料我们发现在C+中有一个指针很特别,它指向的是当前窗口,这个指针就是this指针。我们通过传递this指针来相互调用对方的数据。在CSonDialog类中,我们添加一个指向父窗口的全局指针变量CProjectDlg*m_pFaher,同时添加一个函数WndCreate(CProject

6、Dlg*pParent),代码如下:voidCSonDialog:WndCreate(CProjectDlg*pParent)Create(IDD_DIALOG1);/创建对话框ShowWindow(SW_SHOW);/显示对话框m_pFather=pParent;/将父窗口指针传递进来这个函数中调用了CDialog类中的Create()和ShowWindow()函数来创建和显示对话框,同时采用参数传递的办法将父窗口的指针传递到子窗口中。而在父窗口ProjectDlg.cpp的消息响应函数中,我们添加如下代码:SonWnd.WndCreate(this);编译运行之后发现有错,因为在Proje

7、ctDlg.h的头文件中包含了SonDialog.h,而在SonDialog.h中又包含了ProjectDlg.h,这样程序在进行编译的时候就会出现头文件重复包含的错误,有两种办法可以解决此问题。第一种办法是在两个头文件中分别加入预编译命令#ifndef#define#endif命令,在SonDialog.h最上面加入#ifndefSONDIALOG#defineSONDIALOG最下面加入#endif在ProjectDlg.h最上面加入#ifndefRPOJECTDLG#definePROJECTDLG最下面加入#endif以上语句块的意思是如果SONDIALOG/PROJECTDLG没有被

8、定义的话,那么就定义SONDIALOG/PROJECTDLG,如果SONDIALOG/PROJECTDLG被定义的话,直接跳转到#endif,这样就可以很好的避免被重复定义的情况。这种方法我在以前编程的时候很好用,但是不知道为什么最近几次写程序这种方法都失效了,于是我又想出了另外一种办法。第二种办法的原理是采取避免在头文件中定义具体类型的指针变量,用定义空指针的方法绕过头文件重复包含的问题。由于在父窗口中,指向子窗口的对象必须是全局变量,这样才能保证子窗口在销毁之前一直有显示。因此在父窗口ProjectDIg.h中不得不包含SonDialog.h的头文件,这样就只能在SonDialog.h中想

9、办法了。其实仔细想来我们发现在SonDialog.h中只要定义一个空指针就可以解决问题。具体方法如下:在SonDialog.h不包含ProjectDlg.h头文件,也不定义CProjectDlg的对象,而是定义一个空指针LPVOIDm_pFather,将WndCreate()函数的参数改为LPVOIDpPaernt,然后在WndCreate()函数中添加如下代码:voidCSonDialog:WndCreate(LPVOIDpParent)Create(IDD_DIALOG1);/创建对话框ShowWindow(SW_SHOW);/显示对话框m_pFather=pParent;/将父窗口指针传

10、递进来这样,父窗口的this指针传递进来之后到m_pFather还是一个指向任意对象的指针,只要在SonDialog.cpp的函数中需要调用父窗口中的函数或者是改动父窗口的某些变量时,在cpp文件中包含头文件ProjectDlg.h,在函数开始时加入代码:CProjectDlg*Main;Main=(CProjectDlg*)m_pFather;/强制将LPVOID类型转换Main-就可以通过指针Main来对父窗口进行操作。这样就可以实现两个对话框中的信息相互传递了。另外在建立非模态对话框的时候要注意,重写On0k()和OnCancel()两个函数,要在里面加入DestoryWindow()函数,On0k()和OnCancel()函数里面并没有销毁窗口,而是使得窗口不可见,如果不销毁窗口,在下一次再次打开子窗口时,就会出现错误。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号