MFC跨窗口传值一直都困扰着作者,在查找许多资料后终于找到了几个比较方便的方法,在此做下备忘录,说不定也能帮助到其他人
目录
方案一:子窗口调用主窗口头文件中定义的成员
1.主窗口的操作
在主窗口的头文件中定义子窗口需要用到的参数,比如此处我需要传递一个vector<>对象
具体为 vector<Destination> recommendedDestinations
所以我就在主窗口的头文件Get.h中定义它为主窗口类的公开成员,此处的主窗口为Get
class Get : public CDialogEx
{
/*其他定义*/
public:
/*其他定义*/
vector<Destination> recommendedDestinations;
}
然后在主窗口的cpp文件中使用它,比如赋值一类的
我在该窗口中让他接受了一个函数的赋值,然后打开了要使用它的子窗口,此处的子窗口为LOACTION
/*其他代码*/
recommendedDestinations = recommendDestinations(userInterests, travelDuration, travelBudget, destinations);
LOCATION dlg;
dlg.DoModal();
/*其他代码*/
2.子窗口的操作
子窗口中的操作很简单,首先在子窗口的子窗口添加对主窗口的引用
此处的主窗口为Get
#include "Get.h"
然后在需要用到它的地方,得到主窗口的指针,然后再通过指针调用该对象
我在此处调用了它并进行迭代器遍历
/*其他代码*/
Get* p = (Get*)GetParent();
for (auto destination = p->recommendedDestinations.begin(); destination != p->recommendedDestinations.end();++destination)
/*其他代码*/
方案二:多窗口调用同一个头文件中的静态成员函数
1.新建一个公用的头文件并在对应的CPP文件中初始化
新建一个公用的头文件再在其中定义一个用于传输的类,在再该类里定义传递的变量并且将其定义为静态变量,然后在对应的CPP对象(最好命名为同样的名字)中初始化这个类,再在pch.h中包含该文件
我在此处定义的公用头文件为Element_AND_Function.h并为其创建了对应的Element_AND_Function.cpp
在.h文件中定义了一个用于传递的类result,其中的static queue<CString> requeue即为需要传递的内容
class result
{
public:
static queue<CString> requeue;
};
在.cpp文件中我初始化了这个静态对象
#include "Element_AND_Function.h"//实例化.h文件
#include "pch.h"//MFC的cpp必须要求
queue<CString> result::requeue;
在pch.h文件中包含该文件
// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。
#ifndef PCH_H
#define PCH_H
// 添加要在此处预编译的标头
#include "framework.h"
#include "Element_AND_Function.h"//包含自己定义的头文件,使得每个窗口的cpp文件中都能使用
#endif //PCH_H
2.在窗口CPP文件中使用
此时只需要将其作为静态对象调用就行了
我在LOCATION中调用其存入一个结果
void LOCATION::OnBnClickedButtonOk()
{
/*其他代码*/
CString str = _T("地点:") + list.GetItemText(m_nPreSel, 0) + _T("\r\n兴趣:") + list.GetItemText(m_nPreSel, 1) + _T("\r\n旅行时间:") + list.GetItemText(m_nPreSel, 2) + _T("天") + _T("\r\n预算:") + list.GetItemText(m_nPreSel, 3) + _T("元");
if (MessageBox(_T("您做好决定了吗\r\n") + str, _T("提示"), MB_YESNO | MB_ICONQUESTION) == IDYES)
{
result::requeue.push(str);//调用静态参数
/*其他代码*/
}
}
然后我在Result中再调用它然后取出其中内容并显示
/*其他代码*/
location.SetWindowText(result::requeue.front());//调用静态对象
result::requeue.pop();
/*其他代码*/