Макрос ON_COMMAND_RANGE используется для того, чтобы вы могли использовать одну функцию для обработки целого диапазона команд.
ON_COMMAND_RANGE( id1, id2, memberFxn) id1 Первый идентификатор диапазона id2 Последний идентификатор диапазона memberFxn Функция вызываемая при выборе пункта меню
Следует учесть, что ClassWizard не умеет работать с диапазонами и нам придется самим писать обработку этого диапазона. Давайте попробуем. Создаем проект на основе AppWizard и именем TestRange. Пусть он будет SDI и сразу жмем Finish. Создаем пункт меню Test с пунктами меню Menu1,Menu2,Menu3.
Вопрос: будут ли эти пункты в меню идти по порядку ???? Будут, если мы их создавали сразу подряд. Давайте посмотрим в 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); }
Что Вы увидите при запуске приложения и выбору пунктов меню ??? Будет окно с идентификатором. Смысл такой, мы можем используя диапазоны обработчика команд обрабатывать в одной функции вызовы из разных мест, при этом точно зная кто вызвал эту функцию.