Передача данных между подчиненными типами 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 ответ
Синхронизируйте все формы, когда основной выбор в выпадающем списке изменен. Вы пытаетесь сделать это сразу, когда текстовое поле изменяется, но это не обязательно, потому что видна только одна форма.