Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Механизм маршрутизации команд скрыт глубоко в MFC. Когда окно-рамка получает сообщение WM_COMMAND, оно вызывает виртуальную функцию OnCmdMsg, которая есть у всех подклассов CCmdTarget и именно с нее начинается процедура маршрутизации. В CFrameWnd функция OnCmdMsg реализована примерно так:
BOOL CFrameWnd::OnCmdMsg(...) { // Сначала пытаемся обработать сообщение в активном виде CView* pView = GetActiveView(); if ( pView!= NULL && pView->OnCmdMsg(...) ) return TRUE; // Затем пытаемся обработать сообщение в окне-рамке if ( CWnd::OnCmdMsg(...) ) return TRUE; // Если сообщение не обработано, то оно передается в объект-приложение CWinApp* pApp = AfxGetApp(); if ( pApp!= NULL && pApp->OnCmdMsg(...) ) return TRUE; return FALSE; } |
Если ни один объект, в т. ч. объект-приложение, сообщение не обработал, то CFrameWnd::OnCmdMsg возвращает FALSE и каркас приложения передаст сообщение функции ::DefWindowProc для обработки "по умолчанию".
Теперь ясно, что командные сообщения, получаемые окном-рамкой, направляются в активное окно-вид, а затем в объект-приложение. Но как они достигают объект-документ? Когда CFrameWnd::OnCmdMsg вызывает функцию OnCmdMsg у активного вида, то этот вид сначала пытается обработать сообщение самостоятельно. Но если обработчика сообщения в нем нет, то окно-вид вызовет функцию-член OnCmdMsg у своего документа. Если документ не может обработать сообщение, то он передает его объекту-шаблону документа. Путь командного сообщения, полученного окном-рамкой SDI-приложения, показан на рис. 9.2. Процедура маршрутизации прекращается, если один из объектов обработал сообщение, или, если обработки не было, то сообщение попадает в ::DefWindowProc.
Значение маршрутизации команд станет понятным, если вы посмотрите, как типичное приложение документ/вид обрабатывает команды меню, ускоряющих клавиш и панелей инструментов. По соглашению, команды FileÞNew, FileÞOpen и FileÞExit обрабатываются в объекте-приложении, в котором есть командные обработчики OnFileNew, OnFileOpen и OnAppExit. Команды FileÞSave и FileÞSave As обычно обрабатываются объектом-документом и в нем есть обработчики "по умолчанию" CDocument::OnFileSave и CDocument::OnFileSaveAs. Команды для включения/выключения панелей инструментов и строки состояния обрабатываются в окне-рамке с помощью функций-членов CFrameWnd, а большинство остальных типичных команд обрабатываются в окне-виде или в объекте-документе.
Когда вы создаете собственные обработчики сообщений, важно помнить, что маршрутизация выполняется только для командных сообщений и для обработчиков обновления. Остальные сообщения Windows, например, WM_CHAR, WM_LBUTTONDOWN, WM_CREATE или WM_SIZE должны обрабатываться в окне-получателе сообщения. Обычно сообщения мыши и клавиатуры поступают в окно-вид, а большинство остальных сообщений – в окно-рамку. Объект-документ и объект-приложение никогда не получают никаких сообщений, кроме командных.

Рис. 9.2. Маршрутизация командных сообщений, посылаемых окну-рамке SDI-приложения.
7.1 Стандартные командные идентификаторы и обработчики
При написании приложения документ/вид обычно нет необходимости самостоятельно писать обработчики для всех команд меню. CWinApp, CDocument, CFrameWnd и другие классы MFC содержат обработчики "по умолчанию" для типичных команд меню, вроде FileÞOpen и FileÞSave. Кроме того, каркас сгенерированного приложения по умолчанию обеспечивает связь команд с идентификаторами вроде ID_FILE_OPEN и ID_FILE_SAVE с обработчиками "по умолчанию".
В табл. 9.4 приведены часто используемые стандартные командные идентификаторы и соответствующие командные обработчики. В столбце "Установлен?" указано, надо ли добавлять макрос карты сообщений для этого сообщения или его обработчик уже установлен в каркасе приложения. Например, у команды ID_APP_EXIT обработчик не установлен, поэтому в карту сообщений класса приложения надо добавить запись:
ON_COMMAND( ID_APP_EXIT, СWinApp::OnAppExit ) |
Таблица 9.4. Стандартные командные идентификаторы и обработчики
Идентификатор команды | Пункт меню | Обработчик "по умолчанию" | Установлен? |
Меню Файл | |||
ID_FILE_NEW | New | CWinApp::OnFileNew | Нет |
ID_FILE_OPEN | Open | CWinApp::OnFileOpen | Нет |
ID_FILE_SAVE | Save | CDocument::OnFileSave | Да |
ID_FILE_SAVE_AS | Save As | CDocument::OnFileSaveAs | Да |
ID_FILE_PAGE_SETUP | Page Setup | Отсутствует | N/A |
ID_FILE_PRINT_SETUP | Print Setup | CWinApp::OnFilePrintSetup | Нет |
ID_FILE_PRINT | CView::OnFilePrint | Нет | |
ID_FILE_PRINT_PREVIEW | Print Preview | CView::OnFilePrintPreview | Нет |
ID_FILE_SEND_MAIL | Send Mail | CDocument::OnFileSendMail | Нет |
ID_FILE_MRU_FILE1_ | N/A | CWinApp::OnOpenRecentFile | Да |
ID_FILE_MRU_FILE16 | |||
ID_APP_EXIT | Exit | CWinApp::OnAppExit | Да |
Меню Правка | |||
ID_EDIT_CLEAR | Clear | Отсутствует | N/A |
ID_EDIT_CLEAR_ALL | Clear All | Отсутствует | N/A |
ID_EDIT_CUT | Cut | Отсутствует | N/A |
ID_EDIT_COPY | Copy | Отсутствует | N/A |
ID_EDIT_PASTE | Paste | Отсутствует | N/A |
ID_EDIT_PASTE_LINK | Paste Link | Отсутствует | N/A |
ID_EDIT_PASTE_SPECIAL | Paste Special | Отсутствует | N/A |
ID_EDIT_FIND | Find | Отсутствует | N/A |
ID_EDIT_REPLACE | Replace | Отсутствует | N/A |
ID_EDIT_UNDO | Undo | Отсутствует | N/A |
ID_EDIT_REDO | Redo | Отсутствует | N/A |
ID_EDIT_REPEAT | Repeat | Отсутствует | N/A |
ID_EDIT_SELECT_ALL | SelectAll | Отсутствует | N/A |
Меню Вид | |||
ID_VIEW_TOOLBAR | Toolbar | CFrameWnd::OnBarCheck | Да |
ID_VIEW_STATUS_BAR | Status Bar | CFrameWnd::OnBarCheck | Да |
Меню Окно (есть только в MDI приложениях) | |||
ID_WINDOW_NEW | New Window | CMDIFrameWnd::OnWindowNew | Да |
ID_WINDOW_ARRANGE | Arrange All | CMDIFrameWnd::OnMDIWindowCmd | Да |
ID_WINDOW_CASCADE | Cascade | CMDIFrameWnd::OnMDIWindowCmd | Да |
ID_WINDOW_TILE_HORZ | Tile Horizontal | CMDIFrameWnd::OnMDIWindowCmd | Да |
ID_WINDOW_TILE_VERT | Tile Vertical | CMDIFrameWnd::OnMDIWindowCmd | Да |
Меню Помощь | |||
ID_APP_ABOUT | About AppName | Отсутствует | N/A |
В MFC для некоторых команд есть стандартные обработчики обновления:
· CFrameWnd::OnUpdateControlBarMenu для команд ID_VIEW_TOOLBAR и ID_VIEW_STATUS_BAR;
· CMDIFrameWnd::OnUpdateMDIWindowCmd для команд меню Окно.
· CDocument::OnUpdateFileSendMail для ID_FILE_SEND_MAIL.
Классы-виды CEditView и CRichEditView содержат собственные командные обработчики для команд меню Правка, но в других окнах-видах их надо добавлять самостоятельно (если они нужны).
Для своих собственных команд меню не следует использовать стандартные идентификаторы и обработчики каркаса приложения. Для стандартных команд можно заменять обработчики по умолчанию на свои собственные. Т. е. вы можете пользоваться готовыми средствами каркаса в той мере, в которой они подходят для вашего приложения.
Литература
1) Microsoft Corporation. Разработка приложений на Microsoft Visual C++ 6.0. Учебный курс: Официальное пособие Microsoft для самостоятельной подготовки. М.: "Русская Редакция", 2000. (В этом учебном пособии приведены инструкции по использованию различных возможностей MFC и среды Visual C++ 6. Некоторым недостатком является отсутствие подробной описательной части, но удачные пошаговые инструкции позволяют отработать выполнение большого количества типичных операций в Visual C++).
2) Petzold C. Programming Windows. Microsoft Press. 1990. (Наверное, самая известная книга по программированию для Windows на уровне API)
3) Prosise J. Programming Windows with MFC. Microsoft Press. 1999. (В некотором смысле, аналог книги Petzold'а, но по программированию для Windows с использованием библиотеки классов MFC. Часть лабораторных работ и лекционного материала данного курса основаны на этой книге).
4) Toth V. Visual C++ 4 Unleashed. Sams Publishing, 1996 (Учебник по программированию для Windows с использованием Visual C++ версии 4.0. Рассчитан на достаточно опытных программистов. Часть глав посвящены описанию архитектуры Windows с точки зрения программиста).
5) Системное программирование в Windows 2000 для профессионалов. СПб: Питер, 2001. (В этой книге описан ряд средств, доступных в Windows 2000 на уровне API – технология COM, межпроцессное взаимодействие, работа с оболочкой и др. Интересно краткое и доступное введение в технологию COM, причем приведены исходные тексты программ, удачно иллюстрирующие описываемые понятия.)
6) Шеферд Дж. Программирование на Microsoft Visual C++ 6.0 для профессионалов. СПб: Питер, 2000. (Книга, напоминающая по стилю изложения пособие для самостоятельной подготовки. Подробная энциклопедия приемов практического программирования в Visual C++ и MFC.)
7) , Теплицкий -русский словарь по вычислительной технике, Интернету и программированию. М.: "Русская Редакция", 2000. (Толковый англо-русский словарь. В данном курсе на CD-ROM приведен перечень используемых терминов, сформированный в основном на основе этого словаря.)
8) Рихтер Дж. Windows для профессионалов: создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows. СПб: Питер, 2001. (Очень известная книга, в которой описаны различные вопросы программирования для 32-разрядных версий Windows 95/NT/2000 на уровне API.)
9) Тихомиров MFC. СПб: БХВ – Санкт-Петербург, 2000. (Подробное руководство начального уровня по библиотеке MFC, в основном имеющее справочный характер.)
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |


