在我的一个基于对话框的MFC应用程序中,我使用了两个外观相似的对话框。要求是用户填充一个对话框的编辑框,其中一些数据相同,以便立即复制到另一个对话框的类似编辑框。我试图用编辑控件的EN_CHANGE事件来实现它;当检测到任何更改时,应用程序将带有更新数据的消息发布到其他对话框以更新其自己的编辑框的内容。问题是当第二个对话框使用从第一个对话框接收的数据设置其编辑框内容时,EN_CHANGE事件将从第二个对话框触发,这是显而易见的,导致无休止的来回消息交换。有人可以建议我一些解决方案,在两个MFC对话框的编辑框之间即时复制用户输入,同时保持MFC应用程序类型为基于对话框吗?
在我的实现中,两个Dialog都是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;
}
对于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;
}
答案 0 :(得分:0)
只需使用布尔变量即可。我在这里更新了你的代码。
对于CScreen1类:
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类:执行相同的
答案 1 :(得分:-1)
因为要求是在不同对话框的两个Edit控件之间复制用户输入;它可以通过处理击键消息来处理。