Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практична робота № 2.docx
Скачиваний:
3
Добавлен:
17.11.2019
Размер:
51.34 Кб
Скачать

ПРАКТИЧНА РОБОТА №2

ОБРОБКА ПОВІДОМЛЕНЬ

Мета роботи: Розібратися з механізмом обробки повідомлень Windows. Навчитися створювати і відладжувати прості програми, оброблювальні повідомлення.

2.1 ТЕОРЕТИЧНІ ВІДОМОСТІ

2.1.1 Загальні відомості про обробку повідомлень

Програми під Windows в корені відрізняються від програм під Dos. Основою програмування під Windows є використання API-функцій (Application Programming Interface - програмний інтерфейс програми) подання ОС. Додаток для Windows на основі Visual C + + можна розробляти з використанням класів бібліотеки MFC (Microsoft Foundation Classes - бібліотека базових класів Microsoft).

Програма в Windows управляється повідомленнями. Повідомлення є тим засобом, за допомогою якого операційна система може дати знати додатку про те, що відбулася якась дія, наприклад натиснення на кнопку, переміщення миші і т.д.

Повідомленню відомо, для якого вікна воно призначено. Воно може мати до двох параметрів.

Обробка повідомлень виконується різними компонентами операційної системи і додатку. Наприклад, коли користувач пересуває мишу по полю вікна, формується повідомлення WM MOUSEMOVE, яке передається вікну, а вікно, у свою чергу, передає це повідомлення операційній системі.

MFC бере на себе значну частину роботи по обробці повідомлень і дозволяє помітно полегшити розподіл повідомлень між різними класами об'єктів, на рівні яких і буде проводитися їх обробка.

2.1.2 Обробка повідомлень

Оскільки Windows є ОС орієнтованої на повідомлення, велика частина програмування під Wndows є написання обробників повідомлень.

Типи повідомлень MFC

Всі можливі повідомлення розділені на 3 основні категорії:

- Повідомлення Windows. Повідомлення, що починаються із префікса WM_, за винятком WM_COMMAND. Це повідомлення Windows для обробки вікнами і уявленнями;

- Сповіщення елементів управління. Повідомлення від елементів управління та інших дочірніх вікон своїм «батькам». Причому елемент керування посилає своєму батькові повідомлення WM_COMMAND, що містить конкретний код повідомлення. Наприклад, елемент управління BUTTON посилає повідомлення BN_CLICKED;

- Командні повідомлення (команди). Всі повідомлення WM_COMMAND від об'єктів інтерфейсу користувача (меню, кнопки панелей інструментів, командні клавіші.

Повідомлення перших двох категорій призначені для об'єктів класів, утворених від CWnd, тобто мають дескриптор вікна Windows. Обробка повідомлень третьої категорії може проводитися безліччю об'єктів, які мають документи, шаблони документів, об'єкт-додаток.

2.1.3 Таблиця повідомлень

Бібліотека MFC пропонує програмну модель, оптимізовану для програмування, заснованого на повідомленнях. Ця модель являє собою карту (таблицю) повідомлень (message maps), яка використовується, щоб призначити функції-обробники повідомлення для конкретного класу.

Ця модель в загальному краще використання віртуальних функцій з таких міркувань:

- Вийде дуже громіздка віртуальна таблиця,

- Обробники повідомлень про команди меню і клацаннях по кнопках панелей інструментів не визначиш в базовому класі вікна, тому що вони можуть відрізнятися.

Таблиця повідомлень містить один або більше макросів, які специфікують - яке повідомлення буде оброблятися якою функцією. Наприклад:

BEGIN_MESSAGE_MAP( CMyDoc, CDocument )

//{{AFX_MSG_MAP( CMyDoc )

ON_COMMAND( ID_MYCMD, OnMyCommand )

// ... More entries to handle additional commands

//}}AFX_MSG_MAP

END_MESSAGE_MAP( )

Таблиця повідомлень зазвичай створюється ClassWizard а не вручну.

Для визначення карти повідомлень використовується три макросу: BEGIN_MESSAGE_MAP, END_MESSAGE_MAP, DECLARE_MESSAGE_MAP.

Макрос DECLARE_MESSAGE_MAP розташовується в кінці оголошення класу, що використовує карту повідомлень.

Макроси BEGIN_MESSAGE_MAP і END_MESSAGE_MAP є операторні дужки, в які полягає карта повідомлень. Карта повідомлень повинна оголошуватися поза будь-якої функції або оголошення класу.

Макрос BEGIN_MESSAGE_MAP має два параметри - ім'я класу, власника карти повідомлень та ім'я базового класу.

Компоненти таблиці повідомлень

Для кожного стандартного повідомлення Windows визначений свій макрос у формі:

ON_WM_XXX (наприклад ON_WM_PAINT)

Ім'я макросу вказується в таблиці повідомлень без параметрів. Прототип функції-обробника такого повідомлення визначений. Ім'я завжди починається з префікса On, за яким слідує ім'я відповідного обробника Windows без префікса WM_, записане малими буквами. наприклад:

afx_msg void OnPaint ();

afx_msg void OnLButtonUp (UNIT nFlags, Cpoint point);

Елемент afx_msg перетвориться препроцесором в порожній рядок і нагадує про те, що це функція таблиці повідомлень.

Опис всіх обробників стандартних повідомлень Windows знаходяться у файлі afxwin.h.

Для обробки повідомлень від елементів управління застосовується макрос

ON_CONTROL (wNotifyCode, id, memberFn)

WNotifyCode - код повідомлення;

id - ідентифікатор елемента управління;

memberFn - довільне ім'я функції обробника, яка має бути елементом відповідного класу і мати вигляд:

afx_msg void memberFn ();

Крім цього макросу, спільного для всіх елементів керування та дочірніх вікон, для кнопок, елементів редагування, списку і комбінованого списку використовуються спеціальні макроси. наприклад:

ON_BN_CLICKED (id, memberFn);

та ін.

Для деяких елементів управління необхідно передавати в обробник параметри. У цьому випадку використовується повідомлення Windows не WM_COMMAND, а WM_NOTIFY і відповідний макрос Visual C + +:

ON_NOTIFY (wNotify, id, memberFn)

Прототип обробника:

Afx_msg void memberFn (NMHDR * pNotifyStruct, LRESULT * result);

Командні повідомлення Windows від меню, командних клавіш і кнопок панелей інструментів обробляються макросом:

ON_COMMAND (id, memberFn)

Id - ідентифікатор команди;

mMemberFn - ім'я обробника команди, прототип

afx_msg void memberFn ();

Команди поновлення виконуються за допомогою того ж механізму, що і для «звичайних» команд, але використовується макрос:

ON_UPDATE_COMMAND_UI (id, memberFn)

Обробники таких команд мають вигляд:

afx_msg void memberFn (CCmdUI * pCmdUI)