У меня есть проект MS Visual C ++ 2005, в котором я пытаюсь создать главное диалоговое окно с разделом, посвященным отображению выбираемых диалоговых окон подчиненной формы. Каждая подчиненная форма будет иметь одинаковый размер, но разную компоновку. Выбор осуществляется с помощью поля со списком управления. Я искал лучший способ реализации этой функциональности и наткнулся на этот класс, который кто-то разработал в 1999 году для обработки дочерних диалогов в главном диалоге:
http://www.codeproject.com/KB/dialog/childdlg.aspx
С дополнительной модификацией:
http://www.codeproject.com/KB/dialog/childdlg.aspx?msg=1287#xx1287xx
Код работает достаточно хорошо для выбора и отображения различных подчиненных форм, но я не могу передавать данные из одной подчиненной формы в другую. В частности, каждая подчиненная форма состоит из нескольких элементов управления редактированием. Я хотел бы, чтобы пользователь мог вводить значение в элементе управления для редактирования в 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);
}