Цієї записці описується маршрутизації та відвантаження архітектура командування, а також додаткові теми в загальних вікно повідомлення маршрутизації.
Зверніться до керівництва Visual c + + програміст загальну інформацію про архітектур, описаних тут, особливо відмінність між повідомлень Windows, керування сповіщення та команд. Ця Примітка припускає, що ви добре знайомі з питань, які описані в друковану документацію і стосується лише дуже складні теми.
Команда маршрутизації та відвантаження MFC 1.0 функціональність розвивається до MFC 2.0 архітектура
Windows має WM_COMMAND повідомлення, що перевантажений надати сповіщення команди меню, клавіші виклику та елемент діалогового вікна сповіщень.
MFC 1.0, побудований на що мало, дозволяючи обробник команди (наприклад, "OnFileNew") у CWnd отриманих клас, щоб отримати називається у відповідь на конкретні WM_COMMAND. Це приклеєні разом із структури даних, називається карта повідомлення і результати в дуже простору ефективної команди механізм.
MFC 1.0 також надали додаткову функціональність для поділу керування сповіщення команду повідомлення. Команди представлені 16-бітний ID, іноді відомий як команди ID. Команди зазвичай починають з CFrameWnd (наприклад: виберіть меню або перекладених прискорювач) і отримати прямує до різних інших вікон.
MFC 1.0 використовується команда маршрутизації в обмежений почуття для здійснення з кілька інтерфейсом (MDI). (З вікна MDI кадр делегувати команд до її активного вікна MDI дитини).
Ця функціональність узагальнені і розширена в MFC 2.0 дозволяє команд буде займатися ширший діапазон об'єктів (не тільки об'єкти вікон). Вона забезпечує більш формальний та Розширювана архітектура для маршрутизації повідомлень і повторно використовується команда цільової маршрутизації для не тільки обробки команд, а також для оновлення інтерфейсу користувача об'єкти (наприклад, пунктів меню і кнопки панелі інструментів), щоб відобразити поточну доступність команду.
Команда посвідчення
Посібнику Visual C++ програміста для пояснення команди маршрутизації та прив'язування процес. Технічне Примітка 20 містить інформацію про іменування ID.
Ми використовуємо загальні префікс "ID_" для команди ідентифікатори. Команда ідентифікатори є gt; = 0x8000. Лінії або стану рядок повідомлень буде показувати опис командний рядок, якщо є STRIN>ABLE ресурс з однакові ідентифікатори як команди ID.
Ресурсами вашої програми команда ID можна з'являється в декількох місцях:
У вихідному коді вашої заявки команда ID можна з'являється в декількох місцях:
В даний час тільки реалізації у MFC, яка вимагає команда ідентифікатори бути gt; = 0x8000 є здійснення &GOSUB діалогів/команди.
GOSUB команди, за допомогою команди архітектури в діалогових вікнах
Команда архітектура маршрутизації і сприятливою команди добре працює з рамка вікна, пунктів меню, кнопки панелі інструментів, кнопки панелі діалогове вікно, інші регулятор тактів та інших елементів інтерфейсу користувача, призначені для оновлення на попит і маршрут команди або контролювати посвідчення до основної команди цілі (зазвичай основні рамки вікна). Цієї мети основної команди може маршрут сповіщення команди або елемента керування на інші команди цільових об'єктів, відповідно.
Діалогове вікно (модальних або немодальною) можуть отримати вигоду від деяких функцій архітектури команду призначення діалоговому контролю, ID елемента керування до відповідної команди ID. Підтримку діалогів не відбувається автоматично, так що ви, можливо, доведеться написати додатковий код.
Зауважимо, що за всі ці функції працювати належним чином, команда ідентифікаторів повинні бути gt; = 0x8000. Оскільки багато діалоги може отримати перенаправлено на той же кадр, Загальні команди повинні бути > = 0x8000, у той час,-поділився IDC, у конкретних діалог має бути < = 0x7FFF.
Ви можете розмістити Звичайна кнопка в звичайному модальне діалогове вікно з IDC кнопку Встановити ID відповідної команди. У разі вибору кнопки, власник діалоговому вікні (зазвичай основні рамки вікна) отримує команди, як і будь-які інші команди. Це називається GOSUB команда зазвичай використовується довести до іншого діалогове вікно (GOSUB першому діалоговому вікні).
Також можна викликати функцію CWnd::UpdateDialogControls ваш діалог і передати його адресу основного рамки вікна. Цю функцію буде ввімкнуто або вимкнути ваш діалоговому контролю на основі того, вони мають команда обробників у кадрі. Ця функція викликається автоматично для вас для керування барів у вашу заявку простою цикл, але ви повинні викликати його безпосередньо для нормального діалогові вікна, що ви хочете, щоб ця функція.
Коли називається ON_UPDATE_COMMAND_UI
Підтримання включений/перевірити стан пунктів меню всі програми весь час може бути ресурсомістких обчислень дорогих проблема. Поширений метод є увімкнути/перевірки пунктів меню, тільки тоді, коли користувач вибирає спливаюче вікно. Здійснення MFC 2.0 CFrameWnd обробляє повідомлення WM_INITMENUPOPUP і використовує маршрутизації архітектура командування для визначення держави меню через ON_UPDATE_COMMAND_UI обробників.
CFrameWnd також обробляє повідомлення WM_ENTERIDLE , описати поточний меню виділеного елемента на статус бар (лінія повідомлення).
Структура меню додатка, виправив Visual C++, використовується для потенційних команд в WM_INITMENUPOPUP час. ON_UPDATE_COMMAND_UI обробників можна змінити стан або текст меню, або для розширеного використання (наприклад, файл MRU список або спливаючому меню OLE дієслів), насправді змінити структуру меню перед звертається до меню.
Ж роду ON_UPDATE_COMMAND_UI обробки робиться панелей інструментів (і інші регулятор тактів) коли застосунок входить її простою циклі. Переглянути Клас бібліотеки посилання і технічних примітку 31 додаткові відомості на панелі керування.
Вкладені спливаюче меню
Якщо ви використовуєте вкладених меню структури, ви помітите, що називається ON_UPDATE_COMMAND_UI обробник для першого елемента меню у що з'явилося у двох різних випадках.
Спочатку вона називається для меню, сама по собі. Це необхідно, оскільки спливаюче меню не мають посвідчень, і ми використовуємо ID першого елемента меню спливаюче вікно для позначення всієї спливаюче вікно. У цьому випадку m_pSubMenu член змінної CCmdUI об'єкта буде не NULL і буде вказувати на меню.
По-друге, вона називається перед спливаюче вікно, пунктів меню, щоб бути звернено. У цьому випадку ID відноситься тільки до першого пункту меню, і m_pSubMenu член змінної CCmdUI об'єкта буде NULL.
Це дає змогу увімкнути спливаючих відрізняється від його пунктів меню, але вимагає, що ви пишете код деякі меню. Наприклад, у вкладених меню з таких структури:
Filegt;
Новий >
Лист (ID_NEW_SHEET)
Діаграма (ID_NEW_CHART)
ID_NEW_SHEET і ID_NEW_CHART команд можна самостійно увімкнено або вимкнуто. Спливаюче меню "Новий" повинен бути включений, якщо будь-який з двох увімкнуто.
Обробник команди для ID_NEW_SHEET (першої команди у що з'явилося) буде виглядати приблизно так:
недійсним CMyApp::OnUpdateNewSheet (CCmdUI * pCmdUI)
{
nbsp; Якщо (pCmdUI - > m_pSubMenu! = NULL)
{
/ / дозволити весь меню для "Новий" аркуші та діаграми
BOOL bEnable = m_bCanCreateSheet | | m_bCanCreateChart;
/ / CCmdUI::Enable є ні ОП в цьому випадку, тому ми
/ / необхідно зробити те, що він зробив би.
pCmdUI - > m_pMenu - > EnableMenuItem (pCmdUI - > m_nIndex,
MF_BYPOSITION |
(bEnable? MF_ENABLED: (MF_DISABLED | MF_GRAYED)));
повернення;
}
/ / в іншому разі просто команди нового аркуша
pCmdUI - > Enable(m_bCanCreateSheet);
}
Обробник команди для ID_NEW_CHART б нормального оновлення команду обробника і подивитися, що щось на зразок:
недійсним CMyApp::OnUpdateNewChart (CCmdUI * pCmdUI)
{
nbsp; pCmdUI - > Enable(m_bCanCreateChart);
}
ON_COMMAND і ON_BN_CLICKED
Повідомлення карти для ON_COMMAND і ON_BN_CLICKED вони те ж саме. MFC командування і управління сповіщень маршрутизації механізм тільки використовує команди ID, щоб вирішити, де маршрут до. Керування сповіщення з керування повідомлення код з нуля (BN_CLICKED) інтерпретуються як команди.
Додаткові примітки: насправді, всі повідомлення про керування пройти через ланцюгу обробника. Тому це технічно можливо для вас, щоб написати обробник керування сповіщення для сказати EN_CHANGE у ваш документ клас. Це не як правило доцільним, оскільки практичні застосування цієї функції, є кілька, функція не підтримується на ClassWizard та використання засобу може призвести до крихкою код.
Вимкнення автоматичного відключення кнопку елементи керування
Якщо розташувати кнопку управління на діалоговому бар або в діалоговому використання, коли ви телефонуєте CWnd::UpdateDialogControls на свій власний, ви помітите, що кнопки, яка не є ON_COMMAND або ON_UPDATE_COMMAND_UI обробників буде автоматично вимкнуто для вас на рамках. У деяких випадках не потрібно буде мати обробник, але ви хочете ", щоб залишаються увімкнутими. Найпростіший спосіб досягти цього, це додати манекен команда обробник (легко зробити з ClassWizard), і нічого не в ньому.
Вікно повідомлення маршрутизації
Нижче описано деякі додаткові розділи на MFC класи і як Windows маршрутизацію повідомлення і теми, інші наслідки їх. Лише коротко описано інформація тут. Зверніться до Класу бібліотеки посилання для докладної інформації про громадськості API. Будь ласка, зверніться до бібліотеки MFC вихідного коду для отримання додаткової інформації про деталі реалізації.
Будь ласка, зверніться до технічної Примітка 17 для докладної інформації про очищення вікон, дуже важливою темою для всіх CWnd-класи, отриманих.
CWnd питання
Впровадження член функція CWnd::OnChildNotify забезпечує потужний та розширюваний архітектури для дитини windows (також відомі як елементи керування) гачок або в іншому повідомили повідомлень, команди і контроль сповіщення, що йдуть до своїх батьків (або "власник"). Якщо дочірнього вікна (/ керування) є об'єктом C++ CWnd собі, віртуальної функції OnChildNotify називається спочатку з параметрами з вихідного повідомлення (тобто, структура MSG ). Вікна дитини можна залишити повідомлення в спокої, з'їсти його або змінити повідомлення для батьків (рідко).
За замовчуванням реалізація CWnd обробляє такі повідомлення та використовує OnChildNotify гачок, щоб дозволити дитині windows (елементи керування), щоб отримати перші тріщини в повідомлення:
Ви помітите, гачок OnChildNotify використовується для зміни власника нічия повідомлень на self-draw повідомлень.
На додаток до OnChildNotify гачок прокручування повідомлення повинні подальшого маршрутизації поведінки. Будь ласка, дивіться нижче для більш докладної інформації про смуги прокручування та джерела, WM_HSCROLL і WM_VSCROLL повідомлень.
CFrameWnd питання
CFrameWnd клас забезпечує більшу частину команди маршрутизації та інтерфейс користувача оновлення реалізації. Це в основному використовується для основних рамки вікна програми (CWinApp::m_pMainWnd), але застосовується до всіх рамка вікна.
Основні рамки вікна вікні панель з меню і батьківського рядка стану або повідомлення лінії. Будь ласка, зверніться до обговорення зазначених на команду маршрутизації і WM_INITMENUPOPUP.
CFrameWnd клас забезпечує управління активне подання. Такі повідомлення надіслано через активне подання:
CMDIFrameWnd/CMDIChildWnd питання
Як MDI рамка вікна класи, що випливають з CFrameWnd і, таким чином обидва доступні для ж роду команда маршрутизації та інтерфейс користувача оновлення, в CFrameWnd. У типових MDI додатки тільки основні рамки вікна (тобто, CMDIFrameWnd об'єкт) містить рядок меню та панелі статусу і тому основне джерело маршрутизації виконання команди.
Загальна схема маршрутизації те, що активного вікна MDI дитини отримує першої тріщини на команди. За замовчуванням PreTranslateMessage функції обробки прискорювач таблиць для обох windows MDI дитини (перший) і MDI кадр (другого), а також стандартні команди системи MDI прискорювачі звичайно обробляються TranslateMDISysAccel (останній).
Смуга прокручування питання
При роботі з прокрутки повідомлення (WM_HSCROLL/OnHScroll та/або WM_VSCROLL/OnVScroll ), ви повинні спробувати написати обробник код, так що це не покладатися на звідки повідомлення панелі прокрутки. Це не тільки загальні Windows питанням, оскільки прокручування повідомлення може прийти з правдою елементи керування, смуги прокручування або з WS_HSCROLL/WS_VSCROLL смуги прокручування, які є смуга елементи керування не прокручування.
MFC поширюється, щоб дозволити для елементів керування прокруткою Бар дитини "або" братів і сестер, вікна, будучи прокручується (насправді батько/дитина відносини між прокрутки та вікна, будучи прокручується може бути що завгодно). Це особливо важливо для спільної смузі прокручування з спліттер windows. Зверніться до технічної примітку 29 подробиці про виконання CSplitterWnd , у тому числі більше інформації з питань спільних прокручування Бар.
На боці записки є два CWnd похідних класів, де прокручування Бар стилі, визначені в створення час захоплених і не передано до Windows. Коли пройшов до створення звичайної, WS_HSCROLL і WS_VSCROLL можна самостійно встановити, але після створення змінювати не можна. Звичайно, ви повинні не безпосередньо перевірити або встановити в WS_?ВИДІЛІТЬ стиль біти вікна, що вони створили.
Для CMDIFrameWnd стилі прокручування Бар, ви передати у Створення або LoadFrame використовуються для створення на MDICLIENT. Якщо ви хочете, щоб прокручувати MDICLIENT області (як програма менеджер Windows) переконайтеся, що встановити смуга стилів обидва прокручування (WS_HSCROLL | WS_VSCROLL) для стилю, який використовується для створення CMDIFrameWnd.
Для CSplitterWnd прокручування панелі стилі застосовуються для регіонів спліттер смуги спеціальний спільний прокрутки. Для статичного спліттер windows ви зазвичай не встановити або стиль панелі прокрутки. Для динамічного спліттер windows ви зазвичай мають набір стилів напрямку буде розділити, тобто, WS_HSCROLL якщо ви можете розділити рядків, WS_VSCROLL , якщо ви можете розділити стовпців, смуги прокручування.
Технічні примітки за номером |nbsp; Технічні примітки за категоріями