Шаг 245 - Использование диапазонов в обработчике команд

Макрос ON_COMMAND_RANGE используется для того, чтобы вы могли использовать одну функцию для обработки целого диапазона команд.

ON_COMMAND_RANGE( id1, id2, memberFxn) 
id1		Первый идентификатор диапазона
id2		Последний идентификатор диапазона
memberFxn	Функция вызываемая при выборе пункта меню

Следует учесть, что ClassWizard не умеет работать с диапазонами и нам придется самим писать обработку этого диапазона. Давайте попробуем. Создаем проект на основе AppWizard и именем TestRange. Пусть он будет SDI и сразу жмем Finish. Создаем пункт меню Test с пунктами меню Menu1,Menu2,Menu3.

245.gif (1606 b)

Вопрос: будут ли эти пункты в меню идти по порядку ???? Будут, если мы их создавали сразу подряд. Давайте посмотрим в Resource.h.

#define ID_TEST_MENU1                   32771
#define ID_TEST_MENU2                   32772
#define ID_TEST_MENU3                   32773

Значит можно использовать диапазон. Давайте добавим функцию для класса вида, которая будет вызываться в момент выбора этих пунктов меню.

///////////////////////////////////////////
// CTestRangeView message handlers
void CTestRangeView::onColor(UINT nID)
{

}

Эта функция обычная за исключением того, что в эту функцию будет передан идентификатор объекта(в данном случае пункта меню), который вызвал эту функцию. Ну вот пора написать и макрос обработки.

BEGIN_MESSAGE_MAP(CTestRangeView, CView)
	......
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
	ON_COMMAND_RANGE(ID_TEST_MENU1,ID_TEST_MENU2,OnColor)
END_MESSAGE_MAP()

Изменим и саму функцию для тестирования:

void CTestRangeView::onColor(UINT nID)
{
	CString s;
	s.Format("%d",nID); 
	AfxMessageBox(s);
}

Что Вы увидите при запуске приложения и выбору пунктов меню ??? Будет окно с идентификатором. Смысл такой, мы можем используя диапазоны обработчика команд обрабатывать в одной функции вызовы из разных мест, при этом точно зная кто вызвал эту функцию.


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