Це технічні записці описується повідомлення відбиття, нова функція у MFC 4.0. Він також містить вказівки для створення простих багаторазові елемент керування, який використовує відображенням повідомлення.
Цього технічне Примітка не обговорювати відображення повідомлення, як він ставиться до елементів керування ActiveX (колишня назва елементи керування OLE). Будь ласка, перегляньте статтю елементи керування ActiveX: Subclassing керування Windows в Visual C++ програміста керівництво.
Що таке відображення повідомлення?
Контроль Windows часто надсилаються сповіщення про своїх батьків Windows. Наприклад, багато елементів керування надсилання керування кольором сповіщення (WM_CTLCOLOR або один з її варіанти) до своїх батьків, щоб дозволити щоб батько поставку пензель для картини фон елемента керування.
У Windows і у MFC до версії 4.0 вікна батьків, часто у діалоговому вікні, несе відповідальність за обробку цих повідомлень. Це означає, що код для обробки повідомлення має бути у вікні батьківського класу, і що вона має бути повторений у кожному класі, що необхідно обробити це повідомлення. У випадку вище кожен діалоговому вікні, що хотів елементи керування з тлом доведеться обробляти сповіщення керування кольором. Було б набагато легше, для повторного використання коду, якщо керування клас може бути написано, що буде обробляти власний колір фону.
У MFC 4.0, старі механізм як і раніше працює — батьківського windows може обробляти повідомлення про. Крім того, однак, MFC 4.0 спрощує повторне використання шляхом надання функцію називають "повідомлення роздумів", дозволяє такі повідомлення про саміті у вікно керування дитини або вікна батьків, або в обох. У наведеному кольору фону керування тепер можна написати керування клас, який встановлює свій власний колір фону з обробки відбивається WM_CTLCOLOR повідомлення — не покладатися на батьків. (Зауважте, що з відображенням повідомлення реалізується MFC, не Windows, батьків клас вікна повинні бути визначені з CWnd для відображення повідомлення на роботу).
Старі версії MFC зробив щось схоже на відображення повідомлення шляхом надання віртуальних функцій кілька повідомлень, наприклад, повідомлення для власника звертається списки (WM_DRAWITEMі так далі). Новий механізм відображенням повідомлення є узагальнена і послідовним.
Відображення повідомлення має зворотну сумісність з кодом написана для версії MFC до 4.0.
Якщо слід надати обробник для конкретного повідомлення, або для діапазону повідомлення, в класі батьківського вікна, він замінить відображено повідомлення обробників для одного повідомлення, умови, що ви не викликати функцію обробник базового класу в свій власний обробника. Наприклад, якщо ви впоратися WM_CTLCOLOR в діалоговому вікні клас, ваша обробка буде мати перевагу над будь-який обробників відбитого повідомлення.
Якщо у ваших батьків клас вікна, надано обробник для конкретного повідомлення WM_NOTIFY або діапазон WM_NOTIFY повідомлень, обробника буде називатися тільки, якщо дитина контролю, надсилання повідомлень, не має обробник відбитого повідомлення через ON_NOTIFY_REFLECT(). Якщо ви використовуєте ON_NOTIFY_REFLECT_EX() ваше повідомлення карті, обробника повідомлення може або не може дозволити вікна батьків, щоб обробляти повідомлення. Якщо обробник повертає TRUE, повідомлення буде здійснюватися батьків, а також під час виклик, який повертає FALSE не дозволяє батькам можливість обробляти її. Примітка оброблення відбитого повідомлення перш ніж на сповіщенні.
Коли надсилається повідомлення WM_NOTIFY , контроль пропонується перша можливість обробляти її. Якщо відбитого повідомлення надіслано, батько вікно має перший можливість обробляти її і контроль отримаєте повідомлення, що відбивається. Щоб зробити це, він повинен функцію обробник і відповідний запис в елемент керування мапу класів повідомлення.
Повідомлення карта макрос відбитого повідомлень є дещо відрізняється, ніж для регулярного сповіщення: вона має _REFLECT додається до звичайної імені. Наприклад, для обробки повідомлення WM_NOTIFY в батьківському, використовується макрос ON_NOTIFY батьків повідомлення карті. Для обробки відбитого повідомлення в елементі керування дитини, використання ON_NOTIFY_REFLECT макрос у дитини керування повідомлення карта. У деяких випадках параметри є різними, як добре. Зверніть увагу, що ClassWizard можна додати записи повідомлення карта для вас та надати скелет функцію впровадження з правильні параметри.
Див TN061: ON_NOTIFY і WM_NOTIFY повідомлень для отримання інформації про нові повідомлення WM_NOTIFY.
Повідомлення-карти і то прототипи функцій обробника відбитого повідомлень
Обробляти сповіщення відбитого контролю, використовувати макроси повідомлення карта та функції прототипів, перераховані в таблиці нижче.
ClassWizard можна додати ці записи повідомлення карта для вас та надати скелет функції реалізацій. Див визначення обробник повідомлення для відображення повідомлення в Visual C++ програміста керівництво для отримання відомостей про визначення обробників для відображення повідомлення.
Для перетворення з назву повідомлення, ім'я відбитого макросу, prepend ON_ та додавання _REFLECT. Наприклад, WM_CTLCOLOR стає ON_WM_CTLCOLOR_REFLECT. (Щоб побачити, які повідомлення можуть бути відображені, зробити протилежної перетворення на макрос записи в таблиці нижче.)
Три винятки із правила вище, є наступні:
У кожному з вище особливі випадки необхідно вказати ім'я функції-члена обробника. В інших випадках ви повинні використовувати стандартні ім'я для вашого функцію обробник.
Значення параметрів і значень до повернення функцій документально під або ім'я функції, або ім'я функції з на використовувати. Наприклад, CtlColor описано у OnCtlColor. Кількох обробників відбитого повідомлення потрібно менше параметрів, ніж аналогічні обробників у вікні батьків. Просто збігаються з іменами у нижченаведеній таблиці з назвами формальними показниками в документації.
| Записі карти | Прототип функції |
| ON_CONTROL_REFLECT ( wNotifyCode, memberFxn ) | afx_msg недійснимиmemberFxn ( ); |
| ON_NOTIFY_REFLECT ( wNotifyCode, memberFxn ) | afx_msg недійснимиmemberFxn(NMHDR * pNotifyStruct, LRESULT * результат ); |
| ON_UPDATE_COMMAND_UI_REFLECT ( memberFxn ) | afx_msg недійснимиmemberFxn(CCmdUI * pCmdUI ); |
| ON_WM_CTLCOLOR_REFLECT) | afx_msg HBRUSH CtlColor (CDC * pDC, UINT nCtlColor ); |
| ON_WM_DRAWITEM_REFLECT) | afx_msg до втрати DrawItem (LPDRAWITEMSTRUCT lpDrawItemStruct ); |
| ON_WM_MEASUREITEM_REFLECT) | afx_msg до втрати MeasureItem (LPMEASUREITEMSTRUCT lpMeasureItemStruct ); |
| ON_WM_DELETEITEM_REFLECT) | afx_msg до втрати DeleteItem (LPDELETEITEMSTRUCT lpDeleteItemStruct ); |
| ON_WM_COMPAREITEM_REFLECT) | afx_msg int CompareItem (LPCOMPAREITEMSTRUCT lpCompareItemStruct ); |
| ON_WM_CHARTOITEM_REFLECT) | afx_msg int CharToItem (UINT nKey, UINT nIndex ); |
| ON_WM_VKEYTOITEM_REFLECT) | afx_msg int VKeyToItem (UINT nKey, UINT nIndex ); |
| ON_WM_HSCROLL_REFLECT) | afx_msg до втрати HScroll (UINT nSBCode, UINT nPos ); |
| ON_WM_VSCROLL_REFLECT) | afx_msg до втрати VScroll (UINT nSBCode, UINT nPos ); |
| ON_WM_PARENTNOTIFY_REFLECT) | afx_msg до втрати ParentNotify (UINT повідомлень, LPARAM lParam ); |
ON_NOTIFY_REFLECT і ON_CONTROL_REFLECT макроси є варіанти, що дозволяє обробляти певне повідомлення більше одного об'єкта (наприклад, елемент керування та його батьків).
| Записі карти | Прототип функції |
| ON_NOTIFY_REFLECT_EX ( wNotifyCode, memberFxn ) | afx_msg BOOLmemberFxn(NMHDR * pNotifyStruct, LRESULT * результат ); |
| ON_CONTROL_REFLECT_EX ( wNotifyCode, memberFxn ) | afx_msg BOOLmemberFxn ( ); |
Обробка Reflected повідомлення: Приклад багаторазового контролю
Цей простий приклад створює багаторазові управління, що називають CYellowEdit . Елемент керування працює так само, як регулярні редагувати елемент керування, за винятком того, що відображатиметься чорний текст на жовтому фоні. Було б легко додати функцій-членів, що дозволило б на CYellowEdit елемента керування для відображення різних кольорів.
Спробуйте цей приклад, виконайте такі дії.:
Ви повинні мати застосунок, в якому розробити багаторазового контролю. Якщо існуючий додаток для використання, створити діалогове вікно на основі додатків за допомогою AppWizard.
CYellowEdit на основі по кредиту. Залиште поле "Додати до компонента галерея", перевірені.CYellowEdit клас. Перші два будуть COLORREF змінні провести колір тексту та колір тла. Третій буде CBrush об'єкт, який буде проводити пензель для картини фон. CBrush об'єкт дозволяє вам створити пензель, один раз, просто посилання після цього і знищити пензля автоматично, коли в CYellowEdit знищені контролю.CYellowEdit::CYellowEdit()
{
m_clrText = RGB (0, 0, 0);
m_clrBkgnd = RGB (255, 255, 0);
m_brBkgnd.CreateSolidBrush (m_clrBkgnd);
}
CYellowEdit клас. Зверніть увагу, що знак рівності на назву повідомлення у списку повідомлень, ви можете впоратися вказує, що відображає повідомлення. Це описано в визначення обробник повідомлення для відображення повідомлення в Visual C++ програміста керівництво.ClassWizard додає такі повідомлення карта макрос і скелет функції для вас:
ON_WM_CTLCOLOR_REFLECT()
/ / Примітка: інший код буде між....
HBRUSH CYellowEdit::CtlColor(CDC* pDC, UINT nCtlColor) {
/ / TODO: будь-який атрибутів DC тут
/ / TODO: повернення не NULL пензля, якщо на
/ / батька обробник не має називатися
повернути значення NULL;
}
pDC-gt;SetTextColor (m_clrText); / / тексту
pDC - > SetBkColor (m_clrBkgnd); / / bkgnd тексту
повернення m_brBkgnd; / / ctl bkgnd
CYellowEdit елемента керування в діалоговому вікні заголовка файлу.CYellowEdit керування класом для інших проектів.Технічні примітки за номером |nbsp; Технічні примітки за категоріями