- •Фролов а.В., Фролов г.В. Библиотека системного программиста
- •Программирование для 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_
- •Простейший графический редактор
- •Создание нового документа
- •Сохранение и восстановление документа на диске
- •Для забывчивых пользователей
- •Простейший текстовый редактор
- •Заключение
- •Литература
Списки – шаблон cList
В состав MFC входят классы, предназначенные для организации двунаправленных списков указателей, строк, состоящих из объектов CString, указателей на объекты класса CObject. В MFC версии 4.0 добавлен шаблон класса списка CList. С помощью этого шаблона можно создавать списки, состоящие из любых объектов.
Списковый класс имеет методы для вставки и удаления элементов в начало, конец и середину списка. Вы можете получить предыдущий и следующий элемент из списка.
Ниже представлен прототип шаблона CList.
template <class TYPE, class ARG_TYPE>
class CList : public CObject
Словари – шаблон cMap
Словарь, это таблица переменной длины, состоящая из двух колонок. Первая колонка содержит ключевые поля, а вторая – соответствующие им значения. Пользуясь объектами этого класса, вы можете по ключевому полю получить связанное с ним значение. Для поиска по ключу используется алгоритм хеширования, реализация которого вручную заняла бы слишком много времени.
В MFC включены классы для создания словарей отображающих значения слов, указателей, указателей на объекты типа CObject и объектов CString. Библиотека MFC версии 4.0 содержит шаблоны для организации словарей. Шаблоны позволяют создать класс словарей, основанных на объектах любых типов.
Ниже представлен прототип шаблона CMap.
template <class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
class CMap : public CObject
Параметр шаблона KEY определяет тип ключевого поля словаря. Параметр ARG_KEY является типом данных, используемых в качестве аргумента KEY. Параметр VALUE соответствует типу элементов, хранящихся в словаре, а параметр ARG_VALUE используется в качестве аргумента VALUE.
Класс cTime – дата и время
Для работы с календарными датами и временем в состав библиотеки классов MFC включен класс CTime. Класс основан на элементе типа time_t, в котором будет храниться дата и время. Элемент типа time_t объявлен как private, поэтому вы не можете обращаться непосредственно к этому элементу. Для этого в состав класса CTime входит набор методов.
Класс CTime включает несколько конструкторов, которые можно использовать для создания и инициализации объектов данного класса. Выберите тот конструктор, который наиболее удобен в каждом конкретном случае.
Если вам требуется создать массив, состоящий из объектов класса CTime, используйте конструктор без указания параметров:
CTime();
Объекты, созданные этим конструктором не инициализированы. Перед тем как ими пользоваться, запишите в них дату и время:
CTime(const CTime& timeSrc);
Параметр timeSrc определяет уже существующий объект класса CTime. Новый объект класса инициализируется значением даты и времени, взятым из существующего объекта.
Если в программе уже существует переменная типа time_t, в которой хранится значение, то можно создать новый объект класса CTime, основываясь на этой переменной:
CTime(time_t time);
Параметр time определяет переменную типа time_t, значение которой будет записано в создаваемый объект.
Если существует несколько переменных, в которых отдельно хранятся год, месяц, день, часы, минуты и секунды, то можно создать объект класса CTime, сразу же записав в него значения из этих переменных:
CTime(int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec, int nDST = –1);
Первые 6 параметров метода определяют время и дату. Параметр nYear должен содержать год, nMonth – месяц, nDay – день, nHour – час, nMin – минуты, nSec – секунды. NYear может принимать значения от 1900 до 2038, nMonth – от 1 до 12 и nDay от 1 до 31.
Параметр nDST управляет режимом перехода на летнее время. Если nDST содержит нуль, то время представляется в стандартном виде, режим перехода на летнее время не используется. Чтобы включить этот режим, параметр nDST должен содержать значение, больше нуля. Параметр nDST является необязательным. Если его не указать, считается, что он равен нулю. В этом случае конструктор самостоятельно определяет режим перехода на летнее время.
Следующий конструктор позволяет создать объект класса CTime и записать в него дату и время, определенные в формате, принятом в операционной системе MS-DOS:
CTime(WORD wDosDate, WORD wDosTime, int nDST = –1);
Параметры wDosDate и wDosTime должны содержать, соответственно, дату и время в формате MS-DOS. Параметр nDST управляет режимом перехода на летнее время. Мы уже рассматривали его выше.
Кроме класса CTime, существует, как минимум, еще две структуры, в которых может храниться значения даты и времени. Первая такая структура называется SYSTEMTIME. В ней хранятся текущие значения даты и времени. Структура SYSTEMTIME определена следующим образом:
typedef struct _SYSTEMTIME {
WORD wYear; // год
WORD wMonth; // месяц
WORD wDayOfWeek; // день недели
WORD wDay; // календарная дата
WORD wHour; // часы
WORD wMinute; // минуты
WORD wSecond; // секунды
WORD wMilliseconds; // миллисекунды
} SYSTEMTIME;
Если необходимо создать объект класса CTime, сразу записав в него текущие значения времени и даты, используйте конструктор, представленный ниже:
CTime(const SYSTEMTIME& sysTime, int nDST = –1);
Параметр sysTime является указателем на структуру типа SYSTEMTIME. Необязательный параметр nDST управляет режимом отсчета даты и описан нами выше.
Вторая структура, в которой хранятся значения даты и времени, называется FILETIME. Она служит для хранения 64-битового числа, представляющего дату и время как количество 100 наносекундных интервалов времени, прошедших с первого января 1601 года.
typedef struct _FILETIME {
DWORD dwLowDateTime; // младшие 32 бита
DWORD dwHighDateTime; // старшие 32 бита
} FILETIME, *PFILETIME, *LPFILETIME;
Конструктор имеет следующий прототип:
CTime(const FILETIME& fileTime, int nDST = –1);