Windows程序设计29:对话框之间的数据传递
文章目录
- 前言
- 一、父子对话框之间的数据传递
- 1.父窗口获取子窗口数据
- 2.子窗口获取父窗口数据
- 二、类外函数调用窗口的操作
- 1.全局变量方式
- 2.参数传递方式
- 总结
前言
Windows程序设计29:对话框之间的数据传递。
在Windows程序设计28:MFC模态与非模态对话框中通过点击主对话框上的按钮创建了子对话框。那么在对话框创建出来之后,就涉及到了父子对话框或者兄弟对话框之间数据的传递。
一、父子对话框之间的数据传递
1.父窗口获取子窗口数据
由于是父窗口创建的子窗口,因此父窗口获取子窗口的数据(窗口句柄或者窗口指针等)较为简单。
根据上述链接中的代码,在主对话框(父窗口)中点击按钮创建子窗口(模态和非模态对话框),那么子窗口的窗口对象在主对话框中很方便就可以获取到,如下图红框部分
可以直接对非模态对话框修改其编辑框内的内容,表示可以在父窗口中利用子窗口的窗口句柄
得到如下结果
但是无法在模态对话框中进行修改编辑框的内容。这是因为即便父窗口仍然能够得到模态对话框的实例句柄,但是DoModal不像Create那样直接创建了窗口,确保了控件的有效性。即调用DoModal之前还不存在模态对话框实例(如果不存在窗口实例而调用其内部方法会出现断言失败),而在调用DoModal之后程序还会阻塞,因此无法进行修改。
会发生断言失败
2.子窗口获取父窗口数据
但是反过来,子窗口获取父窗口的数据有些复杂。因为子窗口中默认是没用父窗口的窗口句柄的。
为了演示方便,在父窗口(主对话框)上也加一个编辑框控件
想要实现的功能为当关闭子窗口时,将子窗口中编辑框内的内容放到父窗口的编辑框上。
有多种方法获取父窗口数据,第一种为利用GetParent函数直接获取父窗口指针
获取成功
此外,还可以通过利用extern设置全局变量(将父窗口的指针设置为全局变量)来在子窗口中访问父窗口的指针。
声明全局变量:
初始化全局变量
直接可以在子窗口的源文件中使用
同样成功
此外,还有第三种方法:App类获取法。在主线程的源文件中,将主对话框类的实例赋值给了主线程类的m_pMainWnd对象,即该线程的主窗口。因此我们只要把这个变量拿过来使用即可,利用函数AfxGetApp()获取当前的主线程指针。
取得主线程指针
运行成功
二、类外函数调用窗口的操作
为了演示方便,在主对话框上再添加一个按钮3控件,并设置其点击消息响应函数
想要在类外函数GetEdit内调用一些主对话框类上编辑框等一些控件的操作,主要有两种方法
1.全局变量方式
将需要使用的变量设置为全局变量即可在函数中使用,与子窗口访问父窗口的全局变量方法类似,这里不再赘述。
2.参数传递方式
参数传递方式主要思想为利用主对话框类的this指针,将主对话框类的this指针作为参数传递到函数中
成功实现
这里需要说明一点:指针的相互转换
利用窗口指针(CWnd*)获取窗口句柄(HWND)
HWND hDlg = pDlg->GetSafeWnd();
利用窗口句柄(HWND)获取窗口指针(CWnd*)
CWnd* pWnd = CWnd::FromHandle(hDlg);
总结
Windows程序设计29:对话框之间的数据传递。