Mfc 如何使用SendMessage将值从子对话框(无模式)传递到父对话框?

Mfc 如何使用SendMessage将值从子对话框(无模式)传递到父对话框?,mfc,Mfc,假设我从父窗口打开了一个弹出窗口,我在从子窗口提交值时计算了一些子窗口的计算,我需要在单击弹出窗口中的按钮时显示子窗口到父窗口的计算值文本框。您的子窗口与一个类相关联 将方法添加到子窗口的类中,该类将返回计算值。i、 e.ChildwindowClass::GetCalculatedValue() 然后父窗口可以使用该方法获取值 我假设您正在使用CDialog::DoModal来显示子窗口。由于DoModal是一个阻塞函数,因此很容易知道何时完成子窗口 使用PostMessage通知父对话框,子

假设我从父窗口打开了一个弹出窗口,我在从子窗口提交值时计算了一些子窗口的计算,我需要在单击弹出窗口中的按钮时显示子窗口到父窗口的计算值文本框。

您的子窗口与一个类相关联

将方法添加到子窗口的类中,该类将返回计算值。i、 e.ChildwindowClass::GetCalculatedValue()

然后父窗口可以使用该方法获取值

我假设您正在使用CDialog::DoModal来显示子窗口。由于DoModal是一个阻塞函数,因此很容易知道何时完成子窗口

使用PostMessage通知父对话框,子对话框已完成其计算,并且可以使用GetCalculatedValue。或者,您可以在PostMessage中将计算出的值传递给父级

如果计算需要很长时间,请使用辅助线程进行计算并将结果发送后消息,否则将冻结用户界面。

选项1:

您可以在构造函数中将父窗口句柄传递给子窗口,并使用它调用SendMessage。但是,由于发送消息是阻塞调用,您可以考虑使用POST消息。p> 备选案文2:

void CModeLess::OnOK() 
{
      //Get the value from the control
       m_ctrlEdit.GetWindowText(strVal);
       m_Parent->SetName(strVal);
       DestroyWindow(); 
}
在构造子对话框时传递父对话框指针。并使用它来调用您的成员函数

警告:

关闭子窗口时,应确保删除子窗口指针的内存,因为您已提到该对话框是无模式的。您需要通知父对话框,您需要使用postmessage的子窗口已关闭

void CModeLess::PostNcDestroy() 
{   
    CDialog::PostNcDestroy();
    GetParent()->PostMessage(WM_MODELESS_CLOSED,0,0);
    delete this;
}

我没有使用DoModal来显示子对话框,因为它是一个无模式对话框。我必须使用SendMessage/PostMessage将值从子级传递到父级。抱歉,我忽略了它是无模式的这一事实。是的,那会有用的。如果数据足够复杂,可以使用postemsage()通知父级子级已完成,然后让父级使用accesor函数获取计算结果并清理子级对话框