MFC跨窗口传递数值方法,理论可传递任意类型的数据

   MFC跨窗口传值一直都困扰着作者,在查找许多资料后终于找到了几个比较方便的方法,在此做下备忘录,说不定也能帮助到其他人

目录

方案一:子窗口调用主窗口头文件中定义的成员

1.主窗口的操作

2.子窗口的操作

方案二:多窗口调用同一个头文件中的静态成员函数

1.新建一个公用的头文件并在对应的CPP文件中初始化

2.在窗口CPP文件中使用

方案一:子窗口调用主窗口头文件中定义的成员

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();
/*其他代码*/	

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值