Шаг 258 - Контейнер обрабатывает события от ActiveX

В прошлом шаге мы с Вами добавили на диалоговую панель элемент управления Grid. Теперь давайте научимся в нашей программе обрабатывать события от него. Нажмите правой кнопкой мыши на элементе управления и вызовите ClassWizard.

258.gif (13650 b)

После добавления события Вы увидите, что добавлено в коде.

BEGIN_EVENTSINK_MAP(CTest2Dlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CTest2Dlg)
	ON_EVENT(CTest2Dlg, IDC_MSFLEXGRID1, -605 /* MouseDown */,
		OnMouseDownMsflexgrid1, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CTest2Dlg::OnMouseDownMsflexgrid1(short Button, 
		short Shift, long x, long y) 
{
	AfxMessageBox("Grid");	
}

AfxMessageBox() я добавил сам. Как видите обработчик событий немного другой. Когда внедренный элемент управления инициализирует событие контейнер получает сообщения через механизм именуемый event sink map, который поддерживает MFC. То, что делает Class Wizard можно разделить по шагам.

Первое - это добавляются макросы обработки сообщений от элементов управления.

// h file
class CTest2Dlg : public CDialog
{
	......
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_EVENTSINK_MAP()
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

// cpp file
BEGIN_EVENTSINK_MAP(CTest2Dlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CTest2Dlg)
    //}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

С этого момента контейнер умеет обрабатывать сообщения от ActiveX элемента.

Второй шаг - это описание сообщений, на которые будет реагировать контейнер.

// h file
class CTest2Dlg : public CDialog
{
	......
	afx_msg HCURSOR OnQueryDragIcon();
	afx_msg void OnMouseDownMsflexgrid1(short Button,
		 short Shift, long x, long y);
	DECLARE_EVENTSINK_MAP()
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

// cpp file
BEGIN_EVENTSINK_MAP(CTest2Dlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CTest2Dlg)
	ON_EVENT(CTest2Dlg, IDC_MSFLEXGRID1, -605 /* MouseDown */,
		 OnMouseDownMsflexgrid1, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
    //}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CTest2Dlg::OnMouseDownMsflexgrid1(short Button,
		 short Shift, long x, long y) 
{
	AfxMessageBox("Grid");	
}

Осталось посмотреть, что такое ON_EVENT. Это макрос обработки сообщения. Вот его параметры.

ON_EVENT( theClass, id, dispid, pfnHandler, vtsParams )
	theClass   -  класс, которому принадлежит карта обработки сообщений
	id	   -  идентификатор элемента ActiveX	
	Dispid     -  идентификатор события элемента ActiveX
	PfnHandler -  указатель на функцию обработки
	VtsParams  -  последовательность VTS_ констант,
		 который определяет типы параметров для сообщения

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