Similar presentations:
С++. Базовый уровень
1.
С++. Базовый уровеньОбработка событий в MFC: реакция на действия
пользователя, такие как нажатие кнопок и выбор элементов
из списка
2023
2.
2Обработка событий
Закрепим и систематизируем принцип обработки сообщений в MFC, с которым мы уже
ознакомились на примерах в прошлых занятиях.
События в MFC - это способ общения между элементами управления, окнами и приложением.
События возникают, когда пользователь выполняет какое-либо действие, например, нажимает
кнопку, выбирает элемент из списка, перемещает мышь или нажимает клавишу.
События передаются в виде сообщений, которые содержат информацию о типе события,
источнике события и дополнительных данных, связанных с событием.
inginirium.ru
3.
3Обработка событий
Для обработки событий в MFC используется механизм, называемый картами сообщений.
Карта сообщений - это макрос, который связывает определенный тип сообщения с функциейобработчиком, которая вызывается, когда приходит это сообщение.
Карта сообщений позволяет легко определить, какие события должны обрабатываться классом,
и какие функции должны выполняться при этих событиях.
inginirium.ru
4.
4Обработка событий
Карты сообщений обычно располагаются в реализации (.CPP) файле класса, который
обрабатывает события. Карта сообщений начинается с макроса BEGIN_MESSAGE_MAP и
заканчивается макросом END_MESSAGE_MAP.
Между этими макросами находятся записи, которые определяют, какие сообщения и какие
функции-обработчики связаны между собой.
Каждая запись состоит из макроса, который указывает тип сообщения, идентификатор
элемента управления или окна, которое отправляет сообщение, и имя функции-обработчика,
которая принимает сообщение.
Например, запись ON_BN_CLICKED(IDC_BUTTON1, &CMyDialog::OnButton1) означает, что при
нажатии на кнопку с идентификатором IDC_BUTTON1 будет вызвана функция OnButton1 класса
CMyDialog.
inginirium.ru
5.
5Обработка событий
Функции-обработчики сообщений обычно объявляются в заголовочном (.H) файле класса с
помощью макроса afx_msg.
Этот макрос не влияет на компиляцию, но помогает различать функции-обработчики от
обычных функций класса. Функции-обработчики сообщений могут принимать различные
параметры в зависимости от типа сообщения.
Например, функция-обработчик нажатия на кнопку принимает два параметра: UINT nID,
который указывает идентификатор кнопки, и CWnd* pWnd, который указывает указатель на
окно, которому принадлежит кнопка.
Функция-обработчик перемещения мыши принимает три параметра: UINT nFlags, который
указывает состояние кнопок мыши и клавиш Shift, Ctrl и Alt, CPoint point, который указывает
координаты курсора мыши, и CWnd* pWnd, который указывает указатель на окно, над которым
находится курсор.
inginirium.ru
6.
6Обработка событий
Для примера рассмотрим следующую задачу: создать диалоговое окно с двумя кнопками и
списком. При нажатии на первую кнопку добавить в список текст, введенный в поле ввода. При
нажатии на вторую кнопку удалить из списка выбранный элемент. При выборе элемента из
списка вывести его текст в поле ввода.
Для решения этой задачи нам понадобятся следующие элементы:
- Диалоговое окно, которое будет наследоваться от класса CDialog.
- Поле ввода, которое будет наследоваться от класса CEdit.
- Две кнопки, которые будут наследоваться от класса CButton.
- Список, который будет наследоваться от класса CListBox.
inginirium.ru
7.
7Обработка событий
Для создания диалогового окна мы можем использовать мастер диалогов, который позволяет
визуально разместить элементы управления на диалоговом окне и задать их свойства. Мастер
диалогов также создает класс для диалогового окна и добавляет в него необходимые объявления
и реализации. Для этого примера мы назовем класс диалогового окна CMyDialog и зададим ему
следующие свойства:
- Caption: "Пример событий в MFC"
- ID: IDD_MYDIALOG
- Style: Modal
- Border: Dialog Frame
- System Menu: True
- Minimize Button: False
- Maximize Button: False
inginirium.ru
8.
8Обработка событий
Для создания поля ввода мы можем использовать инструмент Edit Control, который позволяет
разместить поле ввода на диалоговом окне и задать его свойства. Для этого примера мы назовем
поле ввода m_Edit и зададим ему следующие свойства:
- ID: IDC_EDIT
- Text: ""
- Style: Child, Visible, Tabstop
- Border: True
- Align Text: Left
inginirium.ru
9.
9Обработка событий
Для создания кнопок мы можем использовать
инструмент Button Control, который позволяет
разместить кнопки на диалоговом окне и задать
их свойства. Для этого примера мы назовем
кнопки m_Add и m_Delete и зададим им
следующие свойства:
- ID: IDC_ADD и IDC_DELETE
- Text: “Добавить” и “Удалить”
- Style: Child, Visible, Tabstop
- Align Text: Center
Для создания списка мы можем использовать
инструмент List Box Control, который позволяет
разместить список на диалоговом окне и задать его
свойства. Для этого примера мы назовем список m_List
и зададим ему следующие свойства:
- ID: IDC_LIST
- Text: “”
- Style: Child, Visible, Tabstop, Has Strings, Notify
- Selection: Single
inginirium.ru
10.
10Обработка событий
После создания элементов управления на диалоговом окне мы можем добавить переменные-члены
класса CMyDialog для каждого элемента управления с помощью мастера добавления переменных.
Для этого щелкните правой кнопкой мыши элемент управления, выберите команду Добавить
переменную и введите имя переменной. Например, для поля ввода мы можем добавить
переменную m_strText типа CString, для списка мы можем добавить переменную m_List типа
CListBox, а для кнопок мы можем добавить переменные m_Add и m_Delete типа CButton.
Теперь мы можем добавить обработчики сообщений для элементов управления с помощью мастера
добавления функций.
Для этого щелкните правой кнопкой мыши элемент управления, выберите команду Добавить
функцию и выберите тип сообщения и имя функции. Например, для кнопки m_Add мы можем
добавить обработчик сообщения BN_CLICKED с именем OnAdd, для списка мы можем добавить
обработчик сообщения LBN_SELCHANGE с именем OnSelChange, а для диалогового окна мы можем
добавить обработчик сообщения WM_INITDIALOG с именем OnInitDialog.
inginirium.ru
11.
11Обработка событий
В обработчиках сообщений мы можем написать код, который будет
реагировать на действия пользователя!
Например, в обработчике OnAdd мы можем добавить текст из поля ввода в список, в обработчике
OnSelChange мы можем вывести текст выбранного элемента в поле ввода, а в обработчике
OnInitDialog мы можем инициализировать элементы управления.
inginirium.ru
12.
12Обработка событий
// Обработчик сообщения WM_INITDIALOG
BOOL CMyDialog::OnInitDialog(){
CDialog::OnInitDialog();
// Инициализируем поле ввода
m_Edit.SetLimitText(50); // Ограничиваем длину текста 50 символами
m_Edit.SetWindowText(_T("")); // Очищаем текст
// Инициализируем список
m_List.ResetContent(); // Очищаем список
m_List.SetCurSel(-1); // Снимаем выделение
// Инициализируем кнопки
m_Add.EnableWindow(TRUE); // Включаем кнопку "Добавить"
m_Delete.EnableWindow(FALSE); // Выключаем кнопку "Удалить"
return TRUE; // Возвращаем TRUE, если фокус не установлен на элемент управления
}
inginirium.ru
13.
13Обработка событий
// Обработчик сообщения BN_CLICKED для кнопки m_Add
void CMyDialog::OnAdd(){
// Получаем текст из поля ввода
m_Edit.GetWindowText(m_strText);
// Проверяем, что текст не пустой
if (!m_strText.IsEmpty()){
m_List.AddString(m_strText);// Добавляем текст в список
m_Edit.SetWindowText(_T(""));// Очищаем текст в поле ввода
if (m_List.GetCount() > 0){
m_Delete.EnableWindow(TRUE);// Включаем кнопку "Удалить", если список не пустой
}
}
}
inginirium.ru
14.
14Обработка событий
// Обработчик сообщения BN_CLICKED для кнопки m_Delete
void CMyDialog::OnDelete(){
int nSel = m_List.GetCurSel(); // Получаем индекс выбранного элемента в списке
// Проверяем, что индекс действителен
if (nSel != LB_ERR){
m_List.DeleteString(nSel);// Удаляем элемент из списка
m_Edit.SetWindowText(_T(""));// Очищаем текст в поле ввода
// Выключаем кнопку "Удалить", если список пустой
if (m_List.GetCount() == 0){
m_Delete.EnableWindow(FALSE);
}
}
}
inginirium.ru
15.
15Обработка событий
// Обработчик сообщения LBN_SELCHANGE для списка m_List
void CMyDialog::OnSelChange(){
int nSel = m_List.GetCurSel();// Получаем индекс выбранного элемента в списке
if (nSel != LB_ERR){// Проверяем, что индекс действителен
m_List.GetText(nSel, m_strText);// Получаем текст выбранного элемента
m_Edit.SetWindowText(m_strText);// Выводим текст в поле ввода
}
}
inginirium.ru