将用户输入从一个MFC对话框的编辑控件复制到另一个对话框的编辑控件

将用户输入从一个MFC对话框的编辑控件复制到另一个对话框的编辑控件,mfc,dialog,replication,edit,Mfc,Dialog,Replication,Edit,在我的一个基于对话框的MFC应用程序中,我使用了两个外观相似的对话框。当用户用一些数据填充一个对话框的编辑框,这些数据将立即复制到另一个对话框的类似编辑框中时,就需要这样做。我试图用编辑控件的EN_CHANGE事件来实现它;其中,当检测到任何更改时,应用程序将带有更新数据的消息发布到“其他”对话框,以更新其自身编辑框的内容。问题是,当第二个对话框使用从第一个对话框接收的数据设置其编辑框内容时,第二个对话框会触发EN_CHANGE事件,这很明显,导致无休止的来回消息交换。有谁能给我建议一些解决方案

在我的一个基于对话框的MFC应用程序中,我使用了两个外观相似的对话框。当用户用一些数据填充一个对话框的编辑框,这些数据将立即复制到另一个对话框的类似编辑框中时,就需要这样做。我试图用编辑控件的EN_CHANGE事件来实现它;其中,当检测到任何更改时,应用程序将带有更新数据的消息发布到“其他”对话框,以更新其自身编辑框的内容。问题是,当第二个对话框使用从第一个对话框接收的数据设置其编辑框内容时,第二个对话框会触发EN_CHANGE事件,这很明显,导致无休止的来回消息交换。有谁能给我建议一些解决方案,在两个MFC对话框的编辑框之间即时复制用户输入,同时保持MFC应用程序类型为基于对话框

在我的实现中,这两个对话框都是CDialog派生的,并具有以下CEdit事件处理程序和消息处理程序方法:

对于CScreen1类:

void CScreen1::OnEnChangeEditUser()
{
    static CString msg;
    m_username.GetWindowText(msg);
    ::PostMessage(m_mScreen2,WM_INTER_LOGIN,10,(LPARAM)&msg); //m_mScreen2 is the HWND of 2nd dlg
}

LRESULT CScreen1::OnInterLoginMsg(WPARAM wParam, LPARAM lParam)
{
    CString *msg=(CString*)lParam;
    switch((int)wParam)
    {
        case 10: 
        m_username.SetWindowText(msg->GetString()); //m_username is CEdit Ctrl
        delete msg;
        break;
    }   
    return 0;
}  
BOOL postchanges = TRUE;  //always TRUE

void CScreen1::OnEnChangeEditUser()
{
    if (!postchanges)
        return;

    static CString msg;
    m_username.GetWindowText(msg);
    ::PostMessage(m_mScreen2,WM_INTER_LOGIN,10,(LPARAM)&msg); //m_mScreen2 is the HWND of 2nd dlg
}

LRESULT CScreen1::OnInterLoginMsg(WPARAM wParam, LPARAM lParam)
{
    CString *msg=(CString*)lParam;
    switch((int)wParam)
    {
        case 10: 
        postchanges = FALSE;  // do not post msg
        m_username.SetWindowText(msg->GetString()); //m_username is CEdit Ctrl
        postchanges = TRUE;  // revert back
        delete msg;
        break;
    }   
    return 0;
}
对于CScreen2类:

void CScreen2::OnEnChangeEditUser()
{
    static CString msg;
    m_username.GetWindowText(msg);
    ::PostMessage(m_mScreen1,WM_INTER_LOGIN,10,(LPARAM)&msg); //m_mScreen1 is the HWND of 1st dlg
}

LRESULT CScreen2::OnInterLoginMsg(WPARAM wParam, LPARAM lParam)
{
    CString *msg=(CString*)lParam;
    switch((int)wParam)
    {
        case 10: 
        m_username.SetWindowText(msg->GetString()); //m_username is CEdit Ctrl
        delete msg;
        break;
    }   
    return 0;
}  

只需使用布尔变量即可。我已经在这里更新了你的代码

对于CScreen1类:

void CScreen1::OnEnChangeEditUser()
{
    static CString msg;
    m_username.GetWindowText(msg);
    ::PostMessage(m_mScreen2,WM_INTER_LOGIN,10,(LPARAM)&msg); //m_mScreen2 is the HWND of 2nd dlg
}

LRESULT CScreen1::OnInterLoginMsg(WPARAM wParam, LPARAM lParam)
{
    CString *msg=(CString*)lParam;
    switch((int)wParam)
    {
        case 10: 
        m_username.SetWindowText(msg->GetString()); //m_username is CEdit Ctrl
        delete msg;
        break;
    }   
    return 0;
}  
BOOL postchanges = TRUE;  //always TRUE

void CScreen1::OnEnChangeEditUser()
{
    if (!postchanges)
        return;

    static CString msg;
    m_username.GetWindowText(msg);
    ::PostMessage(m_mScreen2,WM_INTER_LOGIN,10,(LPARAM)&msg); //m_mScreen2 is the HWND of 2nd dlg
}

LRESULT CScreen1::OnInterLoginMsg(WPARAM wParam, LPARAM lParam)
{
    CString *msg=(CString*)lParam;
    switch((int)wParam)
    {
        case 10: 
        postchanges = FALSE;  // do not post msg
        m_username.SetWindowText(msg->GetString()); //m_username is CEdit Ctrl
        postchanges = TRUE;  // revert back
        delete msg;
        break;
    }   
    return 0;
}

对于CScreen2类:执行与需求相同的操作,即在不同对话框的两个编辑控件之间复制用户输入;它可以通过处理击键消息来处理

您没有显示任何代码,因此,我需要询问。这两个对话框对象是从同一个类派生的吗?和都是为双向通知而设计的。您应该发布代码来更好地解释您的问题。是的,这两个对话框对象都来自同一个类CDialog,并且都以以下方式实现双向消息交换://编辑控制事件处理程序方法和消息处理程序:void CScreen1::OnEnChangeEditUser(){static CString msg;m_username.GetWindowText(msg);::PostMessage(m_mScreen2,WM_INTER_LOGIN,10,(LPARAM)&msg);//m_mScreen2是第二个dlg}LRESULT CScreen1::OnInterLoginMsg(WPARAM WPARAM,LPARAM LPARAM){CString msg=(CString)LPARAM;switch((int)WPARAM){案例10:m_username.SetWindowText(msg->GetString());//m_username CEdit Ctrl delete msg;break;}return 0;}CScreen2类也有类似的方法。能否更新帖子而不是注释?你的评论很难读。这就是我现在正在做的。如何通过击键消息处理来处理此问题?不,它不能:。