Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
193-224.doc
Скачиваний:
1
Добавлен:
11.11.2019
Размер:
378.88 Кб
Скачать

Информационные диалоговые окна

Кроме рассмотренных выше стандартных диалоговых окон существуют информационные диалоговые окна, выводящие текст и запрашивающие ответ пользователя типа «да — нет». Вызов информационных диалоговых окон осуществляется с помощью глобальной функции ::AfxMessageBox(). Прототипы функции приводятся ниже.

int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );

int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT) -1 );

Функция использует такие параметры: lpszText — указатель на объект класса CString, содержащий выводимый текст; nType — стиль окна сообщений; nIDHelp — идентификатор Help- контекста; nIDPrompt — идентификатор, используемый для ссылки на строку в таблице строк.

Стиль информационного окна определяет набор отображаемых кнопок и значков. Все стили представлены константами с префиксом MB (Message Box). Значения некоторых из них приведены ниже.

  • MB_OK — окно сообщений содержит кнопку OK.

  • MB_OKCANCEL — окно сообщений содержит кнопки OK и Cancel.

  • MB_YESNO — окно сообщений содержит кнопки Yes и No.

  • MB_YESNOCANCEL — окно сообщений содержит кнопки Yes, No, и Cancel.

  • MB_ICONEXCLAMATION — окно сообщений содержит значок в виде восклицательного знака

  • MB_ICONINFORMATION — окно сообщений содержит значок в виде символа «i»

  • MB_ICONQUESTION — окно сообщений содержит значок в виде вопросительного знака.

  • MB_ICONSTOP — окно сообщений содержит значок в виде стоп сигнала

Рис. 7.16. Информационное окно со стилями MB_YESNO | MB_ICONSTOP

Комбинация стилей позволяет включать в информационное окно кнопки и значки, например, MB_YESNO | MB_ICONSTOP (рис. 7.16)

Задание 5. Отображение стандартных диалоговых окон

Дополним программу TabDemo функциями, отображающие стандартные диалоговые окна File Open, Find и Page Setup. Стандартные диалоговые окна поддерживаются Windows, что освобождает программиста от необходимости их реализации в каждом приложении. Поэтому рассмотрим только, как можно настроить и отобразить некоторые стандартные диалоговые окна, вызывая специальные функции, без реализации обработки сообщений, посылаемых элементами управления их окну-владельцу. Для модификации программы TabDemo выполните следующие действия.

1. Скопируйте в новый каталог исходные файлы программы TabDemo.

2. Откройте проект TabDemo, выполнив команду FileOpenProject….

3. Измените ресурс меню, добавив в него новые команды. В поле Type Here введите надпись View. В ниспадающем списке введите надпись File Open для команды меню. Оставьте идентификатор команды ID_VIEW_FILEOPEN139. Задайте надпись Find Replace Dialog для второй команды меню View. Идентификатор команды ID_VIEW_FINDREPLACEDIALOG предложил редактор ресурсов. Введите надпись Page Setup Dialog для третьей команды меню и не меняйте идентификатор ID_VIEW_PAGESETUPDIALOG. Вы получите меню как на рис. 7.17.

Рис. 7.17. Меню View программы TabDemo

4. Сохраните изменения по команде FileSave All. Откройте файл …\TabDemo\TabDemo.rc в редакторе Notepad, найдите определение меню и замените идентификатор ID_VIEW_FILEOPEN139 значением ID_VIEW_FILEOPEN. Сохраните файл. Вы получите идентификаторы команд как на рис. 7.18.

Рис. 7.18. Идентификаторы команд меню View программы TabDemo

5. Не закрывая окно редактора ресурса меню, создайте обработчики командных сообщений. Для этого щелкните правой кнопкой мыши на первой команде меню. В контекстном меню выберите команду Add Event Handler. Заполните поля диалогового окна Event Handler Wizard (рис. 7.19).

Рис. 7.19. Диалоговое окно Event Handler Wizard при создании обработчиков командных сообщений

6. Повторите действия, описанные в пункте 5, для добавления обработчиков сообщений, вызванных командами Find Replace Dialog и Page Setup Dialog. В результате в файл MainFrm.h интерфейса класса CMainFrame будут добавлены объявления функций:

// MainFrm.h : interface of the CMainFrame class class CMainFrame : public CFrameWnd { //. . . // Generated message map functions protected: DECLARE_MESSAGE_MAP() public: afx_msg void OnViewFileopen(); afx_msg void OnViewFindreplacedialog(); afx_msg void OnViewPagesetupdialog(); };

