编码时碰到一个MFC多个对话框窗口之间值的传递的问题,花了些时间总结一下。问题具体是这样的:
单击CWorkerBorrow对话框类中的“添加借调“功能按钮,弹出CMBorrow对话框来编辑信息,然后鼠标点击CEdit类型的编辑框区域,在CMBorrow对话框上弹出CSelectWorker对话框,通过查询后选中CSelectWorker中列表控件中的某项,然后单击确定按钮将选中的值传给CMBorrow对话框中的编辑框。
简而言之:
在A中点击按钮弹出B,在B中点击CEdit编辑框弹出C,在C中选某(些)值,将值传给B的某(些)编辑框;
解决步骤:
1、响应“添加借调”按钮,弹出CMBorrow对话框
2、在CMBorrow对话框中响应PreTranslateMessage消息,实现点击CEdit编辑框弹出CSelectWorker对话框
BOOL CMBorrow::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if (pMsg->message == WM_LBUTTONDOWN)
{
CRect rc;
GetDlgItem(IDC_MWID)->GetWindowRect(&rc);// 获取编辑框矩形区域
if (rc.PtInRect(pMsg->pt)) // 如果鼠标坐标在编辑框区域中则弹出
{
CSelectWorker dlg;
dlg.DoModal(); // 弹出CSelectWorker对话框
m_mwid = dlg.m_wid; // m_mwid、m_odid、m_oPosition为CEdit的值变量
m_odid = dlg.m_dp2; // m_wid、m_dp2、m_position为CSelectWorker的成员变量
m_oPosition = dlg.m_position;
m_cwid.SetWindowTextW(m_mwid); // m_cwid、m_codid、 m_cposition为CEdit的控制变量
m_codid.SetWindowTextW(m_odid);
m_cposition.SetWindowTextW(m_oPosition);
return TRUE;
}
}
return CDialogEx::PreTranslateMessage(pMsg);
}
3、处理CSelectWorker对话框中确定按钮点击事件
void CSelectWorker::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
m_wid = m_list.GetItemText(m_listIndex, 0); // 将选中的值赋值给成员变量,m_list为CListCtrl的控制变量
m_dp2 = m_list.GetItemText(m_listIndex, 3); // m_listIndex为列表控件的列号
m_position = m_list.GetItemText(m_listIndex, 4);
CDialogEx::OnOK();
}
这样便成功地将值传给了CMBorrow对话框中的编辑框,关键在CMBorrow中响应PreTranslateMessage消息,通过点击编辑框弹出对话框(CSelectWorker),然后将值赋值给CSelectWorker的成员变量,关闭CSelectWorker对话框后再给CMBorrow编辑框的值赋值,最后用编辑框的控制变量设置编辑框中的值。
附图:
点击“添加借调”弹出CMBorrow对话框
点击“员工编号”编辑框,弹出CSelectWorker对话框,选择list列表中的某行并获取值,然后将值赋值给CSelectWorker的成员变量 m_wid,m_dp2,m_position,然后点击确定按钮
最后值成功传到CMBorrow对话框中