На этом шаге мы рассмотрим использование класса TInputDialog.
При работе с приложениями в Windows пользователь выполняет определенные операции чаще, чем другие. Например, большинство приложений требует открытия и сохранения какого-либо типа файла. К другим операциям общего характера относятся выбор цвета и шрифта, поиск и замена текста, изменение установок принтера. В самом деле, пользователь выполняет эти общие задачи так часто, что при проектировании Microsoft Windows для решения таких задач были включены заранее созданные стандартные окна диалога. Это удобно не только программистам, работающим в Windows, но является своего рода гарантией, что эти стандартные задачи будут выполняться во всех приложениях одинаковым образом.
Как вам уже известно, ObjectWindows инкапсулирует стандартные диалоговые окна в свои собственные классы и добавляет несколько собственных общих диалоговых окон, включая и диалоговое окно ввода, которое получает от пользователя одну строку. Классами стандартных диалогов в OWL являются TInputDialog, TPrinterAbortDlg, TChooseColorDialog, TFindDialog, TReplaceDialog, TChooseFontDialog, TPrintDialog, TFileOpenDialog, TFileSaveDialog. Начиная с этого шага мы научимся использовать эти классы.
Очень часто в программе бывает необходимо получить быстрый ответ от пользователя. В этом случае, как вам, должно быть, кажется, можно подключить программу Resource Workshop и вставить в диалоговое окно единственную область ввода. Конечно же, чтобы получить информацию из этого диалогового окна, вам необходимо установить буфер обмена.
Однако OWL уже включает в себя диалоговые окна, которые подходят для получения простых ответов от пользователя. Используя диалоговое окно TInputDialog, вы можете получить одну строку от пользователя, не име дела с Resource Workshop или установкой буфера обмена. Следующий пример демонстрирует использование класса TInputDialog. Рисунок 1 показывает программу в действии.
#include <owl\applicat.h> #include <owl\framewin.h> #include <owl\inputdia.h> #include "pr23_1.rc" //Класс приложения class TApp: public TApplication { public: TApp():TApplication(){} void InitMainWindow(); }; //Класс основного окна class TWndw:public TFrameWindow { public: TWndw(TWindow *parent, const char far *title); protected: void CmInputDlg(); DECLARE_RESPONSE_TABLE (TWndw); }; DEFINE_RESPONSE_TABLE1 (TWndw, TFrameWindow) EV_COMMAND(CM_INPUTDLG,CmInputDlg), END_RESPONSE_TABLE; TWndw::TWndw(TWindow *parent, const char far *title): TFrameWindow(parent,title) { // Добавить меню к главному окну. AssignMenu("MENU_1"); // Определить расположение и размеры окна. Attr.X=50; Attr.Y=50; Attr.W=GetSystemMetrics(SM_CXSCREEN)/3; Attr.H=GetSystemMetrics(SM_CXSCREEN)/4; } // TWndw::CmInputDlg() // Эта функция реагирует на команду Dialog/Test // меню Dialog. void TWndw::CmInputDlg() { char str[81] = "Строка по умолчанию"; // Создать окно диалога. TInputDialog *dialog = new TInputDialog(this, "Тестовое окно ввода", "Задайте строку:", str, sizeof(str)); // Выполнить окно диалога. int result = dialog->Execute(); // Если пользователь нажал кнопку ОК... if (result == IDOK) MessageBox(str,"Результат",MB_OK); } void TApp::InitMainWindow() { TFrameWindow *wndw= new TWndw(0,"Диалоговое окно ввода"); SetMainWindow(wndw); } int OwlMain(int,char *[]) { return TApp().Run(); }
Файл ресурсов:
#ifndef WORKSHOP_INVOKED #include "windows.h" #endif #define CM_EXIT 24310 #define CM_INPUTDLG 108 #ifdef RC_INVOKED #include <owl\inputdia.rc> MENU_1 MENU { POPUP "&File" { MENUITEM "E&xit", CM_EXIT } POPUP "&Dialog" { MENUITEM "&Test Dialog...", CM_INPUTDLG } } #endif
Рис.1. Результат работы приложения
Когда вы запускаете эту программу и выбираете команду Test Dialog из меню Dialog, на экране появляется диалоговое окно ввода. Сначала окно диалога содержит заданную по умолчанию строку, которую вы можете принять, нажав кнопку ОК. Возможно, однако, вы захотите ввести собственный ответ. Чтобы сделать это, наберите свою строку, которая заменит заданную по умолчанию.
Независимо от того, приняли ли вы строку по умолчанию или ввели свою, при выходе из диалогового окна по кнопке ОК появляется окно сообщений, показывающее последнюю введенную строку. Если выход происходит по кнопке отмены выбора Cancel, то окно сообщений на экране не отображается.
Обратимся теперь к тексту программы. В начале имеется строка:
#include <owl\inputdia.h>
Чтобы использовать диалоговое окно ввода, вы должны включить заголовочный файл класса TInputDialog в свою программу. Однако заголовочный файл содержит только объявление класса. Он не содержит файл ресурсов окна диалога для ввода. Этот файл называется INPUTDIA.RC и находится в каталоге ..\INCLUDE\OWL. Вы должны добавить INPUTDIA.RC к своему проекту или, как сделано в этой программе, включить его в свой файл ресурсов программы. Если вы не включите INPUTDIA.H в свою программу или не добавите INPUTDIA.RC в свой проект или файл ресурсов, программа не будет компилироваться.
Посмотрите на класс главного окна:
class TWndw:public TFrameWindow { public: TWndw(TWindow *parent, const char far *title); protected: void CmInputDlg(); DECLARE_RESPONSE_TABLE (TWndw); }; DEFINE_RESPONSE_TABLE1 (TWndw, TFrameWindow) EV_COMMAND(CM_INPUTDLG,CmInputDlg), END_RESPONSE_TABLE;
Этот класс включает кроме конструктора единственную функцию отклика на сообщение CmInputDlg(). Благодаря входу EV_COMMAND в таблицу откликов класса главного окна, библиотека OWL вызывает CmInputDlg(), если пользователь выбрал команду Test Dialog из пункта меню Dialog:
void TWndw::CmInputDlg() { char str[81] = "Строка по умолчанию"; // Создать окно диалога. TInputDialog *dialog = new TInputDialog(this, "Тестовое окно ввода", "Задайте строку:", str, sizeof(str)); // Выполнить окно диалога. int result = dialog->Execute(); // Если пользователь нажал кнопку ОК... if (result == IDOK) MessageBox(str,"Результат",MB_OK); }
Эта функция определяет локальный символьный массив, названный str, который программа инициализирует значением "Строка по умолчанию". В данной программе массив символов str является тем местом, где объект TInputDialog ищет заданную по умолчанию строку для отображения ее в области ввода, а также тем местом, куда диалоговое окно помещает введенную пользователем строку (если пользователь закрыл окно кнопкой ОК).
После определения символьного массива эта функция создает объект типа TInputDialog. Конструктор класса TInputDialog требует пять параметров:
Сконструировав диалоговое окно ввода, CmInputDlg выполняет его путем вызова функции-члена Execute() диалогового окна. В результате на экране появится диалоговое окно, и пользователь может с ним работать. Execute() возвращает значение, которое соответствует выбранной в диалоговом окне кнопке. Если это значение IDОК, то окно диалога TInputDialog передает содержимое области ввода в строку, переданную его конструктору (в рассмотренном выше случае str). Если возвращаемое значение IDCANCEL, то передачи не происходит. В предыдущей функции, если результатом является IDОК, программа выводит окно сообщений, которое показывает содержимое области ввода диалогового окна ввода. Если результатом является значение IDCANCEL, эта функция не выполняет никаких действий.
На следующем шаге мы рассмотрим диалоговое окно Open.