- •Фролов а.В., Фролов г.В. Библиотека системного программиста
- •Программирование для 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_
- •Простейший графический редактор
- •Создание нового документа
- •Сохранение и восстановление документа на диске
- •Для забывчивых пользователей
- •Простейший текстовый редактор
- •Заключение
- •Литература
Конструктор класса cDialogDlg
Конструктор класса CDialogDlg вызывает конструктор базового класса CDialog. При этом ему передается идентификатор диалоговой панели IDD и идентификатор главного окна приложения pParent. При создании объекта класса CDialogDlg не указываются никакие параметры. Поэтому pParent по умолчанию принимается равным NULL.
//////////////////////////////////////////////////////////////
// Конструктор класса CDialogDlg
CDialogDlg::CDialogDlg(CWnd* pParent /*=NULL*/) : CDialog(CDialogDlg::IDD, pParent) {
//{{AFX_DATA_INIT(CDialogDlg)
// В этом блоке ClassWizard размещает инициализацию
// элементов данных класса
//}}AFX_DATA_INIT
// Вызов LoadIcon не требует последующего вызова
// DestroyIcon, если вы используете программный интерфейс
// Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
В теле конструктора расположен блок AFX_DATA_INIT . В него ClassWizard будет добавлять код инициализации элементов данных класса CDialogDlg. Конструктор также инициализирует m_hIcon, записывая в него идентификатор пиктограммы IDR_MAINFRAME.
Функция AfxGetApp возвращает указатель на объект главного класса приложения. Такой объект для данного приложения всегда один. В нашем случае AfxGetApp определяет указатель на объект theApp. Вот прототип этой функции:
CWinApp* AfxGetApp();
Метод DoDataExchange
Диалоговая панель приложения содержит только две кнопки и не имеет связанных с ними переменных. Однако метод DoDataExchange переопределен. Фактически он не выполняет ни какой работы. Единственное что он делает, это вызывает метод DoDataExchange базового класса CDialog.
Если вы добавите к диалоговой панели новые органы управления и свяжете их средствами ClassWizard с элементами данных класса CDialogDlg, то в блоке AFX_DATA_MAP будут размещены вызовы методов DDE и DDV , необходимые для выполнения обмена данными.
void CDialogDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDialogDlg)
// Здесь ClassWizard размещает вызовы методов DDX и DDV
//}}AFX_DATA_MAP
}
Метод OnInitDialog
Когда вы отображаете диалоговую панель на экране, вызывая методы DoModal, Create или CreateIndirect, функции диалоговой панели передается сообщение WM_INITDIALOG. Вы не имеете доступа непосредственно в функции диалога. Ее реализация содержится в базовом классе CDialog.
В ответ на сообщение WM_INITDIALOG вызывается метод OnInitDialog, объявленный как виртуальный метод класса CDialog. Метод OnInitDialog вызывается непосредственно перед выводом панели на экран.
Таблица сообщений класса CDialogDlg не содержит макрокоманд для обработки сообщения WM_INITDIALOG. Метод OnInitDialog вызывается непосредственно MFC.
Чтобы реализовать собственную обработку сообщения WM_INITDIALOG, нужно просто переопределить метод OnInitDialog. Переопределенный метод должен сразу вызвать метод OnInitDialog базового класса CDialog.
Для приложения Dialog MFC AppWizard уже переопределил метод OnInitDialog. В реализации метода добавляется новая строка к системному меню диалоговой панели для вызова краткой справки о приложении. Затем вызывая метод SetIcon, определенный в базовом классе CWnd, мы выбираем пиктограммы для приложения.
Метод OnInitDialog возвращает значение TRUE. Это означает, что фокус ввода будет установлен на первый орган управления диалоговой панели. Первый орган диалоговой панели можно выбрать в редакторе диалоговой панели, выбрав из меню Layout строку Tab Order.
Если во время инициализации диалоговой панели метод OnInitDialog устанавливает фокус ввода другому органу управления, метод должен вернуть значение FALSE.
BOOL CDialogDlg::OnInitDialog() {
CDialog::OnInitDialog();
// Добавление строки "About…" к системному меню приложения
// Проверяем, что идентификатор IDM_ABOUTBOX относится к
// системным командам
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty()) {
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
// Выбираем пиктограмму для диалоговой панели. Если главное
// окно приложения не является диалоговой панелью этот код
// не нужен
SetIcon(m_hIcon,TRUE); // Выбираем пиктограмму большого
// размера
SetIcon(m_hIcon,FALSE); // Выбираем пиктограмму маленького
// размера
// TODO: Здесь вы можете выполнить дополнительную
// инициализацию
return TRUE;
}