http://tikitak.narod.ru ---- Главная страница сайта
Шаг 75 - Команды и сообщения
Windows от DOS отличается многими вещами. Но одно из отличий это наличие в Windows сообщений. Если в Dos программа сама должна была опрашивать все устройтсва, например, мышь и клавиатуру, то в Windows это делает операционная система и передает программе (окну) сообщения. Забота программиста обработать эти сообщения и его уже не заботит, как они получены. В Windows с устройствами работают драйвера вертуальных устройств VXD. Их функционирование забота производителя. Вам уже не надо считывать буфер клавиатуры или перехватывать прерывания мышки. Ваша программа просто ждет когда её известят о событии. Известят сообщением.
Обычное программирование на C для Windows превращается в сплошную обработку операторов switch. MFC берет на себя всю черную работу позволяя Вам сконцентрироваться на обработке.
Идентификация сообщений в MFC производиться целыми числами с использованием define. Вот часть файла Winuser.h с определением сообщений.
....
#define WM_MOUSEFIRST 0x0200
#define WM_MOUSEMOVE 0x0200
#define WM_LBUTTONDOWN 0x0201
#define WM_LBUTTONUP 0x0202
#define WM_LBUTTONDBLCLK 0x0203
#define WM_RBUTTONDOWN 0x0204
....
Как видите сообщения поступающие от Windows имеют префикс WM_.
В MFC для обработки сообщений принято использование карты сообщений Message Map. Эту карту сообщений имеют все классы порожденные от CCmdTarget. И не просто имеют, а должны иметь обязательно.
Карта сообщений описывается в заголовочном файле с описанием класса отвественного за её обработку.
....
// Описание функций откликов на сообщения
// Generate message map function
// {{AFX_MSG(CMyDialog)
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
...........
//}}AFX_MSG
// Декларация наличия карты обработки сообщения
DECLARE_MESSAGE_MAP()
И в файле реализации связывая сообщение с непосредсвенной функцией, которая будет выполняться по его поступлению.
BEGIN_MESSAGE_MAP((CMyDialog,CDialog)
//{{AFX_MSG_MAP(CMyDialog)
.....
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_BN_CLICKED(IDC_EDIT,OnEdit)
.......
//}}AFX_MSG
END_MESSAGE_MAP()
Коментарии AFX_MSG позволяют ClassWizard быстро ориентироваться в карте обработки для вставки сообщений. ON_WM_.... это макрос для обработки сообщения.
Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|