Шаг 38.
Библиотека OWL.
Программа "Печать вкладышей". Двусторонее окно диалога

    На этом шаге мы рассмотрим работу двустороннего окна диалога.

    Поскольку все поля ввода, необходимые для обеих сторон кассеты, не могут вместиться в одно диалоговое окно, то за один раз отображаются данные только одной стороны. В некотором смысле это окно представляет два диалоговых окна в одном. Из-за такой конструкции пользователь, завершив ввод данных для стороны А, должен нажать кнопку 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 здесь не рассматривается.

    На следующем шаге мы рассмотрим печать вкладыша.




Предыдущий шаг Содержание Следующий шаг