Создание карт сообщений

   
На этом шаге мы рассмотрим создание карт сообщений для обработки различных сообщений.

   
Карты сообщений поддерживают все классы, производные от CCmdTarget. Классы, генерируемые мастером AppWizard,
создаются вместе с простейшей картой сообщений. С помощью мастера ClassWizard можно добавлять новые классы,
содержащие карту сообщений, и манипулировать записями таких карт уже существующих классов.
Создание обработчиков сообщений средствами мастера ClassWizard

   
Здесь мы рассмотрим вопросы, связанные с добавлением обработчиков сообщений Windows и командных сообщений с помощью
мастера ClassWizard. Изучив сгенерированный код, Вы поймете, как в MFC-приложениях создаются карты сообщений.

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

  • Добавление обработчика сообщения Windows.
  • Вернитесь в проект МуАрр.
  • Откройте ClassWizard, нажав CTRL+W. Перейдите на вкладку Message Maps.
  • В списке Class Name выберите элемент CMyAppView. Это показывает, что Вы хотите обработать сообщение, посланное классу
    представления, который инкапсулирует клиентскую область главного окна.
  • В списке Object IDs щелкните пункт CMyAppView.
  • В списке Messages выберите элемент WM_LBUTTONDOWN. Это сообщение будет отправлено приложению, когда Вы щелкнете левой
    кнопкой мыши в клиентской области окна.


    Рис.1. Выбор обрабатываемого события

  • Щелкните кнопку Add Function. Мастер ClassWizard создаст функцию-заглушку, в которую Вы можете добавить свой код.
    Все сообщения Windows обрабатываются перегруженными виртуальными функциями базового класса CWnd. Их названия начинаются с
    "On", после чего следует название сообщения, у которого обрезан префикс WM_, а заглавными являются только первые буквы слов.
    В данном случае функция называется OnLButtonDown().
  • Щелкните кнопку Edit Code. Откроется файл MyAppView.cpp, a курсор будет помещен в начало функции OnLButtonDown().
    Рис.2. Функция, вызываемая для обработки события WM_LBUTTONDOWN
  • Замените комментарий, начинающийся с //TODO, таким кодом:
        AfxMessageBox("Щелчок левой кнопкой мыши");
    

    Теперь эта функция выглядит следующим образом:

    void CMyAppView::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    	AfxMessageBox("Щелчок левой кнопкой мыши");
    	CScrollView::OnLButtonDown(nFlags, point);
    }
    
  • Нажмите клавишу F7, чтобы собрать проект МуАрр, после чего запустите приложение клавишей F5. Проверьте работу программы,
    щелкнув левой кнопкой мыши в клиентской области. Закройте приложение МуАрр.
  • Теперь добавьте обработчик командного сообщения, посылаемого при выборе пункта Paste в меню Edit.

  • Добавление обработчика командного сообщения.
  • Открыв проект МуАрр, нажмите клавиши CTRL+W, тем самым Вы вызовите мастер ClassWizard. Перейдите на вкладку
    Message Maps.
  • В списке Class Name щелкните СМуАррАрр. Не забывайте, что командные сообщения могут обрабатываться любым классом приложения.
    Так как Ваша функция очень маленькая, Вы сделаете ее членом такого класса. Сообщения должны обрабатываться классом, который наиболее
    тесно с ними связан. Например, лучшее место для размещения обработчиков команд, которые изменяют атрибуты главного окна
    (отображают и скрывают панель инструментов), - класс CMainFrame.
  • В списке Object IDs щелкните элемент ID_EDIT_PASTE. Это идентификатор команды, передаваемый в качестве параметра
    сообщения WM_COMMAND, которое генерируется при выборе пункта Paste в меню Edit.
  • В списке Messages выберите COMMAND. Таким образом Вы указываете, что собираетесь обрабатывать командное сообщение,
    а не сообщение об обновлении пользовательского интерфейса.
  • Щелкните кнопку Add Function. Появится диалоговое окно, предлагающее в качестве названия обработчика OnEditPaste().
    Это является результатом того, что Вы определяете новую функцию, а не перегружаете уже существующую виртуальную функцию базового
    класса. Согласитесь с данным названием, щелкнув кнопку ОК.


    Рис.3. Задание имени обработчика

  • Щелкните кнопку Edit Code. Откроется файл MyAppView.cpp, курсор будет помещен в начало функции OnEditPaste().
  • Замените комментарий, начинающийся с //TODO, таким кодом:
        AfxMessageBox("Выбрана команда Paste из меню Edit");
    

    Теперь эта функция следующим образом:

    void CMyAppApp::OnEditPaste() 
    {
       AfxMessageBox("Выбрана команда Paste из меню Edit");
    }
    
  • Соберите и запустите приложение МуАрр. Чтобы проверить его работу, выберите в меню Edit пункт Paste. Обратите внимание:
    пункты меню, обработчики которых не определены, недоступны.

