Шаг 32.
Среда программирования Visual C++.
Обработка выбранного пункта меню или кнопки панели инструментов
На этом шаге мы рассмотрим создание обработчиков выбора пункта меню или кнопки панели инструментов.
На 20 шаге Вы узнали, как средствами ClassWizard обрабатывать сообщения,
порождаемые при выборе пользователем пункта меню или кнопки панели инструментов. Добавим
обработчики для команд Connect и Upload.
Описание обработчика желательно поместить в класс, наиболее тесно с ним связанный. Средство каркаса
MFC-приложения, облегчающее этот процесс, называется маршрутизацией команд
(Command Routing). Полагая, что подключение к удаленной БД является прерогативой приложения в целом,
обработку команды Connect следует поместить в класс приложения СМуАррАрр.
Обработчик команды Connect должен содержать код поиска и подключения к удаленной базе данных (БД).
Текущее состояние соединения с БД можно фиксировать в булевой переменной. После установления связи с БД
переменная принимает значение TRUE, а при разрыве соединения или неудачной попытке его создания -
FALSE. На данном этапе можно ограничиться имитацией подключения к БД - для этого в классе СМуАррАрр
создайте переменную m_isDatabaseConnected и при вызове команды Connect присваивайте ей
попеременно значения TRUE и FALSE.
- Добавление переменной m_isDatabaseConnected в класс СМуАррАрр.
- На вкладке ClassView правой кнопкой мыши щелкните значок класса СМуАррАрр.
- В контекстном меню выберите команду Add Member Variable.
- В поле Variable Type диалогового окна Add Member Variable введите BOOL.
- В поле Variable Name наберите m_isDatabaseConnected.
- Убедитесь, что в группе Access установлен переключатель Public.

Рис.1. Добавление переменной m_isDatabaseConnected
Щелкните OK, и в классе СМуАррАрр появится новая переменная.
Замечание.
При разработке MFC-кода вместо встроенного в C++ типа bool используется определяемый в
MFC тип BOOL. Это необходимо для обеспечения совместимости с функциями MFC,
созданными еще до принятия bool в качестве стандартного типа ANSI и использующими тип
BOOL для булевых параметров и возвращаемых значений.
- Дважды щелкните значок конструктора класса СМуАррАрр, чтобы войти в редактор кода.
- Добавьте в конструктор строку, устанавливающую начальное значение переменной m_isDatabaseConnected:
m_isDatabaseConnected = FALSE;

Рис.2. Изменение конструктора
Создадим функцию для обработки команды Connect.
- Добавление метода OnDataConnect() в класс СМуАррАрр.
- Чтобы открыть ClassWizard, в проекте МуАрр нажмите CTRL+W. Щелкните вкладку
Message Maps, а затем выполните следующие действия:
- в списке Class Name выберите СМуАррАрр;
- в списке Object IDs - ID_DATA_CONNECT;
- в списке Messages - COMMAND.

Рис.3. Выбор класса и обрабатываемого события
- Щелкните Add Function. Появится диалоговое окно, в котором предлагается принять OnDataConnect() в качестве имени
для функции-обработчика. Щелкните ОК.
- Щелкните Edit Code. Откроется окно с файлом МуАрр.срр, курсор установлен в начале функции.
- Вместо строки комментария //TODO введите следующую строку:
m_isDatabaseConnected = m_isDatabaseConnected ? FALSE : TRUE;

Рис.4. Функция OnDataConnect()
Создадим обработчик команды Upload, выполняющий загрузку данных из приложения в базе данных.
Поскольку копируемые данные находятся внутри класса документа приложения, то метод OnDataUpload()
лучше всего поместить в класс CMyAppDoc. Ограничимся тем, чтобы функция выводила на экран
информационное окно.
- Добавление метода OnDataUpload() в класс СМуАррАрр.
- Еще раз выполните пункты предыдущего упражнения, изменив имя команды на ID_DATA_UPLOAD,
а имя функции - на ОnDataUpload().
- В текст функции OnDataUpload() вместо комментария //TODO введите следующий код:
AfxMessageBox("Выбран пункт Upload");

Рис.4. Функция OnDataUpload()
- Соберите и запустите приложение МyAрр.
- Убедитесь, что после реализации обработчиков команд стали доступны новые пункты меню и кнопки на
панели инструментов. Команда Connect пока никак себя внешне не проявляет, а команда Upload
выводит информационное окно.
Текст измененного приложения можно взять
здесь (42,9 Кб).
На следующем шаге мы рассмотрим общие вопросы, связанные с динамическим изменением меню и панели инструментов.
Предыдущий шаг
Содержание
Следующий шаг