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

Replicating user input from edit control of one MFC dialog to an edit control of another dialog

在我的一个基于对话框的 MFC 应用程序中,我使用了两个外观相似的对话框。要求是当用户用一些相同的数据填充一个对话框的编辑框时,立即将其复制到另一个对话框的类似编辑框。我正在尝试使用编辑控件的 EN_CHANGE 事件来实现它;当检测到任何更改时,应用程序 post 向其他对话框发送一条包含更新数据的消息,以更新其自己的编辑框的内容。问题是当第二个对话框使用从第一个对话框接收到的数据设置其编辑框内容时,EN_CHANGE 事件从第二个对话框中被触发,这很明显,导致无休止的来回消息交换。有人可以建议我一些解决方案,用于在两个 MFC 对话框的编辑框之间即时复制用户输入,同时将 MFC 应用程序类型保持为基于对话框吗?

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

对于 CScreen1 class:

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;
}  

对于 CScreen2 class:

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 class:

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 class:做同样的事情

由于要求在不同对话框的两个编辑控件之间复制用户输入;它可以通过处理击键消息来处理。