Код карты сообщений

   
При добавлении функции-обработчика мастер ClassWizard выполняет следующие действия:

  • объявляет функцию в заголовочном файле класса;
  • создает функцию-заглушку в файле реализации класса;
  • добавляет соответствующую запись в карту сообщений.

   
Посмотрим, что представляют собой тексты объявления функции CMyAppApp::OnEditPaste() и ее карты сообщений.

  • Просмотр объявления функции CMyAppApp::OnEditPaste().
  • Перейдите к объявлению класса СМуАррАрр, находящемуся в файле МуАррApp.h, дважды
    щелкнув название этого класса в окне ClassView.
  • Найдите следующий код в самом конце файла:
    	//{{AFX_MSG(CMyAppApp)
    	afx_msg void OnAppAbout();
    	afx_msg void OnEditPaste();
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    
  •    
    Обратите внимание на макрос DECLARE_MESSAGE_MAP. Он представляет собой основную часть карты сообщений и добавлен к коду
    мастером AppWizard или ClassWizard. Изучим записи карты сообщений.

  • Просмотр записи карты сообщений для функции СМуАррАрр::ОnEditPaste().
  • Вернитесь к файлу СМуАрр.срр. Если он закрыт, откройте его, дважды щелкнув значок функции
    OnEditPaste() в окне ClassView (находится под значком класса СМуАррАрр).
  • Практически в самом верху файла СМуАрр.срр находится карта сообщений:
    BEGIN_MESSAGE_MAP(CMyAppApp, CWinApp)
    	//{{AFX_MSG_MAP(CMyAppApp)
    	ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
    	ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
    	//}}AFX_MSG_MAP
    	// Стандартные команды для работы с файлами документов
    	ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
    	ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
    	// Стандартная команда настройки принтера
    	ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
    END_MESSAGE_MAP()
    

   
Как видите, ClassWizard добавил в карту сообщений макрос ON_COMMAND. Его структура очень проста.
Первый параметр -это идентификатор сообщения. Второй параметр - название функции-обработчика.

   
Объявление функции OnLButtonDown(), обрабатывающей сообщение WM_ LBUTTONDOWN, выглядит следующим образом
(оно находится в файле MyAppView.h):

	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

   
Соответствующая ей запись в карте сообщений в файле AppView.cpp такова:

	ON_WM_LBUTTONDOWN()

Текст измененного на этом шаге приложения можно взять здесь (41,3 Кб).

   
Так как сообщения Windows обрабатываются перегруженными виртуальными функциями базового класса CWnd, нет
необходимости передавать название обработчика в качестве параметра. Каркас MFC-приложения автоматически связывает такие
сообщения с соответствующей виртуальной функцией. Как правило, сообщения Windows имеют дополнительную информацию,
передаваемую в виде параметров. Все эти данные передаются в обработчик каркасом приложения. Внимательно посмотрите на объявление функции
CMyApp::OnLButtonDown. Наверняка Вы заметили, что она принимает два параметра (производные от параметров сообщения
WM_LBUTTONDOWN), один из которых содержит координаты текущего положения указателя мыши, а другой - флаг, который "отвечает"
за нажатие "виртуальных" клавиш (например CTRL или SHIFT).

   
На следующем шаге мы рассмотрим макросы, которые можно использовать в картах сообщений.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий