Шаг 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_.... это макрос для обработки сообщения.

75_1.gif (10484 b)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 03.01.2000