На этом шаге мы рассмотрим обработку сообщений от элемента управления.
Функция ОnОК(), реализации которой посвящен предыдущий шаг, представляет собой пример обработчика уведомляющего сообщения от элемента управления. Посредством уведомляющих сообщении элементы управления и прочие дочерние окна оповещают родительское окно о том, что между пользователем и этим элементом произошел обмен информацией. Функция ОnОК() обрабатывает сообщение BN_CLICKED, посылаемое в диалоговое окно в качестве параметра сообщения WM_COMMAND, когда пользователь щелкает кнопку ОК.
С разными типами элементов управления связаны разные наборы уведомляющих сообщений. В ClassWizard имеется средство обработки любых уведомляющих сообщений, исходящих от элементов управления диалогового окна. Чтобы увидеть весь список этих сообщений, щелкните вкладку Message Maps мастера и выберите в поле Class Name имя класса диалога, а затем в списке Object IDs щелкните идентификатор элемента управления. Перечень уведомляющих сообщений, которые могут быть сгенерированы выбранным элементом управления, появится в поле Messages. Краткое пояснение для выделенного сообщения высвечивается в поле Description внизу вкладки.
На рисунке 1 показана вкладка Message Maps диалогового окна MFC ClassWizard и список уведомляющих сообщений для поля ввода (имеющего в данном случае идентификатор IDC_USERID).
Рис.1. Применение ClassWizard для обработки уведомляющих сообщений от элемента управления
Идентификаторы уведомляющих сообщений имеют префиксы, состоящие из аббревиатуры названия типа элемента управления и символов N_.
Префикс идентификатора уведомляющего сообщения | Тип элемента управления |
---|---|
BN_ | Кнопка (button) |
CBN_ | Поле со списком (combo box) |
CLBN_ | Список с флажками (check list box) |
EN_ | Поле ввода (edit control) |
LBN_ | Список (list box) |
STN_ | Статический текст (static text control) |
ClassWizard автоматически вставит в карту сообщений записи для обработки уведомляющего сообщения для каждого перечисленного типа элемента управления. Имя макроса формируется из приставки ON_ и идентификатора сообщения. Например, при создании обработчика уведомляющего сообщения EN_UPDATE для поля ввода IDC_USERID (рисунок 1) в карту сообщений будет добавлена запись, аналогичная приведенной ниже:
ON_EN_UPDATE(IDC_USERID, OnUpdateUserid)
В MFC средствами макросов ON_CONTROL и ON_NOTIFY можно организовать обработку нестандартных сообщений. ClassWizard применяет макрос ON_NOTIFY для обработки уведомлений от новь стандартных элементов управления, появившихся в более поздних версиях Windows.
Добавим функцию-обработчик для уведомляющего сообщения, генерируемого при изменении выбранной строки в списке Data Source. С помощью функции-обработчика отобразим справочную информацию для выбранной строки в поле под списком. Сначала потребуется создать переменную CEdit, представляющую в программе элемент управления "поле ввода".
Рис.2. Добавление переменной m_editDesc
Рис.3. Добавление функции OnSelchangeDsnlist
int nCursel = m_lbDSN.GetCurSel();
switch(nCursel)
{
case 0 : m_editDesc.SetWindowText("Accounting Data"); break;
case 1 : m_editDesc.SetWindowText("Administration Data"); break;
case 2 : m_editDesc.SetWindowText("Management Data"); break;
}
Рис.4. Текст функции OnSelchangeDsnlist
Текст измененного приложения можно взять здесь (51,1 Кб).
На следующем шаге мы рассмотрим активизацию и блокировку элементов управления.