2015-02-04 1 views
0

В одном из приложений на основе 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; 
} 
+0

Вы не указали какой-либо код, поэтому мне нужно спросить. Оба объекта диалога получены из одного класса? И, оба предназначены для двунаправленного уведомления. Вы должны опубликовать код, чтобы лучше объяснить вашу проблему. – rrirower

+0

Да как диалоговые объекты из тех же класса CDialog и оба реализованы для двунаправленных сообщений обмена в следующем образе: // Edit управление методом обработчика событий и обработчик сообщений: – Sukhendu

+0

недействительного 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

ответ

0

Просто используйте переменную boolean для воспроизведения. Я обновил ваш код здесь.

Для 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: сделать то же

+0

Вот что я сейчас делаю. Как насчет обработки этого путем обработки сообщений нажатия клавиш? – Sukhendu

-1

По мере того как требование репликации пользовательского ввода между двумя Edit контроля различных Dialogs; он может обрабатываться посредством обработки сообщений нажатия клавиш.

+0

Нет, он не может: [Воспроизведение ввода не совпадает с его переработкой] (http://blogs.msdn.com/b/oldnewthing/archive/2012/12/06/10375039.aspx). – IInspectable