Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РГЗ_алгоритмзация_та_програмування_Неласа.doc
Скачиваний:
8
Добавлен:
12.11.2019
Размер:
1.5 Mб
Скачать

2.1.2 Карти повідомлень

Використовування карти повідомлень лежить в основі підходу, який реалізується в MFC для програмування Windows-додатків. Суть його полягає в тому, що від розробника вимагається тільки написати функції обробки повідомлень і включити в свій клас карту повідомлень, яка фактично визначає оброблювані повідомлення.

Карта повідомлень формується автоматично при створенні додатку майстром. Згодом, при необхідності, її можна відредагувати уручну. Для цього необхідно знати призначення основних макросів карти повідомлень.

2.1.3 Макроси карт повідомлень

  • DECLARE_MESSAGE_MAP – використовується у файлі заголовка для оголошення карти повідомлень;

  • BEGIN_MESSAGE_MAP – початок карти повідомлень в тексті програми;

  • END_MESSAGE_MAP – кінець карти повідомлень в тексті програми;

  • ON_COMMAND – перенаправлення обробки деякої команди функції-члену класу;

  • ON_CONTROL – перенаправлення обробки коду сповіщення від елемента управління, введеного програмістом, функції-члену класу;

  • ON_MESSAGE – перенаправлення обробки деякого повідомлення, введеного програмістом, функції-члену класу;

  • ON_NOTIFY – перенаправлення функції-члену класу обробки заданого коду сповіщення, який супроводиться додатковими даними від елемента управління.

2.2 Хід виконання роботи

2.2.1 Створення пробного додатку

Для наочної роботи з обробкою повідомлень і картами повідомлень заздалегідь необхідно створити простий діалоговий додаток. Назвемо його Dialog. При створенні можна прибрати прапорець ActiveX Controls оскільки необхідності використовувати ActiveX об'єкти в даній лабораторній роботі немає, а програмний код стає простіше і наглядніше.

2.2.2 Додавання деталей проекту, створення повідомлень

Відкриємо на вкладці Resource View Dialog.rc\Dialog\IDD_DIALOG_DIALOG [Английский (США)] та відредагуємо зовнішній вигляд додатку (рис. 2.1).

Рисунок 2.1 – Редагування зовнішнього вигляду додатку

Розмістимо елементи:

  • Listbox, ідентифікатор залишимо за замовченням IDC_LIST1;

  • Edit control з ідентифікатором IDC_EDIT1;

  • дві кнопки Button з заголовками Add String та Delete String та ідентифікаторами IDC_BUTTON1 та IDC_BUTTON2;

  • CheckBox Control з заголовком Select all strings та ідентифікатором IDC_CHECK1.

Додамо функції, що будуть обробляти події, за допомогою команди контекстного меню «Add Event Handler».

В цьому вікні справа знаходиться список класів і об'єктів, доступних для створення заголовків; зліва для кожного конкретного класу або об'єкту виводиться список доступних повідомлень або подій, та зліва внизу ім'я функції, що буде обробляти подію.

  • Для IDC_BUTTON1, подія BN_CLICKED, ім'я OnButton1;

  • для IDC_EDIT1, подія ON_CHANGE, ім'я OnChangeEdit1;

  • для IDC_BUTTON2, подія BN_CLICKED, ім'я OnButton2;

  • для IDC_CHECK1, подія BN_CLICKED, ім'я OnCheck1.

Кнопка Add&Edit створює функцію та відкриває текст програми для редагування. Додамо в нього текст функцій (лістинг 2.1).

void CDialogDlg::OnButton1()

{

m_ListBox.AddString(m_EditStr); //Додаємо рядок, що введений у поле Edit

}

void CDialogDlg::OnChangeEdit1()

{

UpdateData(TRUE);

}

void CDialogDlg::OnButton2()

{

int nIndex = m_ListBox.GetSelCount(); //Підраховує кількість виділених елементів

int i;

CArray <int, int> aryListBoxSel; //Ініциалізація масиву

aryListBoxSel.SetSize(nIndex); //Задамо розмірність масива

//Отримуємо індекси виділених елементів

m_ListBox.GetSelItems(nIndex, aryListBoxSel.GetData());

for(i=aryListBoxSel.GetSize()-1; i>=0; i--)

//Видаляємо виділені рядки

m_ListBox.DeleteString(aryListBoxSel.GetAt(i));

}

void CDialogDlg::OnCheck1()

{

int Items, i;

Items = m_ListBox.GetCount(); //Отримуємо кількість елементів у списку

for(i=0; i<=Items; i++)

m_ListBox.SetSel(i); //Відмічаємо кожний елемент у циклі

}

Лістинг 2.1 – Функції обробки подій

Зверніть увагу на карту повідомлень що буда згенерована автоматично у файлі з початковим кодом класу діалогового вікна. Вона зв'язує події та функції їх обробки (лістинг 2.2).

BEGIN_MESSAGE_MAP(CDialogDlg, CDialog)

//{{AFX_MSG_MAP(CDialogDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BUTTON1, OnButton1)

ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)

ON_BN_CLICKED(IDC_BUTTON2, OnButton2)

ON_BN_CLICKED(IDC_CHECK1, OnCheck1)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

Лістинг 2.2 – Карта повідомлень

Відкомпілюємо проект та перевіримо як працює програма (рис. 2.2)

Рисунок 2.2 – Результат роботи програми