TN006: Повідомлення карти

Цієї записці описується MFC повідомлення карту об'єкт.

Проблема

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

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

Огляд

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

Визначення мапі повідомлення

DECLARE_MESSAGE_MAP макрос заявляє трьох членів для класу.

Цей макрос має бути поміщені в декларації будь-який клас, за допомогою карти повідомлення. За угодою це в кінці класу декларації. Наприклад:

клас CMyW&nd: Громадська CMyParentWndClass
{
 nbsp;  / / мої речі...

Охоронювані:
    //{{AFX_MSG(CMyWnd)
    afx_msg до втрати OnPaint();
    //}}AFX_MSG

DECLARE_MESSAGE_MAP()
}

Це формат, породжених AppWizard і ClassWizard, коли вони створюють новий класів. В / / {{і / /}} дужки необхідних для ClassWizard.

Карта повідомлення таблиці визначається з набором макрос, який розширює повідомлення карта записів. Таблиця починається з BEGIN_MESSAGE_MAP макросів виклику, який визначає клас, який обробляється цю карту повідомлення і батьківського класу, які передаються невиправного повідомлень. Таблиця закінчується END_MESSAGE_MAP макрос виклику.

Між ці два макрос заклики є запис для кожного повідомлення буде займатися цю карту повідомлення. Кожне повідомлення стандартний Windows має макросів форми ON_WM_xxx (де xxx – ім'я повідомлення), що створює запис для цього повідомлення.

Стандартні функції підпис визначено для розпакування параметри кожного повідомлення Windows та забезпечення безпеки типу. Ці підписи можна знайти у файлі AFXWIN.H в декларації CWnd. Кожен з них позначені словом afx_msg для спрощення ідентифікації.

Примітка   ClassWizard потрібно використовувати ключове afx_msg у заявах обробника карта, ваші повідомлення.

Ці підписи функції були отримані за допомогою простих конвенції. Ім'я функції завжди починається з "На". Далі йдуть ім'я з WM_, видалити, повідомлення Windows і тільки перша літера кожного слова заголовної. Замовлення параметрів є wParam, а потім LOWORD (lParam) , то HIWORD(lParam). Не передаються не використовуються параметри. Ручки, що загорнуті MFC класи перетворюються на посилання на відповідні об'єкти MFC. Наступний приклад показує, як обробляти повідомлення WM_PAINT і призвести до CMyWnd:: OnPaint функцію

BEGI&N_MESSAGE_MAP (CMyWnd, CMyParentWndClass)
 nbsp;  //{{AFX_MSG_MAP(CMyWnd)
    ON_WM_PAINT()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

Повідомлення карта таблиці повинні бути визначені виходить за рамки будь-які визначення функцій та класів. Це не повинні бути розміщені всередині блоку зовнішній "С".

Примітка   ClassWizard буде редагування повідомлення карта елементів, що знаходяться між на / / {{і / /}} коментар дужку.

Визначено користувачем Windows повідомлень

Повідомлення користувача може бути включена в повідомлення карти за допомогою макросу ON_MESSAGE . Цей макрос приймає повідомлення номер і член функції форми:

nbsp;   / / всередині клас декларації
    afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

Наприклад:
    # визначити WM_MYMESSAGE (WM_USER + 100)

BEGI&N_MESSAGE_MAP (CMyWnd, CMyParentWndClass)
    ON_MESSAGE (WM_MYMESSAGE, OnMyMessage)
END_MESSAGE_MAP()

У цьому прикладі ми встановити обробник для користувача повідомлення з Ідентифікатором повідомлення Windows, отриманих від на стандартний WM_USER база для користувача повідомлень. Ви може посилатися цей обробник з кодом, таких як:

CWnd * pWnd =...;
pWnd gt;SendMessage(WM_MYMESSA&GE)

Діапазон визначені користувачем повідомлення, використовуючи такий підхід має бути в діапазоні від WM_USER до 0x7fff.

Приміткаnbsp;  ClassWizard не підтримує введення O&N_MESSAGE обробника процедур з інтерфейсу користувача ClassWizard: потрібно вручну ввести їх від редактора Visual c + +. Як тільки введено, ClassWizard аналізу цих записів і дають змогу переглядати їх як будь-які інші записи повідомлення карта.

Зареєстрованих повідомлень Windows

На :: RegisterWindowMessage функція використовується для визначення нове вікно повідомлення, гарантованих бути унікальним по всій системі. Макрос ON_REGISTERED_MESSAGE використовується для обробки цих повідомлень. Цей макрос приймає на ім'я поблизу UINT змінна, яка містить зареєстрованих windows повідомлення ID. Наприклад

клас CMyWnd: Громадська CMyParentWndClass
{
готелю:
 nbsp;  CMyWnd();

//{{AFX_MSG(CMyWnd)
    afx_msg LRESULT OnFind(WPARAM wParam, LPARAM lParam);
    //}}AFX_MSG

DECLARE_MESSAGE_MAP()
};

статичний UI&NT БІЛЯ WM_FIND = RegisterWindowMessage("COMMDLG_FIND");

BEGIN_MESSAGE_MAP (CMyWnd, CMyParentWndClass)
    //{{AFX_MSG_MAP(CMyWnd)
    ON_REGISTERED_MESSAGE (WM_FIND, OnFind)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

Зареєстрованих Windows повідомлення Ідентифікатора змінної (WM_FIND у прикладі вище) повинна бути ПОБЛИЗУ змінної як здійснюється ON_REGISTERED_MESSAGE.

Діапазон визначені користувачем повідомлення, використовуючи такий підхід буде в діапазоні 0xC000 до 0xFFFF.

Приміткаnbsp;  ClassWizard не підтримує введення O&N_REGISTERED_MESSAGE обробника процедур з інтерфейсу користувача ClassWizard, необхідно вручну ввести їх з текстового редактора. Як тільки введено, ClassWizard аналізу цих записів і дають змогу переглядати їх як будь-які інші записи повідомлення карта.

Команда повідомлень

Повідомлення команду з меню і прискорювачі обробляються в повідомлення карти з ON_COMMAND макросів. Цей макрос приймає Ідентифікатор команди, а також функції-члена. Лише певні WM_COMMAND повідомлення з на wParam рівні для вказаної команди, ID обробляється член функції вказано в записі повідомлення карти. Команда обробника методи прийняти без параметрів і повернення недійсними. Макрос має форму:

 ON_COMMAND (id, memberFxn)

Команда update переадресовується через той же механізм, що обробники ON_COMMAND . Замість цього використовується ON_UPDATE_COMMAND_UI макрос. Команди оновлення обробника методи взяти одного параметра, вказівник на об'єкт CCmdUI і повернення недійсними. Макрос має форму

ON_UPDATE_COMMAND_UI (id, memberFxn)

Додаткові форми команду повідомлення обробників доступна для Розширений використовує. ON_COMMAND_EX макрос замість цього використовуються та забезпечує розширеним набором функціональності ON_COMMAND . Розширений член команди обробника функції взяти одного параметра, UINT, що містить команди ID і повернутися до BOOL. BOOL повернення має бути вірним показують, обробляються команди, інакше маршрутизації буде продовжувати інші команди цільових об'єктів.

Приклади вище форм:

Також доступна для досвідчених користувачів є ON_COMMAND_RANGE і ON_COMMAND_RANGE_EX , які дозволяють вам обробляти ряду команд з однієї команди обробника. Зверніться до документації для отримання додаткових відомостей про ці макроси.

Приміткаnbsp;  ClassWizard підтримує створення обробників O&N_COMMAND і ON_UPDATE_COMMAND_UI , але не підтримує створення обробників ON_COMMAND_EX або ON_COMMAND_RANGE . Тим не менше, майстер клас буде розібрати і дозволяє переглядати всі три команди обробника варіанти.

Повідомлення про контроль

Повідомлення надіслані від дитини елементи керування до вікна мають додаткові біт інформації в їхньому повідомленні карта запис: ID елемента керування. Обробник повідомлення, зазначені у записі карти повідомлення називається, лише якщо (1 повідомлення код контролю (високий слова lParam), таких як BN_CLICKED, відповідає код повідомлення, зазначені у записі повідомлення карти і відповідає керування ID, зазначений у записі повідомлення карти (2) контроль ID (wParam).

Повідомлення про настроювані елементи керування можуть використовувати ON_CONTROL макрос для визначення записі карти повідомлення з кодом користувальницькі повідомлення. Цей макрос має форму

ON_CONTROL (wNotificationCode, id, memberFxn)

Для розширеного використання ON_CONTROL_RANGE можна використовувати для обробки повідомлення певного елемента керування з діапазону від елементів керування з одного обробника.

ClassWizard не підтримує створення обробника ON_CONTROL або ON_CONTROL_RANGE в інтерфейсі користувача; потрібно вручну ввести їх текстовому редакторі. Після того як ввели, ClassWizard буде аналізувати ці записи і дають змогу переглядати їх як будь-які інші записи карта повідомлення.

Звичайні елементи керування Windows використовувати більш потужний WM_NOTIFY для складних керування сповіщення. Ця версія MFC має пряму підтримку для цього нового повідомлення з ON_NOTIFY і ON_NOTIFY_RANGE макроси. Зверніться до документації для отримання додаткових відомостей про ці макроси.

Технічні примітки за номером |nbsp; Технічні примітки за категоріями

Index