Передача данных между подчиненными типами CDialog - PullRequest
0 голосов
/ 25 октября 2010

У меня есть проект 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);

}

1 Ответ

0 голосов
/ 25 октября 2010

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

...