C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 258 - Контейнер обрабатывает события от ActiveX / MFC шаг за шагом / Visual C++

Шаг 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_ констант,
		 который определяет типы параметров для сообщения

| |
Автор Каев Артем.
[AD]