пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Реализация обработки сообщений в приложении с помощью ClassWizard. Виды сообщений.

Как мастер СlassWizard помогает перехватывать сообщения

Читать карту сообщений в листинге программы совсем .непросто, но зато ее очень просто формировать с помощью ClassWizard. В Visual C++ версии 6.0 существуют два способа включения компонента в карту сообщений — с помощью главного диалогового окна ClassWizard и с помощью одного из новых диалоговых окон, которые вставляют в программу обработчики сообщений или виртуальные функции.

Вкладки диалогового окна ClassWizard

Для того чтобы вывести на экран диалоговое окно мастера ClassWizard, нужно выбрать из меню View--ClassWizard или нажать <Ctrl+W>. ClassWizard имеет диалоговое окно с несколькими вкладками. Вкладка Message Maps (Карты сообщений). В верхней ее части имеется два раскрывающихся списка. В одном — Project— представлен проект, над которым вы в настоящее время работаете (в данном случае— ShowString), в другом— Class name— класс, карта сообщений которого редактируется (в данном случае— CShowSthngApp). Информация о карте сообщений этого класса выведена в других полях вкладки.

Ниже этих однострочных полей расположена пара многострочных окон. В том, что слева, перечислены сам класс и все команды, которые может сформировать пользовательский интерфейс. Когда в левом окне выделено имя класса, в правом перечислены все сообщения Windows, которые этот класс мог бы перехватывать. Кроме того, там же перечислены виртуальные функции, которые отвечают за обработку стандартных (наиболее распространенных) сообщений.

В правой верхней части окна находятся четыре кнопки, пользуясь которыми, можно включить новый класс в проект, новую функцию — в существующий класс, для того чтобы перехватывать выделенное в левом окне сообщение, удалить функцию, которая ответственна за обработку выделенного сообщения, или вывести на экран текст этой функции. Типовая методика следующая — нужно выбрать класс, сообщение и щелкнуть на кнопке Add Function с тем, чтобы добавить функцию, которая будет ответственна за обработку заданного сообщения. Ниже перечислены операции, которые будут выполнены после щелчка на Add Function.

•В конец файла текста программы включается заготовка ("скелет" — skeleton) функции.

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

•В файл заголовка также включается новый компонент карты сообщений.

•Обновляются списки сообщений и функций-членов в окнах вкладки.

После включения новой функции щелчок на Edit Code позволит наполнить созданную ClassWizard заготовку функции содержанием соответственно тому, как планируется обрабатывать данное Сообщение. Того же результата можно достичь, сделав двойной щелчок на имени функции в списке Member Functions.

Этот список находится ниже окон списков Object IDs и Messages. В нем перечислены функции-члены текущего класса, которые связаны с определенными сообщениями. В данном случае имеются две такие функции.

• InitInstance(). Перегружает виртуальную функцию класса CWinApp — базового класса для CShowStringApp. Эта функция помечена символом V в списке, что означает— виртуальная функция (Virtual function).

•OnAppAbout(). Перехватывает команду ID_APP_ABOUT; помечена символом W в списке, что означает — сообщение окна (Window message).

Функция InitInstance() вызывается после запуска приложения. Вам нет необходимости углубляться в подробности ее работы— ClassWizard просто напоминает, что эта функция уже перегружена для данного приложения.

И наконец, ниже окна списка Member Functions выведено сообщение, напоминающее о назначении выделенного сообщения. В данном случае текст Called to implement wait cursors (Вызывается для установки курсора ожидания) — это описание виртуальной функции DoWaitCursor().

В Visual C++ начиная с версии 5.0 предлагается новый дополнительный способ перехвата сообщений. Вместо того чтобы вызвать ClassWizard и затем не забыть найти правильное имя класса в раскрывающемся списке, нужно просто щелкнуть правой кнопкой мыши на имени класса в окне ClassView и затем выбрать пункт Add Windows Message Handler (Добавление обработчиков сообщений Windows) контекстного меню. Диалоговое окно в результате появится на экране.

В этом диалоговом окне не показаны виртуальные функции, которые перечислены в главном окне CiassWizard. Глядя на это окно, легко сообразить, что данный класс перехватывает команду ID_APP_ABOUT, но не перехватывает обновление команды (command update).

Для того чтобы добавить новую виртуальную функцию, нужно сделать двойной щелчок на имени класса в ClassView и выбрать пункт Add New Virtual Function (Добавление новой виртуальной функции) контекстного меню. Диалоговое окно в результате появится на экране.

В классе CShowStringApp уже перегружена виртуальная функция InitInstance(), но существуют и другие виртуальные функции, которые можно перегрузить. Как и на вкладке, сообщение в самом низу окна напоминает вам о назначении каждой функции. Сам же текст сообщения — Саlled to implement wait cursors (Вызывается для установки курсора ожидания) —тот же, что и на вкладке.

Какой класс должен перехватывать сообщение

Главный фокус в работе с картой сообщений и обработкой сообщений— решить, на какой класс возложить ответственность за перехват и обработку. Принять верное решение вы не сможете до тех пор, пока не будете четко представлять себе, для кого предназначены различные сообщения и команды типичного приложения. Обычно приходится выбирать что-нибудь из приведенного ниже списка.

•Активное представление (вид)

•Документ, представленный в нем

•Фрейм (рамка окна), который содержит активное представление

•Объект-приложение

Список сообщений

Существует почти 900 различных сообщений. Поскольку обычно для организации перехвата сообщений в приложении используется ClassWizard, представленный в нем список будет значительно короче (ведь в него отбираются только те сообщения, которые подходят для выбранного класса). Отнюдь не каждое окно может получить то или иное сообщение. Например, только класс, являющийся наследником CListBox, может получить сообщение типа LB_SETSEL, которое заставляет элемент управления типа список передвинуть подсветку на некоторый элемент списка. Префикс в имени сообщения указывает тип окна, для которого предназначено сообщение или которое его породило.

Какая разница, скажем, между ВМ-(button message) и ВN-(button notification) сообщением? ВМ-сообщение — это сообщение, направленное объекту-кнопке, например "Действуй так, как будто на тебе щелкнули". A BN-сообщение — это сообщение с кодом извещения, поступающего от объекта-кнопки окну, в котором эта кнопка находится и которое является "владельцем" кнопки. Это сообщение может, например, гласить: "Ой, на мне щелкнули!". То же самое справедливо для всех других модификаций сообщений, префиксы которых завершаются литерой М или N.

Иногда префикс не заканчивается буквой М. Например, СВ — это префикс для сообщений от объекта - поля со списком, в то время как CBN является префиксом сообщения с кодом извещения, которое поле со списком передает окну-владельцу. Например, CBN_SELCHANGE— это сообщение от поля со списком, извещающее "родителя" о том, что пользователь выбрал другой элемент списка.


18.01.2020; 20:03
хиты: 47
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь