На этом шаге мы рассмотрим обработку сообщений от элемента управления.
Функция О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_.
Таблица 1. Префиксы идентификаторов уведомляющих сообщений от элемента управления
Префикс идентификатора уведомляющего сообщения | Тип элемента управления |
---|---|
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)
Примечание.
Уведомляющие сообщения BN_CLICKED кнопок с идентификаторами IDОК и IDCANCEL
обрабатываются в перегруженных версиях виртуальных функций CDialog::OnOK() и CDialog:: OnCancel().
Записи в карте сообщений появятся лишь в случае, если функции, обрабатывающих эти сообщения, имеют другие имена.
В большинстве случаев рекомендуется использовать имена ОnОК и OnCancel.
В MFC средствами макросов ON_CONTROL и ON_NOTIFY можно организовать обработку
нестандартных сообщений. ClassWizard применяет макрос ON_NOTIFY для обработки уведомлений
от новь стандартных элементов управления, появившихся в более поздних версиях Windows.
Добавим функцию-обработчик для уведомляющего сообщения, генерируемого при изменении выбранной строки в
списке Data Source. С помощью функции-обработчика отобразим справочную информацию для выбранной
строки в поле под списком. Сначала потребуется создать переменную CEdit, представляющую в программе
элемент управления "поле ввода".
- Добавление переменной-члена CListBox.
- Откройте ClassWizard, нажав CTRL+W. Щёлкните вкладку Member Variables.
- В списке Class name выберите CConnectDialog.
- В списке Control IDs укажите IDC_DESCRIPTION. Щелкните Add Variable.
- В поле Member variable name введите m_editDesc.
- В списке Category установите Control. Щелкните OK, чтобы добавить переменную.
Рис.2. Добавление переменной m_editDesc - Щелкните ОК, чтобы закрыть ClassWizard.
- Добавление обработчика OnSelChangeDsnlist().
- Откройте ClassWizard, нажав CTRL+W. Щёлкните вкладку Message Maps.
- В списке Object IDs выберите IDC_DSNLIST, затем в списке Messages щелкните
LBN_SELCHANGE. - Щелкните Add Function. Примите OnSelchangeDsnlist в качестве имени функции.
Рис.3. Добавление функции OnSelchangeDsnlist - Щелкните кнопку Edit Code. Замените строку комментария // TODO следующим кодом:
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; }
Обратите внимание, что текст выводится в поле с помощью функции CWnd::SetWindowText().
Рис.4. Текст функции OnSelchangeDsnlist - Соберите и запустите приложение МуАрр. Убедитесь в том, что поясняющий текст в диалоговом окне
Connect to Data Source меняется в зависимости от выбираемой строки в списке Data Source.
Текст измененного приложения можно взять здесь (51,1 Кб).
На следующем шаге мы рассмотрим активизацию и блокировку элементов управления.