Реакция окна на уведомляющие сообщения
Перейдите в окно LookDlg.cpp и найдите в карте сообщений новый элемент:
ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN, OnDeltaposSpin)
Который был вставлен инструментом ClassWizard и который означает, что если окну диалога, управляемому классом CLookDlg, придет сообщение UDN_DELTAPOS (Up-Down Notification) от элемента с идентификатором IDC_SPIN, то управление будет передано функции-обработчику OnDeltaposSpin. Теперь в конце файла найдите эту функцию:
void CLookDlg::OnDeltaposSpin(NMHDR *pNMHDR, LRESOLT *pResult) { NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR; // TODO: Add your control notification handler code here *pResult = 0; }
Вот здесь происходит то, о чем было сказано выше. Указатель PNMHDR приводится к типу указателя на более сложную структуру NM_UPDOWN. Это нужно для того, чтобы достать из нее необходимую информацию. Теперь с помощью указателя pNMUpDown мы можем добыть требуемое приращение показаний счетчика (pNMUpDown › iDelta). Вместо комментария // TODO: вставьте следующий фрагмент кода:
//====== Вычисляем желаемую позицию int nPos = m_Spin.GetPos() + pNMUpDown › iDelta; //====== Если она вне допустимых пределов, то уходим if (nPos < 0 || m_nltems <= nPos) return; //====== Корректируем позицию ползунка m_Slider.SetPos(nPos); //====== Расшифровываем код ошибки Getlnfo(nPos); //====== Вызываем обмен данными с элементами окна диалога UpdateData(FALSE);
Здесь уместно напомнить, что Studio .NET 7.0, как и Visual Studio 6, позволяет форматировать введенный текст так, как это принято в сообществе разработчиков. Выделите весь код функции и дайте команду Edit › Advanced › Format Selection или ALT + F8.
В коде мы используем данные (m_Spin, m_nltems, m_Slider) и метод (Getlnfо), которых еще нет в классе, но вы, наверное, имеете некоторый опыт программирования и знаете, что разработка часто идет в обратном порядке. Введем эти элементы в состав класса позже, а сейчас дадим оценку того, что только что сделали. С помощью ClassWizard мы ввели в класс главного окна обработку уведомляющего сообщения UDN_DELTAPOS, работающего по схеме WM_NOTIFY. Теперь введем обработку сообщения EN_CHANGE, поступающего от окна редактирования IDC_FIND каждый раз, когда в нем происходят изменения. Это сообщение работает по старой схеме и не влечет за собой необходимости преобразовывать указатели на структуры данных.
- Вновь откройте шаблон диалога и установите курсор мыши в окно IDC_FIND.
- В окне Properties нажмите кнопку с подсказкой ControlEvents.
- В появившемся списке уведомляющих сообщений, которые генерирует окно редактирования, выберите сообщение EN_CHANGE и его реализацию <Add>.
Проверьте результаты работы ClassWizard. Они должны быть видны в трех разных местах вашего приложения. В файле LookDlg.h должен появиться прототип функции обработки:
void OnChangeFind (void);
В файле LookDlg.cpp должен появиться новый элемент карты сообщений:
ON_EN_CHANGE(IDC_FIND, OnChangeFind)
И заготовка тела функции обработки, в которую мы должны внести свою функциональность:
void CLookDlg::OnChangeFind(void) { // TODO: Если это RICHEDIT control, то он не пошлет // уведомления пока вы не дадите своей версии функции // CDialog::OnInitDialog() и не сделаете вызов функции // CRichEditCTRL().SetEventMask() с флагом ENM_CHANGE, // включенным с помощью операции побитового ИЛИ. // TODO: Здесь вставьте код обработки уведомления. }