На этом шаге мы рассмотрим работу двустороннего окна диалога.
Поскольку все поля ввода, необходимые для обеих сторон кассеты, не могут вместиться в одно диалоговое окно, то за один раз отображаются данные только одной стороны. В некотором смысле это окно представляет два диалоговых окна в одном. Из-за такой конструкции пользователь, завершив ввод данных для стороны А, должен нажать кнопку Side В для переключения окна диалога на сторону В.
Если пользователь выбрал кнопку Side, сторона должна переключиться, отобразив поля редактирования для другой стороны кассеты. Это выполняется функцией отклика на сообщение CmSide().
В этой функции при обращении к TransferData() данные сначала копируются из диалогового окна в буфер обмена:
TransferData(tdGetData);
Автоматическая передача данных имеет место только тогда, когда пользователь закрывает окно диалога. Следовательно, программа должна информировать механизм передачи тогда, когда ей нужны данные и когда необходимо обновить данные диалогового окна. После этого обращения введенный пользователем в полях ввода текст будет находиться в структуре dlgStrgs.
После сохранения данных в буфере обмена, если пользователь работает со стороной А (флаг sideA равен TRUE), программа копирует содержимое буфера обмена dlgStrgs в sideAStrgs, которая также является структурой типа TTransBuf:
sideAStrgs = dlgStrgs;
Далее программа вызывает функцию SetText() объекта sideStr TStatic, чтобы изменить статический текст в верхнем правом углу окна диалога:
sideStr->SetText("Side В:");
Чтобы изменить метку кнопки Side, программа вызывает функцию SetWindowText() объекта sideButn TButton:
sideButn->SetWindowText("&Side A");
Программа изменяет текст кнопки на Side А, так как кнопка теперь используется для переключения на сторону А, а статический текст строки - на Side B, так как это теперь та сторона, с которой работает пользователь.
Так как основное название кассеты остается одним и тем же для обеих сторон, оно копируется в буфер стороны В:
strcpy(sideBStrgs.cassTitle, sideAStrgs.cassTitle);
На следующем шаге программа копирует строки стороны В в буфер обмена, чтобы библиотека OWL могла их отобразить, и переключает флаг sideA:
dlgStrgs = sideBStrgs; sideA = FALSE;
Прежде, чем функция завершит работу, обращение к GetDlgItem() передает управление полю ввода ID_SIDETITLE, а вызов SetFocus() Windows помещает текстовый курсор в то поле, в котором пользователь вероятнее всего захочет начать набор текста:
HWND hControl = GetDlgItem(ID_SIDETITLE); ::SetFocus(hControl);
Наконец, программа копирует новые данные в поля ввода, вызывая TransferData():
TransferData(tdSetData);
Аналогичный процесс происходит при переключении со стороны В на сторону А, поэтому оператор else здесь не рассматривается.
На следующем шаге мы рассмотрим печать вкладыша.