Передача данных между подчиненными типами CDialog

У меня есть проект MS Visual C++ 2005, где я пытаюсь создать главное диалоговое окно с разделом, посвященным отображению выбираемых диалоговых окон подчиненной формы. Каждая подчиненная форма будет иметь одинаковый размер, но разную компоновку. Выбор осуществляется с помощью поля со списком управления. Я искал лучший способ реализации этой функциональности и наткнулся на этот класс, который кто-то разработал в 1999 году для обработки дочерних диалогов в главном диалоге:

http://www.codeproject.com/KB/dialog/childdlg.aspx

С дополнительной модификацией:

http://www.codeproject.com/KB/dialog/childdlg.aspx?msg=1287

Код работает достаточно хорошо для выбора и отображения различных подчиненных форм, но я не могу передавать данные из одной подчиненной формы в другую. В частности, каждая подчиненная форма состоит из нескольких элементов управления редактированием. Я хотел бы, чтобы пользователь мог вводить значение в элементе управления для редактирования в Subform #1, и чтобы это значение отображалось в элементе управления для редактирования или статическом текстовом элементе управления в Subform #2.

Я попытался реализовать это, используя функцию-член диалогового класса подчиненной формы (названного CSubFormType и подклассом CDialog), который выполнялся бы при уничтожении фокуса элементу управления редактирования ввода данных (то есть Box1a).

void CSubFormType::OnEnKillfocusBox1a () {

p2WndControl = (CWnd*)(GetDlgItem(IDC_Box1a));  //Get pointer to the control dialog box for data entry

//Inserted here some specific code used to place data entered into IDC_Box1a into extern wchar_t outstr[32]

SetDlgItemText (IDC_Box1b, outstr);  //Echo data entered in IDC_Box1a to IDC_Box1b on same Subform #1


SetDlgItemText (IDC_Box2, outstr);//Echo data entered in IDC_Box1a to IDC_Box2 on different subform, Subform #2

}

Карта сообщений для CSubFormType, предназначенная для непосредственного вызова OnEnKillfocusBox1a:

ON_EN_KILLFOCUS (IDC_Box1a, & CSubFormType::OnEnKillfocusBox1a)

Или косвенно:

ON_BN_CLICKED (IDOK, & CSubFormType:: OnBnClickedOk) // CSubFormType:: OnBnClickedOk затем вызывает OnEnKillfocusBox1a

Проблемы, которые у меня возникают:

1) ON_BN_CLICKED (IDOK, & CSubFormType:: OnBnClickedOk) не вызывается при нажатии клавиши Enter после ввода данных в Box1a. Вместо этого вызывается функция-член OnBnClickedOk главного диалогового окна.

2) Когда CSubFormType::OnEnKillfocusBox1a выполняется (с помощью щелчка мыши в другом месте), он может отобразить значение, введенное в Box1a, в Box1b в той же самой подчиненной форме # 1, но не отобразит значение в Box2 в подчиненной форме # 2.

Будем весьма благодарны за любые рекомендации относительно того, что мне нужно сделать для решения этих проблем, или лучшего подхода к реализации той же общей функциональности.

Функция выбора элемента комбинированного окна для используемого главного диалогового окна:

void CMain:: OnCbnSelchange () {int selection;

selection = ((CComboBox*)GetDlgItem(IDC_Select))->GetCurSel();

switch(selection)
{
    case 0: // Select Subform 1
        //Do nothing
        break;

    case 1: // Select Subform 2
        SetDlgItemText (IDC_Box2, outstr); //Set Box2 text on Subform #2
        break;
 }

m_SubForms.ShowSubForm(selection);

}

1 ответ

Синхронизируйте все формы, когда основной выбор в выпадающем списке изменен. Вы пытаетесь сделать это сразу, когда текстовое поле изменяется, но это не обязательно, потому что видна только одна форма.

Другие вопросы по тегам