Обработчики для диапазонов схем сообщений

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

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

  • Диапазоны идентификаторов команд можно сопоставить с:

    • Функция обработчика команд.

    • Функция обработчика обновления команд.

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

В этой статье рассматриваются следующие темы:

Запись карты сообщений

В. Файл CPP, добавьте запись карты сообщений, как показано в следующем примере:

ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)

Запись карты сообщений состоит из следующих элементов:

  • Макрос диапазона сопоставления сообщений:

  • Параметры макроса:

    Первые два макроса принимают три параметра:

    • Идентификатор команды, запускающий диапазон

    • Идентификатор команды, заканчивающий диапазон

    • Имя функции обработчика сообщений

    Диапазон идентификаторов команд должен быть смежным.

    Третий макрос ON_CONTROL_RANGEпринимает дополнительный первый параметр: сообщение об уведомлении элемента управления, например EN_CHANGE.

Объявление функции обработчика

Добавьте объявление функции обработчика в элемент . H-файл. В следующем коде показано, как это может выглядеть, как показано ниже:

public:
   afx_msg void OnDoSomething(UINT nID);

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

Дополнительные сведения о требованиях к параметрам для обновлений функций обработчика см. в разделе "Пример диапазона идентификаторов команд".

Пример для диапазона идентификаторов команд

Если вы можете использовать диапазоны в одном примере, это обработка таких команд, как команда Zoom в примере HIERSVR MFC. Эта команда масштабирует представление, масштабируя его в диапазоне от 25% до 300% от обычного размера. Класс представления HIERSVR использует диапазон для обработки команд Масштабирования с записью карты сообщений, напоминающей следующее:

ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)

При написании записи карты сообщений необходимо указать следующее:

  • Два идентификатора команд, начиная и заканчивая непрерывным диапазоном.

    Здесь они ID_VIEW_ZOOM25 и ID_VIEW_ZOOM300.

  • Имя функции обработчика для команд.

    Вот.OnZoom

Объявление функции будет выглядеть следующим образом:

public:
   afx_msg void OnZoom(UINT nID);

Пример функций обработчика обновлений аналогичен и, скорее всего, будет более широко полезным. Это довольно распространено для записи ON_UPDATE_COMMAND_UI обработчиков для ряда команд и найти себя написать или скопировать один и тот же код снова и снова. Решение заключается в сопоставлении диапазона идентификаторов команд с одной функцией обработчика обновления с помощью ON_UPDATE_COMMAND_UI_RANGE макроса. Идентификаторы команд должны формировать непрерывный диапазон. Пример см OnUpdateZoom . в обработчике и записи ON_UPDATE_COMMAND_UI_RANGE карты сообщений в классе представления HIERSVR.

Функции обработчика обновления для отдельных команд обычно принимают один параметр, pCmdUI типа CCmdUI*. В отличие от функций обработчика, функции обработчика обновлений для диапазонов карты сообщений не требуют дополнительного параметра nID типа UINT. Идентификатор команды, который необходим для указания выбранной пользователем команды, находится в объекте CCmdUI .

Пример для диапазона идентификаторов элементов управления

Еще одним интересным случаем является сопоставление сообщений с уведомлениями об элементе управления для диапазона идентификаторов элементов управления с одним обработчиком. Предположим, что пользователь может щелкнуть любую из 10 кнопок. Чтобы сопоставить все 10 кнопок с одним обработчиком, запись карты сообщений будет выглядеть следующим образом:

ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)

При написании макроса на карте сообщений укажите следующее ON_CONTROL_RANGE :

  • Определенное сообщение об уведомлении элемента управления.

    Здесь BN_CLICKED.

  • Значения идентификатора элемента управления, связанные с непрерывным диапазоном элементов управления.

    Ниже приведены IDC_BUTTON1 и IDC_BUTTON10.

  • Имя функции обработчика сообщений.

    Вот.OnButtonClicked

При записи функции обработчика укажите дополнительный параметр UINT , как показано в следующем примере:

void CRangesView::OnButtonClicked(UINT nID)
{
   int nButton = nID - IDC_BUTTON1;
   ASSERT(nButton >= 0 && nButton < 10);
   // ...
}

Обработчик OnButtonClicked для одного сообщения BN_CLICKED не принимает параметров. Один и тот же обработчик для диапазона кнопок принимает один UINT. Дополнительный параметр позволяет определить конкретный элемент управления, ответственный за создание сообщения BN_CLICKED .

Код, показанный в примере, является типичным: преобразование значения, переданного int в диапазон сообщений, и утверждение, что это так. Затем можно предпринять несколько действий в зависимости от того, какая кнопка была нажата.

См. также

Объявление функций обработчиков сообщений