На этом шаге мы рассмотрим реализацию процесса обмена данными.
Вызов функции DoDataExchange() осуществляется функцией CWnd::UpdateData(), в которой создается объект CDataExchange, передаваемый в качестве параметра сначала функции DoDataExchange(), а затем - DDX/DDV-функциям.
Единственный параметр функции UpdateData() типа BOOL определяет направление передачи данных. Функция CDialog::OnInitDialog(), выполняемая при создании диалогового окна, вызывает UpdateData() с параметром FALSE для передачи в элементы управления значений соответствующих переменных-членов класса диалога. Когда пользователь щелкает в диалоговом окне ОК, стандартный обработчик CDialog::OnOK() вызывает UpdateData() с параметром TRUE для выполнения проверки данных и сохранения их в переменных-членах. Схема этого процесса показана на рисунке 1.
Рис.1. Схема механизма DDX/DDV
Вызов функции CWnd::UpdateData() реализует обмен данными и их проверку в любом месте программы. В качестве примера рассмотрим приложение для просмотра изображений, в котором допускается изменять разрешение и цвет изображения, манипулируя элементами управления немодального диалогового окна. Чтобы обновить изображение сразу же после изменения значений в элементах управления нужно вызвать UpdateData(). Это позволяет сохранить новые параметры в классе диалога и сделать их доступными для функций перерисовки изображения.
aCD.m_nAccess = 1; aCD.m_bConnect = TRUE;
void CMyAppApp::OnDataConnect()
{
CConnectDialog aCD;
aCD.m_nAccess = 1;
aCD.m_bConnect = TRUE;
aCD.DoModal();
}
Рис.2. Текст функции OnDataConnect()
aCD.DoModal();
if (aCD.DoModal() == IDOK)
{
CString strMessage;
strMessage.Format("User %s logged in", aCD.m_strUserID);
AfxMessageBox(strMessage);
}
Рис.3. Текст функции OnDataConnect()
Значение IDOK, возвращаемое функцией DoModal(), свидетельствует, что пользователь закрыл окно, щелкнув кнопку ОК, а введенные в элементы управления данные обработаны соответствующими функциями проверки. Сами данные хранятся в переменных-членах DDX класса диалога. В данном примере значение, введенное в поле User ID, содержится в переменной CConnectDialog::m_strUserID.
Текст измененного приложения можно взять здесь (48,9 Кб).
На следующем шаге мы рассмотрим нестандартную реализацию DDX/DDV.