Проект InterTest демонстрирует, что в приложениях, основанных на диалоге (Dialog Based) главное окно приложения может иметь вкладки. Кроме прочего, есть сохранение в файл результатов тестирования.
Целью проекта было изучение добавление вкладок в диалоговое окно. Что-то наподобие TabsControl, но реализовано это при помощи класса CPropertySheet.
CInterTestDlg::CInterTestDlg(const char *nd /*= ""*/ ) : CPropertySheet(nd) { //{{AFX_DATA_INIT(CInterTestDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); AddPage(&m_prop0); // добавление вкладок AddPage(&m_prop1); AddPage(&m_prop2); AddPage(&m_prop3); AddPage(&m_prop4); AddPage(&m_prop5); AddPage(&m_prop6); AddPage(&m_prop7); AddPage(&m_prop8); }
Каждая вкладка – это диалог, отдельно созданный и привязанный к главному диалоговому окну. Код для каждого диалога прописан в отдельном .cpp-файле.
При инициализации диалогового окна, в поля некоторых элементов управления добавляются значения по умолчанию. Например, для первого диалога это значения псевдоавторизации.
BOOL CProperty0::OnInitDialog() // ставим значения по умолчанию в поля авторизации { CPropertyPage::OnInitDialog(); SetDlgItemText(IDC_EDIT1, "Иванов"); SetDlgItemText(IDC_EDIT2, "Иван"); SetDlgItemText(IDC_EDIT3, "Иванович"); SetDlgItemText(IDC_EDIT4, "vs"); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
При нажатии кнопки Пройти тест активной становится следующая вкладка. Также в обработчике нажатия кнопки, реализована некоторая проверка корректности введенных данных.
void CProperty0::OnBnClickedOk1() // реакция на кнопку "Пройти" { CString password; GetDlgItemText(IDC_EDIT4, password); GetDlgItemText(IDC_EDIT1, result.r_name); GetDlgItemText(IDC_EDIT2, result.r_fathername); GetDlgItemText(IDC_EDIT3, result.r_lastname); if(password == result.r_password) { if(result.r_name == "" || result.r_fathername == "" || result.r_lastname == "") { AfxMessageBox("Заполните все поля!!!"); return; } CPropertySheet *tmp; tmp = (CPropertySheet *)GetParent(); tmp -> SetActivePage(1); } else AfxMessageBox("Пароль неправильный"); }
tmp -> SetActivePage(1); Этой строкой мы делаем следующую вкладку активной. Показывается следующее диалоговое окно.
Начисление баллов за правильный ответ происходит за счет обработки события на действие с элементом управления. Например, если выбран правильный RadioButton, то значение суммы баллов будет увеличено на ненулевое значение.
void CProperty1::OnBnClickedRadio1() { p1_result1 = 0; //UpdateData(false); } void CProperty1::OnBnClickedRadio2() { p1_result1 = 5.0; //UpdateData(true); }
Хотелось бы отметить еще один момент. На вкладке «Вопрос 4» 2 вопроса. Причем, один из них неактивен.
Он становится активным после того, как кнопка ОК нажата.
Для вывода предлагаемых ответов на вопрос используются разнообразные элементы управления. Такие как CheckBox, RadioButton, выпадающий список, Многострочное текстовое поле (ListBox). После прохождения теста выводятся полученные результаты и предлагается сохранить их в текстовый файл.