当我们项目里有许许多多的子窗口时,我们需要将进入子窗口的摁键给整理和隐藏,这里我推荐使用下拉式菜单栏。具体如何使用看下面链接:https://blog.youkuaiyun.com/u014411348/article/details/53911682
现在开始:
一、父窗口传参给子窗口:
1.新建一个工程CMeasuringDepthDlg作为父窗口,子窗口的摁键响应函数为(这里我以位移台为例):
void CMeasuringDepthDlg::OnControl()
{
CarrierControlDlg Dlg;
Dlg.m_Parent = this; //将父窗口的数据传到子窗口去
Dlg.DoModal();
}
这样我点击进入子窗口的按钮就进入了该函数里。这里的CarrierControlDlg就是子窗口的工程名。这里我只需要将子窗口的 .h 文件加入到父窗口里面。
如:在父窗口的MeasuringDepthDlg.h或MeasuringDepthDlg.cpp中加入 #include “CarrierControlDlg.h”。
另外 m_Parent 需要在子窗口CarrierControlDlg.h中也加上父窗口的头文件MeasuringDepthDlg.h,并定义一个指针变量:
public:
CMeasuringDepthDlg* m_Parent;
完成之后就大功告成,子窗口想要利用父窗口的任何参数和函数只需要利用 _m_Parent_这个指针,比如:
int nRet = m_Parent-> 参数or函数 ;
另外注意:父窗口的指针不能被传参,这时我们要另想办法,可以在子窗口也创建相同类型的指针变量,在父窗口进入子窗口的函数里加入:
Dlg.m_CardControl = &m_CardControl; //将父窗口的数据传到子窗口去
二、子窗口传参给父窗口:
想必大家已经知道如何向子窗口传递参数了,但我们有时候也需要子窗口将参数传给父窗口该怎么办呢?
很简单。。
通常我会在子窗口中重绘 OnClose() 函数。
注意将函数名加入到子窗口的这里:
BEGIN_MESSAGE_MAP(CarrierControlDlg, CDialogEx)
ON_WM_CLOSE()
。。。
END_MESSAGE_MAP()
另外在 OnClose() 函数中加入:
void CarrierControlDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
if (MessageBox("确定要退出吗?", "提示", MB_YESNO | MB_DEFBUTTON2) == IDYES)
{
UpdateData(TRUE);
CMeasuringDepthDlg * parent = (CMeasuringDepthDlg*)GetParent();
//CMeasuringDepthDlg * parent = (CMeasuringDepthDlg*)this->GetParent();
parent->m_nSaveImageType = m_nSaveImageType; //数据传给父窗口
parent->nImageNum = Image_Num; //数据传给父窗口
parent->FileName = m_CSfilename; //数据传给父窗口
parent->PathName = PathName; //数据传给父窗口
CWnd::OnDestroy();
}
}
最重要的就是这一句: CMeasuringDepthDlg * parent = (CMeasuringDepthDlg*)GetParent(); 用 * parent 来获取父窗口的参数。
另外附加一下思考,想起来就记下了,好记性不如烂笔头。
1.Edit如何显示字符?
m_result.SetWindowText(_T(“火星人”));
2.如何将一个int整数显示在Edit上?
int a =20;
CString str;
str.Format(_T("%d"),a);
m_result.SetWindowText(str);