19. Обработка сообщений. Карты сообщений.
С каждым окном в графической программе связана функция, называемая процедурой окна. Когда происходит некоторое событие, операционная система вызывает эту функцию, передавая ей идентификатор происшедшего события и данные для его обработки. Подобный процесс называется передачей сообщения окну.
Процедура окна с помощью библиотеки MFC создается автоматически. Если необходима собственная обработка сообщения, то создается функция обработки сообщения, являющаяся членом класса управления окном. Для определения обработчика сообщения можно воспользоваться ClassWizard, как описано ниже.
Например, если указатель находится внутри окна представления, то при нажатии левой кнопки мыши передается идентификатор WM_LBUTTONDOWN. Чтобы предусмотреть собственную обработку этого сообщения, используйте мастер ClassWizard для создания функции класса представления, обрабатывающей данное сообщение.
Командные сообщения. MFC обеспечивает специальную обработку сообщений, генерируемых объектами пользовательского интерфейса, стандартными элементами, поддерживаемыми библиотекой MFC: меню, комбинации клавиш, кнопки панелей инструментов, строки состояния, элементы управления диалоговых окон. Сообщения, генерируемые объектами пользовательского интерфейса, называют командными сообщениями. Каждый раз, когда пользователь выбирает объект интерфейса или когда один из этих объектов необходимо обновить, объект передает командное сообщение главному окну. Однако библиотека MFC сразу направляет сообщение объекту окна представления. Если он не имеет нужного обработчика, библиотека MFC направляет сообщение объекту документа. Если же объект документа не содержит обработчик, библиотека MFC направляет сообщение объекту главного окна программы. Если главное окно также не располагает обработчиком, сообщение направляется объекту приложения. Наконец, если объект приложения не обеспечивает обработку, то сообщение обрабатывается стандартным образом.
Таким образом, библиотека MFC расширяет основной механизм сообщений, чтобы командные сообщения обрабатывались не только объектами, управляющими ими, но и любыми другими объектами приложения. Каждый из них принадлежит классу, прямо или косвенно порожденному от класса CCmdTarget, реализующего механизм передачи сообщений.
Важной особенностью такого механизма является то, что программа может обрабатывать нужное сообщение внутри наиболее подходящего для этого класса. Например, в программе, созданной мастером AppWizard, команда Exit в меню File обрабатывается классом приложения, так как эта команда воздействует на приложение в целом. С другой стороны, команда Save в меню File обрабатывается классом Документа, так как этот класс отвечает за хранение и запись данных документа.
Схема сообщений. Когда мастер ClassWizard создает обработчик сообщения, то помимо объявления и определения функции-члена он также добавляет ее в специальную структуру MFC, называемую схемой (картой) сообщений (message map) и связывающую функции с обрабатываемыми сообщениями. Схема сообщений позволяет библиотеке MFC вызывать для каждого типа сообщения соответствующий обработчик.
Мастера AppWizard и ClassWizard создают необходимый код для реализации схемы сообщений, основанной на наборе MFC-макросов. После применения мастера ClassWizard для определения обработчиков трех видов сообщений мыши (создание которых рассматривается ниже) в файл CMiniDrawView.h будут добавлены следующие макросы и объявления функций:
// Сгенерированные функции схемы сообщений
protected:
//{{AFX_MSG(CMiniDrawView)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonOp(UINT nFlags, CPoint point);
//}}AFX_MSG DECLARE MESSAGE MAP()
В файл реализации представления MiniDrawView.cpp будут добавлены соответственно следующие макросы:
BEGIN_MESSAGE_MAP (CMiniDrawView, CView)
//{(AFX_MSG_MAP(CMiniDrawView)
ON_WM_LBUTTONDOWN ()
ON_WM_MOUSEMOVE ()
ON_WM_LBUTTONUP ()
//}}AFX_MSG_MAP END_MESSAGE_MAP()
Когда сообщение передается объекту класса, MFC обращается к схеме сообщений, чтобы определить, есть ли в классе обработчик такого сообщения. Если обработчик найден, ему передается управление. При отсутствии обработчика MFC ищет его в базовом классе. Если это не дает результата, то поиск будет продолжен по иерархии классов до первого встретившегося обработчика. Если в иерархии обработчик отсутствует, то будет выполнена стандартная обработка сообщения. Если же это командное сообщение, то оно перенаправляется следующему объекту в описанной ранее последовательности.
Обратите внимание: некоторые из классов библиотеки MFC, от которых порождены классы программы, содержат обработчики сообщений. Следовательно, даже если производный класс не определяет обработчик сообщения, обработчик базового класса может обеспечить соответствующую обработку. Например, базовый класс Документа CDocument содержит обработчики сообщений, поступающих при выборе команд Save, Save As... и Close в меню File (соответственно OnFileSave, OnFileSaveAs И OnFileClose).
- 1.Стандартный внешний вид окна приложения Windows.
- 1. Рамка
- 3. Интерфейс Visual Studio. Ресурсы приложения.
- 4. Интерфейс Visual Studio. Окно вывода Output.
- Окно редактирования текстов программ
- 5. Система меню. Меню File, Edit, View.
- Advanced… вывод на экран еще одного меню.
- 6. Система меню. Меню Insert, Project.
- 7. Система меню. Меню Build, Tools. Меню Build
- 8. Мастер создания приложения. Шаг 1,2.
- 9. Мастер создания приложения. Шаг 3,4.
- 10. Мастер создания приложения. Шаг 5,6,7.
- 11. Диалоговые окна и элементы управления
- 12. Формирование нового ресурса диалогового окна.
- 13. Задание идентификаторов диалогового окна.
- 14. Организация вывода диалогового окна на экран.
- 15.Использование элемента управления типа список
- Некоторые методы класса cListBox
- 16. Комбинированные списки (класс cCombobox).
- 17. Использование элементов типа переключатель Статические поля (класс static). Окна редактирования Edit Box. Методы класса cEdit.
- 19. Обработка сообщений. Карты сообщений.
- Некоторые макросы карты сообщений
- 20.Реал-ция обр-ки сообщ-й с пом.ClassWizard. Виды сообщ-й.
- Вкладки диалогового окна ClassWizard.
- Какой класс должен перехватывать сообщение
- Список сообщений
- 21. Команды. Реал-ция обр-ки команд с помощью ClassWizard
- Обновление команд.
- 22. Архитектура «Документ/представление».
- 23. Вывод на экран. Контекст устройства. Классы контекстов устройства в mfc.
- 24.Классы изобразительных средств. Примеры рисования простейших фигур.
- Рисование простейших фигур (пример)
- Изменение размеров и положения окна
- 25. Использование перьев. Работа с кистью.
- Работа с кистью
- 26. Концепция сохран.-восстановл. Объектов. Необходимые действия по сохр.-востан. Объектов класса cDocument. Разбор примера с сериализацией в классе документа.
- Создание класса, обеспечивающего сериализацию данных
- 27. Создание класса, обеспечивающего сохран.-восстан. Объектов. Разбор примера с сериализацией cMessage. Создание класса, обеспечивающего сериализацию данных
- 28. Непосредственное чтение и запись файлов. Класс сFile. Методы сFile. Режимы доступа к файлу.
- 29. Использование на примере основных методов класса cFile (открыть, записать, считать из файла). Использование стандартн. Диалог. Панелей для открытия и записи в файл.
- 30.Панель инструментов и строка состояния. Создание панели инструментов. Добавление и удаление пиктограмм.
- 31.Разработка ф-ций обработки сообщений, связ-х с пиктограммой на панели инструм-в. Класс панели инстр-в.
- 32. Доступ к базам данных в vs. Классы odbc.
- 34. Регистрация бд. Создание заготовки приложения.
- 35.Создание экранной формы для отображ-я содерж-го бд.
- 36.Добавление и удаление записей.
- 37. Сортировка и фильтрация записей.
- 3)Атрибуты данных
- 4) Операции
- 43.Класс cRecordset. Компоненты данных и осн.Методы (открытие набора, получ-е атрибутов результ. Набора IsOpen, IsBof, IsEof, IsDeleted, обновл-е результ. Набора)
- 1)Компоненты данных
- 2)Конструирование
- 44.Класс cRecordset. Компоненты данных и осн.Методы (операции перемещения пo результир-му набору, операции IsFieldDirty, IsFieldNull, Requary, SetFieldDirty, SetFieldNull).
- 1)Компоненты данных
- 45. Класс cRecordset. Переопределяемые методы (DoFieldExchange, GetDefoltSql, GetDefoltConnect).
- 46.Класс cRecordView.
- 1)Создание объекта
- 2)Атрибуты данных
- 47. Основные технологии com. Автоматизация. Перманентность. Моникеры.
- 48. Единообразная передача данных и объекты с подключением.
- 49. Технология ado. Объектная модель, наборы ado.
- 50. Применение ado Data Control и DataGrid Control.
- 2.2. Методические указания
- 51. Удаление, добавление и редактирование записей в технологии ado
- 52.Настройка Эл-тов упр-ния ado Data Control и DataGrid Control из кода приложения
- 53. Возможности AppWizard по созданию приложений, поддерживающих технологию ActiveX.
- 54.Библиотеки динамической компоновки dll
- 55.Создание и использование 32-битовых динамически связываемых библиотек
- 56. Создание рабочего потока. Управление приоритетами потоков
- 57. Синхронизация потоков. Объекты синхронизации и классы mfc.
- Объекты синхронизации и классы mfc.
- 58.Отладка программ в vs. Точка останова. Установка точек останова. Команды и окна отладки.
- Терминология отладки
- Команды и окна отладки
- Команды меню
- Установка точек останова
- Другие окна для отладки
- Окно Memory
- Применение утилиты mfc Tracer
- 59. Отладка программ в vs. Анализ значений переменных. Окно CallStact.