- •Фролов а.В., Фролов г.В. Библиотека системного программиста
- •Программирование для Windows 95 и Windows nt Введение
- •Поддержка сети Internet
- •Язык моделирования виртуальной реальности
- •Игровое sdk
- •Набор ocx объектов
- •Как связаться с авторами
- •Благодарности
- •Ввод/вывод
- •Константы
- •Распределение памяти
- •Операторы new и delete
- •Перегрузка имен функций
- •Задание параметров функции по умолчанию
- •Встраивание
- •Ключевое слово this
- •Разграничение доступа к элементам класса
- •Методы, входящие в класс
- •Конструкторы и деструкторы класса
- •Методы, не изменяющие объекты класса
- •Статические методы
- •Общие члены объектов класса
- •Дружественные функции и дружественные классы
- •Дружественные функции
- •Дружественные классы
- •Наследование
- •Единичное наследование
- •Множественное наследование
- •Разграничение доступа к элементам базового класса
- •Переопределение методов базового класса
- •Виртуальные методы
- •Абстрактные классы
- •Структуры
- •Шаблоны
- •Шаблоны в mfc
- •Перегрузка операторов
- •Обработка исключительных ситуаций
- •Операторы try, throw и catch
- •Листинг 1.1. Файл Exception.Cpp
- •Универсальный обработчик исключений
- •Тип исключения
- •2. Введение в mfc
- •Классы библиотеки mfc
- •Самый базовый класс mfc (класс cObject)
- •Основа структуры приложения (класс cCmdTarget)
- •Подзадачи приложения (классы cWinThread и cWinApp)
- •Документ приложения (класс cDocument)
- •Шаблон документов (классы cDocTemplate, cSingleDocTemplate и cMultiDocTemplate)
- •Окна (класс cWnd)
- •Исключения (класс cException)
- •Массивы, списки и словари
- •Файловая система (класс cFile)
- •Контекст отображения (класс cdc)
- •Объекты графического интерфейса (класс cGdiObject)
- •Меню (класс cMenu)
- •Базы данных (классы для работы с базами данных)
- •Синхронизация задач приложения (класс cSyncObject)
- •Сокеты (классы cAsyncSocket и cSocket)
- •Классы, не имеющие базового класса
- •Простые классы
- •Архивный класс (класс cArchive)
- •Информация о классе объекта (структура cRuntimeClass)
- •Отладка приложения (классы cDumpContext, cMemoryState)
- •Печать документа (класс cPrintInfo)
- •Первое приложение mfc
- •Окно Project Workspace
- •Листинг 2.1. Файл mfHello.Cpp
- •Средства ClassView
- •Добавление к классу нового метода
- •Добавление к классу нового элемента данных
- •Просмотр дерева наследования классов
- •Редактирование методов класса
- •Редактирование элементов данных класса
- •Приложение с единственным окном
- •Листинг 2.2. Файл mfStart.Cpp
- •Листинг 2.3. Файл mfStartApp.H
- •Оконные сообщения
- •Сообщения от органов управления
- •Командные сообщения
- •Макрокоманда on_registered_message
- •Макрокоманда on_message
- •Макрокоманда on_command
- •Макрокоманда on_command_range
- •Макрокоманда on_update_command_ui
- •Макрокоманда on_update_command_ui_range
- •Макрокоманда on_control_range
- •Забегая вперед
- •Приложение mfMenu
- •Листинг 2.7. Файл mfMenu.Cpp
- •Ресурсы приложения
- •Создание меню для приложения mfMenu
- •Листинг 2.8. Файл mfMenuRes.H
- •Листинг 2.9. Файл mfMenuRes.Rc
- •Долгий путь сообщения
- •Листинг 2.10. Файл mfMessage.Cpp
- •Листинг 2.11. Фрагмент файла mfMessage.Rc
- •Листинг 2.12. Файл resource.H
- •Диалоговая панель
- •Приложение с модальной диалоговой панелью
- •Листинг 2.13. Файл mfDialog.Cpp
- •Vertical Scroll Bar Вертикальная полоса просмотра
- •Листинг 2.14. Фрагмент файла mfDlgRes.Rc
- •Листинг 2.15. Файл resource.H
- •Главный класс приложения
- •Класс диалоговой панели
- •Обмен данными
- •Приложение с немодальной диалоговой панелью
- •3. Некоторые классы mfc
- •Класс cObject – основной класс mfc
- •Конструкторы класса
- •Оператор присваивания
- •Диагностика
- •Проверка целостности объектов класса
- •Получение дампа объекта класса
- •Сохранение и восстановление состояния объекта
- •Метод IsSerializable
- •Виртуальный метод Serialize
- •Информация о классе
- •Виртуальный метод GetRuntimeClass
- •Метод IsKindOf
- •Класс cPoint – точка на плоскости
- •Класс cSize – относительные координаты
- •Класс cString – текстовые строки
- •Конструктор класса
- •Коллекции
- •Массивы – шаблон cArray
- •Списки – шаблон cList
- •Словари – шаблон cMap
- •Класс cTime – дата и время
- •Файловая система – класс cFile
- •Открытие и создание файлов
- •Идентификатор открытого файла
- •Закрытие файлов
- •Чтение и запись файлов
- •Метод Flush
- •Операции с файлами
- •Блокировка
- •Позиционирование
- •Характеристики открытого файла
- •Файловая система – классы cMemFile и cStdioFile
- •Модификация класса cMemFile
- •Файловая система – класс cStdioFile
- •Приложение TestFile
- •Листинг 3.1. Файл TestFile.Cpp
- •Листинг 3.2. Файл fsystem.Dat
- •Исключения – класс cException
- •Класс cException
- •Класс cMemoryException
- •Класс cFileException
- •Приложение Except
- •Листинг 3.3. Файл Except.Cpp
- •Класс cArchiveException
- •Класс cNotSupportedException
- •Класс cResourceException
- •Класс cUserException
- •Запись и восстановление объектов
- •Запись в архивный файл
- •Чтение из архивного файла
- •Многозадачные приложения
- •4. Приложение с главной диалоговой панелью
- •Создание приложения средствами mfc AppWizard
- •Приложение Dialog
- •Имена, используемые mfc
- •Ресурсы приложения
- •Icons Пиктограммы
- •Version information Сведения о версии приложения
- •Диалоговые панели приложения Dialog
- •Пиктограмма
- •Исходные тексты приложения
- •Главный класс приложения dialog
- •Листинг 4.1. Файл Dialog.H
- •Листинг 4.2. Файл Dialog.Cpp
- •Главный объект приложения
- •Метод InitInstance
- •Класс главной диалоговой панели приложения
- •Листинг 4.3. Файл DialogDlg.H
- •Листинг 4.4. Файл DialogDlg.Cpp
- •Конструктор класса cDialogDlg
- •Метод DoDataExchange
- •Метод OnInitDialog
- •Метод OnSysCommand (системное меню)
- •Метод OnPaint (отображение пиктограммы приложения)
- •Метод OnQueryDragIcon
- •Файлы StdAfx.Cpp и StdAfx.H
- •Листинг 4.5. Файл StdAfx.Cpp
- •Листинг 4.6. Файл StdAfx.H
- •Средства ClassWizard
- •Создание нового класса
- •Листинг 4.7. Файл NewClass.H
- •Листинг 4.8. Файл NewClass.Cpp
- •Включение в класс новых методов
- •Включение в класс новых элементов данных
- •Просмотр характеристик класса
- •5. Однооконный интерфейс
- •Модель “документ – окно просмотра ”
- •Процедура создания однооконного приложения
- •Приложение Single
- •Ресурсы приложения
- •Шаблон меню
- •Панель управления toolbar
- •Пиктограмма
- •Диалоговая панель
- •Общие замечания о ресурсах приложения
- •Классы приложения
- •Класс cSingleApp
- •Главный объект приложения
- •Конструктор класса cSingleApp
- •Метод InitInstance
- •Метод OnAppAbout
- •Класс cSingleDoc
- •Конструктор и деструктор класса cSingleDoc
- •Методы OnNewDocument и Serialize
- •Методы AssertValid и Dump
- •Класс cSingleView
- •Конструктор и деструктор класса cSingleView
- •Метод GetDocument
- •Метод PreCreateWindow
- •Метод OnDraw
- •Методы OnPreparePrinting, OnBeginPrinting и OnEndPrinting
- •Методы AssertValid и Dump
- •Класс cMainFrame
- •Конструктор и деструктор класса cMainFrame
- •Метод OnCreate
- •Панель управления и панель состояния
- •Панель управления
- •Панель состояния
- •Метод PreCreateWindow
- •Методы AssertValid и Dump
- •Обработка командных сообщений
- •Порядок обработки сообщений
- •Главное окно однооконного приложения
- •Окно просмотра
- •Документ
- •Диалоговая панель
- •Командные сообщения и приложение Single
- •Изменение порядка обработки сообщений
- •Стандартные команд ные сообщения
- •Командные сообщения с идентификаторами id_file_
- •Командные сообщения с идентификаторами id_edit_
- •Командные сообщения с идентификаторами id_window_
- •Командные сообщения с идентификаторами id_app_
- •Командные сообщения с идентификаторами id_help_
- •Командные сообщения с идентификаторами id_view_
- •Простейший графический редактор
- •Создание нового документа
- •Сохранение и восстановление документа на диске
- •Для забывчивых пользователей
- •Простейший текстовый редактор
- •Заключение
- •Литература
Листинг 3.2. Файл fsystem.Dat
Метка тома: LIBRARY
Серийный номер: 1D794E8D
Тип файловой системы: FAT
Максимальная длина имени файла: 255
Свойства файловой системы
FS_CASE_IS_PRESERVED
FS_UNICODE_STORED_ON_DISK
Исключения – класс cException
Как мы рассказывали в главе “Обработка исключительных ситуаций”, язык Си++ позволяет вызывать и обрабатывать исключения любого типа. Однако эта возможность практически не используются классами, определенными в библиотеке MFC.
Для обработки исключительных ситуаций, возникающих в MFC, определен специальный класс. Сам класс CException является абстрактным классом. Объекты такого класса создавать нельзя. Для обработки исключительных ситуаций, возникающих в MFC, используется классы наследованные от класса CException:
CMemoryException ←|←CException
CFileException ←|
CArchiveException ←|
CNotSupportedException←|
CResourceException ←|
CDaoException ←|
CDBException ←|
COleException ←|
COleDispatchException ←|
CUserException ←|
Как правило, эти исключения вызываются методами классов MFC, когда возникают какие-либо ошибочные ситуации. Так, например, если вы попытаетесь открыть несуществующий файл, воспользовавшись для этого методом Open из класса CFile, то будет вызвано исключение CFileException.
Если вы желаете обрабатывать исключения, которые вызываются методами классов MFC, вы должны определить обработчики для этих исключений. Каждый такой обработчик должен представлять собой блок catch, в качестве аргумента которого надо использовать указатель на объект класса CException или указатель на объект класса, наследованного от класса CException:
try {
// Здесь может находится код, который вызывает исключение
}
// Обработчик для исключения типа CMemoryException
catch(CMemoryException* ptrException) {
// Обработка исключения …
// В конце удаляем объект исключения
ptrException–>Delete;
}
Еще раз подчеркнем, что обработчик исключений MFC должен принимать указатель на объект класса CException (или класса, наследованного от CException). Этот объект создается при возникновении исключительных ситуаций внутри методов MFC. После того как этот объект окажется не нужен, ваш обработчик должен его удалить. Для этого предназначен метод Delete, определенный в классе CException. Не используйте для удаления объектов класса CException и объектов классов, наследованных от него, обыкновенный оператор delete.
Обработчик исключения может выполнять различные действия в зависимости от того какое исключение и в каком контексте было вызвано. Для этого вы можете использовать методы и данные из объекта, переданного в обработчик исключения.
Методы классов MFC могут вызывать различные исключения. В следующей таблице кратко перечислены причины, по которым вызываются исключения разных типов:
Сейчас мы не будем рассматривать исключения, связанные с технологией OLE и базами данных.
Класс cException
Класс CException включает два виртуальных метода GetErrorMessage и ReportError. Эти методы позволяют получить словесное описание причины, которая привела к вызову исключения. Заметим, что методы GetErrorMessage и ReportError чисто виртуальные, поэтому они должны быть переопределены в наследуемом классе:
virtual BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError, PUINT pnHelpContext = NULL);
Когда вы вызываете в обработчике исключения метод GetErrorMessage, он записывает в буфер lpszError сообщение об ошибке, вызвовшей исключение. Размер буфера надо указать в параметре nMaxError. В конце сообщения всегда записывается символ двоичного нуля. Если сообщение не помещается в буфер lpszError (оно больше чем nMaxError – 1 байт), тогда в буфер записываются только nMaxError – 1 символов сообщения. В последний байт записывается двоичный нуль.
Необязательный параметр pnHelpContext может содержать указатель на переменную типа UINT, в которую будет записан идентификатор контекстной подсказки (help context ID).
Метод GetErrorMessage возвращает ненулевое значение, если сообщение об ошибке доступно, и нуль в противном случае.
Вы можете вызывать метод ReportError из обработчика исключений:
virtual int ReportError(UINT nType = MB_OK, UINT nMessageID = 0);
Метод ReportError отображает в диалоговой панели на экране сообщение об ошибке, вызвавшей данное исключение. Параметр nType определяет внешний вид диалоговой панели сообщения. В качестве параметра nType можно указать любую комбинацию стилей панелей сообщения, таких как MB_OK, MB_OKCANCEL, MB_RETRYCANCEL, MB_ICONEXCLAMATION, MB_ICONINFORMATION, MB_ICONQUESTION, MB_ICONSTOP. Если вы не укажите этот параметр, тогда подразумевается стиль MB_OK, то есть панель сообщения с одной кнопкой OK.
Иногда исключение может не иметь текстового описания. Вы можете указать методу ReportError, чтобы он отображал в этом случае определенное сообщение. Текст этого сообщения надо сохранить в строковом ресурсе, а соответствующий идентификатор передать методу ReportError в качестве второго параметра nMessageID. Если вы не укажите этот параметр, тогда отображается сообщение “No error message is available”.
Метод ReportError возвращает значение типа AfxMessageBox. Оно определяет, какая кнопка была нажата в диалоговой панели с сообщением.
Методы GetErrorMessage и ReportError используют данные из ресурсов, созданных AppWizard. Поэтому они могут работать неправильно, если приложение создано без использования AppWizard.