В карту сообщений в файл MainFrm.срр реализации класса CMainFrame добавятся макросы:

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_COMMAND(ID_VIEW_FILEOPEN, OnViewFileopen) ON_COMMAND(ID_VIEW_FINDREPLACEDIALOG, OnViewFindreplacedialog) ON_COMMAND(ID_VIEW_PAGESETUPDIALOG, OnViewPagesetupdialog) END_MESSAGE_MAP()

7. Функцию CMainFrame::OnViewFileopen()дополните кодом, в котором определяется объект dlg класса CFileDialog, конструируется фильтр на имена файлов, отображается модальное диалоговое окно File Open, запоминается выбранное пользователем имя файла и выводится информационное окно с сообщение о выборе.

void CMainFrame::OnViewFileopen() { // TODO: Add your command handler code here CFileDialog dlg(TRUE); //информация в строке "Тип файла" диалогового окна CString str("Все файлы (*.*)"); str+='\0'; //конец строки str+="*.*"; //фильтр на имена файлов str+='\0'; //альтернативная информация в строке типов файлов str+="Файлы кодов С++(*.cpp,*.h)"; str+='\0'; str+="*.cpp;*.h"; //фильтр на имена файлов str+='\0'; //занесение строки в поле структуры OPENFILENAME dlg.m_ofn.lpstrFilter=str; if (dlg.DoModal() == IDOK) { CString temp = "File selected: " + dlg.GetPathName(); AfxMessageBox(temp); } }

Вызов конструктора класса CFileDialog с аргументом TRUE означает использование диалогового окна File Open. Для построения фильтра используется объект str класса CString. Данные, которые заносятся в объект str, представляют собой набор строк, разделенных символами конца строки (код '\0') и содержащих текст в виде шаблонов имен файлов. Переменная, которая используется для инициализации этого поля в диалоговом окне, является полем lpstrFilter структуры OPENFILENAME, обращение к которой возможно через переменую-член m_ofn класса CFileDialog.

8. Функцию CMainFrame::OnViewFindreplacedialog() дополните кодом, который реализует создание объекта класса CFindReplaceDialog с помощью оператора new, создание немодального диалогового окна с помощью функции CFindReplaceDialog.Create().

void CMainFrame::OnViewFindreplacedialog() { // TODO: Add your command handler code here CFindReplaceDialog *pDlg = new CFindReplaceDialog; pDlg->Create(TRUE, _T("Findme"), NULL, FR_DOWN, this); }

9. Поскольку немодальные диалоговые окна посылают специальные сообщение окну-владельцу, то зарегистрируйте эти сообщения с помощью глобальной функции ::RegisterWindowMessage(). Аргументом функции является константа FINDMSGSTRING. Функция возвращает идентификатор зарегистрированного сообщения. Пользователь может задать произвольное имя. Для реализации немодального диалога Find Replace добавьте такой оператор в файл MainFrm.срр.

const UINT wm_Find = RegisterWindowMessage( FINDMSGSTRING );

10. В карту сообщений класса CMainFrame в файле MainFrm.срр добавьте макрос, который связывает идентификатор зарегистрированного сообщения и обрабатывающую его функцию. Имя функции задает пользователь.

ON_REGISTERED_MESSAGE(wm_Find, OnFindReplace)

11. В файл MainFrm.h в интерфейс класса CMainFrame добавьте объявление функции CMainFrame::OnFindReplace(), обрабатывающей зарегистрированное сообщение.

afx_msg LRESULT OnFindReplace(WPARAM wParam, LPARAM lParam);

12. В файл MainFrm.срр добавьте код реализации функции CMainFrame::OnFindReplace()

LRESULT CMainFrame::OnFindReplace(WPARAM wParam, LPARAM lParam) { if (((LPFINDREPLACE)lParam)->Flags & FR_FINDNEXT) { CString temp = "Search string: "; temp = temp + ((LPFINDREPLACE)lParam)->lpstrFindWhat; AfxMessageBox(temp); } return 0; }

13. Функцию CMainFrame::OnViewPagesetupdialog() дополните кодом, который создает объект класса CPageSetupDialog, отображает диалогового окна, сохраняет данные, выбранные в диалоговом окне, в поле ptPaperSize структуры PAGESETUPDLG. Доступ к полям этой структуры осуществляется через переменную-член m_psd класса CPageSetupDialog. С помощью С++ функции sprintf() данные целого типа преобразуются в строку и сохраняются в переменной temp.

void CMainFrame::OnViewPagesetupdialog() { // TODO: Add your command handler code here CPageSetupDialog dlg; if (dlg.DoModal() == IDOK)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]