Читайте также:
|
|
Каждое сообщение, явно обрабатываемое в программе, должно быть связано с одним из обработчиков. Обработчик - это член-функция класса, принимающего сообщения. Прототипы для обработчиков всех сообщений заранее заданы в MFC. Как правило, имя обработчика состоит из имени сообщения и префикса On. Например, обработчик сообщения WM_CHAR называется OnChar(), а для WM_LBUTTONDOWN - OnLButtonDown(). Последнее сообщение генерируется при нажатии левой кнопки мыши.
Например, объявим класс с обработчиком сообщения WM_PAINT. Это сообщение посылается окну, когда оно должно перерисовать свою клиентскую область.
Class CMainWin: public CFrameWnd { public: CMainWin(); afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() }Спецификатор afx_msg означает объявление обработчика сообщения. На данный момент он не используется и представляет собой пустой макрос. Но в будущем возможны расширения. Поэтому использование спецификатора нужно считать обязательным.
Для каждого обработчика должна быть описана его реализация. В ней могут производиться самые разные действия, которые требуются по логике работы программы.
Пример программы с обработкой сообщений
Рассмотрим программу, которая реагирует на нажатие левой и правой кнопок мыши в клиентской области окна, а также на нажатие клавиш. При нажатии левой кнопки в клиентскую область окна, начиная с текущих координат курсора мыши, выводится строка "Нажата левая кнопка", а при нажатии правой кнопки - "Нажата правая кнопка".
При нажатии на левую и правую кнопки соответственно генерируются сообщения WM_LBUTTONDOWN и WM_RBUTTONDOWN, и им соответствуют обработчики с прототипами:
afx_msg void OnLButtonDown(UINT Flags, CPoint Loc); afx_msg void OnRButtonDown(UINT Flags, CPoint Loc);Первый параметр указывает на то, была ли при генерации сообщения нажата какая-нибудь клавиша или кнопка мыши. Этот параметр нас не будет пока интересовать. Второй параметр определяет координаты курсора мыши во момент нажатия кнопки. Класс CPoint порождается от структуры POINT, определенной так:
typedef struct tagPOINT { LONG x; LONG y; } POINT;Таким образом, мы легко можем определить координаты для вывода текстовой строки.
Обработчик сообщения WM_CHAR имеет прототип:
afx_msg void OnChar(UINT Char, UINT Count, UINT Flags);Нас здесь будет интересовать только первый параметр. Он представляет собой ASCII-код символа, соответствующего нажатой клавише. При нажатии несимвольных клавиш сообщение WM_CHAR не посылается.
Дата добавления: 2015-07-20; просмотров: 149 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Исходные тексты примера | | | Сообщение WM_PAINT |