В одном из приложений на основе MFC с использованием диалога я использовал два диалога аналогичного вида. Требование заключается в том, когда пользователь заполняет окно редактирования одного диалога с некоторыми данными, которые должны быть реплицированы в аналогичное окно редактирования другого диалога мгновенно. Я пытаюсь реализовать его с помощью события EN_CHANGE элемента управления редактирования; где при обнаружении какого-либо изменения приложение отправляет сообщение с обновленными данными в другое диалоговое окно, чтобы обновить содержимое своего собственного окна редактирования. Проблема заключается в том, что во втором диалоговом окне задается содержимое поля редактирования с полученными данными из первого диалога, событие EN_CHANGE запускается из второго диалога, что очевидно, что приводит к бесконечному обмену сообщениями взад и вперед. Может ли кто-нибудь предложить мне некоторое решение для мгновенного тиражирования пользовательских входов между полями редактирования двух диалогов MFC, сохраняя при этом тип приложения 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;
}
Для 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;
}
Вы не указали какой-либо код, поэтому мне нужно спросить. Оба объекта диалога получены из одного класса? И, оба предназначены для двунаправленного уведомления. Вы должны опубликовать код, чтобы лучше объяснить вашу проблему. – rrirower
Да как диалоговые объекты из тех же класса CDialog и оба реализованы для двунаправленных сообщений обмена в следующем образе: // Edit управление методом обработчика событий и обработчик сообщений: – Sukhendu
недействительного CScreen1 :: OnEnChangeEditUser() { \t статического CString тзд ; \t m_username.GetWindowText (msg); \t :: PostMessage (m_mScreen2, WM_INTER_LOGIN, 10, (LPARAM) &msg); // m_mScreen2 является HWND 2-го DLG } LRESULT CScreen1 :: OnInterLoginMsg (WPARAM WPARAM, LPARAM LPARAM) { \t CString * тзд = (CString *) LPARAM; \t переключатель ((INT) WPARAM) \t { \t \t случай 10: \t \t \t m_username.SetWindowText (msg-> GetString()); // m_username CEdit Ctrl \t \t \t удалить Сообщ; \t \t \t break; \t} \t возвращение 0; } – Sukhendu